Kentico Cloud Swift SDK 未返回项目
Kentico Cloud Swift SDK not returning items
我正在测试 Kentico Cloud Swift SDK return 某些 'article' 内容类型(我创建了其中两个并已发布)。
我正在使用描述的样板代码 here:
我得到的结果是:[Kentico Cloud] Getting items action has succeeded. Received nil items.
我的代码:
let client = DeliveryClient.init(projectId: <project id>, previewApiKey: <preview key>, secureApiKey: <secure key>, enableDebugLogging: true)
func getArticles(){
// Note: Using "items" as custom query returns all content items,
// but to map them to a single model, a filter is needed.
let customQuery = "items?system.type=article"
// More about strongly-typed models https://github.com/Kentico/cloud-sdk-swift#using-strongly-typed-models
client.getItems(modelType: Article.self, customQuery: customQuery) { (isSuccess, itemsResponse, error) in
if isSuccess {
// We get here and itemsResponse != nil but items == nil
if let articles = itemsResponse?.items {
for article in articles {
}
}
} else {
if let error = error {
print(error)
}
}
}
}
我相信此错误消息会在触发 ObjectMapper
以将 JSON 转换为 Article 对象之前出现。不过我可能是错的。
有人有什么想法吗?
更新
有趣的是,如果我像这样请求单个文章对象...
client.getItem(modelType: Article.self, itemName: <codename>) { (isSuccess, itemResponse, error) in
if isSuccess {
if let article = itemResponse?.item {
// Use your item here
}
} else {
if let error = error {
print(error)
}
}
}
...然后就可以了。我得到了 Article 对象。它只是要求所有失败的文章。
好的。这很奇怪。在通过请求单个项目检查 API 之后(请参阅上面 post 中的更新)并获得结果(哇)。现在看来原始代码(未更改)现在可以使用了。
我想知道数据传播并在 API 中可用是否需要一段时间?
谁知道呢。奇怪。
我今天晚些时候会调查这个问题,但是,根据您的描述,这可能是由于交付 API 项目准备延迟引起的 - 项目未与交付完全同步 API 还。在 publishing/unpublishing 项目或 creating/generating 项目之后,Delivery API 处理消息可能会有小的延迟,这可能会导致项目不可用。这种延迟可能是可变的——根据我的经验,它可能从几秒到 2-3 分钟不等。尽管如此,我还是要检查一下以确定。我会及时通知你的。
编辑:我很确定在您请求项目时,项目没有在交付 API 上同步和处理。 API 返回 200,这导致回调中的 isSuccess 为 true,但是,可能有 none 或只有可用项目的子集 - 我已经重现了此行为(下面的屏幕截图),尽管它是设计使然(事件中心中的 content/messages 必须异步处理)。
我还建议改进 Kentico Cloud 的文档以 mention/explain processing events queue messages from Event Hubs 可能造成的延迟。
只是为了确定 - 你能用你的 getArticles
自定义查询再试一次吗?
Edit2:回到你关于 ObjectMapper
的问题。这不仅仅是一条调试消息的错误,但是,调试消息中不应该 nil
而是 0
(零)。此消息来自:
private func sendGetItemsRequest<T>(url: String, completionHandler: @escaping (Bool, ItemsResponse<T>?, Error?) -> ()) where T: Mappable {
sessionManager.request(url, headers: self.headers).responseObject { (response: DataResponse<ItemsResponse<T>>) in
switch response.result {
case .success:
if let value = response.result.value {
let deliveryItems = value
if self.isDebugLoggingEnabled {
print("[Kentico Cloud] Getting items action has succeeded. Received \(String(describing: deliveryItems.items?.count)) items.")
}
completionHandler(true, deliveryItems, nil)
}
case .failure(let error):
if self.isDebugLoggingEnabled {
print("[Kentico Cloud] Getting items action has failed. Check requested URL: \(url)")
}
completionHandler(false, nil, error)
}
}
}
我正在测试 Kentico Cloud Swift SDK return 某些 'article' 内容类型(我创建了其中两个并已发布)。
我正在使用描述的样板代码 here:
我得到的结果是:[Kentico Cloud] Getting items action has succeeded. Received nil items.
我的代码:
let client = DeliveryClient.init(projectId: <project id>, previewApiKey: <preview key>, secureApiKey: <secure key>, enableDebugLogging: true)
func getArticles(){
// Note: Using "items" as custom query returns all content items,
// but to map them to a single model, a filter is needed.
let customQuery = "items?system.type=article"
// More about strongly-typed models https://github.com/Kentico/cloud-sdk-swift#using-strongly-typed-models
client.getItems(modelType: Article.self, customQuery: customQuery) { (isSuccess, itemsResponse, error) in
if isSuccess {
// We get here and itemsResponse != nil but items == nil
if let articles = itemsResponse?.items {
for article in articles {
}
}
} else {
if let error = error {
print(error)
}
}
}
}
我相信此错误消息会在触发 ObjectMapper
以将 JSON 转换为 Article 对象之前出现。不过我可能是错的。
有人有什么想法吗?
更新 有趣的是,如果我像这样请求单个文章对象...
client.getItem(modelType: Article.self, itemName: <codename>) { (isSuccess, itemResponse, error) in
if isSuccess {
if let article = itemResponse?.item {
// Use your item here
}
} else {
if let error = error {
print(error)
}
}
}
...然后就可以了。我得到了 Article 对象。它只是要求所有失败的文章。
好的。这很奇怪。在通过请求单个项目检查 API 之后(请参阅上面 post 中的更新)并获得结果(哇)。现在看来原始代码(未更改)现在可以使用了。
我想知道数据传播并在 API 中可用是否需要一段时间?
谁知道呢。奇怪。
我今天晚些时候会调查这个问题,但是,根据您的描述,这可能是由于交付 API 项目准备延迟引起的 - 项目未与交付完全同步 API 还。在 publishing/unpublishing 项目或 creating/generating 项目之后,Delivery API 处理消息可能会有小的延迟,这可能会导致项目不可用。这种延迟可能是可变的——根据我的经验,它可能从几秒到 2-3 分钟不等。尽管如此,我还是要检查一下以确定。我会及时通知你的。
编辑:我很确定在您请求项目时,项目没有在交付 API 上同步和处理。 API 返回 200,这导致回调中的 isSuccess 为 true,但是,可能有 none 或只有可用项目的子集 - 我已经重现了此行为(下面的屏幕截图),尽管它是设计使然(事件中心中的 content/messages 必须异步处理)。
我还建议改进 Kentico Cloud 的文档以 mention/explain processing events queue messages from Event Hubs 可能造成的延迟。
只是为了确定 - 你能用你的 getArticles
自定义查询再试一次吗?
Edit2:回到你关于 ObjectMapper
的问题。这不仅仅是一条调试消息的错误,但是,调试消息中不应该 nil
而是 0
(零)。此消息来自:
private func sendGetItemsRequest<T>(url: String, completionHandler: @escaping (Bool, ItemsResponse<T>?, Error?) -> ()) where T: Mappable {
sessionManager.request(url, headers: self.headers).responseObject { (response: DataResponse<ItemsResponse<T>>) in
switch response.result {
case .success:
if let value = response.result.value {
let deliveryItems = value
if self.isDebugLoggingEnabled {
print("[Kentico Cloud] Getting items action has succeeded. Received \(String(describing: deliveryItems.items?.count)) items.")
}
completionHandler(true, deliveryItems, nil)
}
case .failure(let error):
if self.isDebugLoggingEnabled {
print("[Kentico Cloud] Getting items action has failed. Check requested URL: \(url)")
}
completionHandler(false, nil, error)
}
}
}