当我
我可以看到(在CloudKit仪表板中)操作已发送到iCloud服务器并正确执行。
但是当我重新打开我的应用程序并在同一个CKContainer上调用fetchAllLongLivedOperationIDs(...)
时,我得到(没有错误并且) 0操作列表。
- > 如何检索中创建的操作(1.)?
我在一个简单的CRUD应用程序中尝试使用CloudKit(可以在GitHub上找到source)。该应用程序包含一个macOS应用程序和一个iOS应用程序。这两个应用程序共享大部分CloudKit代码。
参考文档声明从fetchAllLongLivedOperationIDs调用返回的数组是:
包含所有活动长寿命标识符的数组 操作。如果长期操作被取消或完成,那就是 不再是活动操作,并且不会包含其标识符 在这个数组中。
如果应用成功,操作即告完成 收到完成回调。
当我添加这样长寿命的操作时(虽然没有连接到互联网):
let deletion = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: [someRecordID])
deletion.isLongLived = true
deletion.start()
在我的github上的示例应用程序中可以找到here的代码
然后退出我的应用,连接到互联网并重新打开我的应用,以下抓取:(GitHub link)
cloudContainer.fetchAllLongLivedOperationIDs { operationIDs, error in
if let error = error {print(error)}
print(operationIDs.count)
}
当我在iPhone上试用时,返回0操作并且没有错误。
就像我之前说的那样,我也使用与macOS应用程序完全相同的代码。而且令人惊讶的是,在我执行相同的操作时,它在macOS上会返回1次操作。
好的,所以我想:也许出于某种原因,在iOS中操作完成(这意味着:应用程序成功接收完成回调,如文档中所述),而应用程序未运行(因为我自己退出了)。所以我重复整个序列(在摘要中描述),但是我手动保存了operationID,然后当我重新打开应用程序时,我通过其ID fetchLongLivedOperation(withID: ..., completionHandler: ...)
获取操作,以查看操作是否真的在背景。但是,不,我恢复了我的操作,它仍然被标记为活动(或在其debugDescription中编写的未完成)(GitHub link)。
因此,由于某种原因,操作仍处于活动状态,但我无法使用fetchAllLongLivedOperationIDs
进行检索。
这是一个已知的错误还是我做错了什么?
我正在使用
答案 0 :(得分:2)
看一下你的代码,看起来你没有在长寿命的CKOperations上设置longLivedOperationWasPersistedBlock
。
根据longLivedOperationWasPersistedBlock
documentation:
如果您的应用在调用此块之前退出,则
fetchAllLongLivedOperationIDs(completionHandler:)
方法的结果中不会包含长期存在的操作标识符。
如果您在持久存在长期操作之前强制退出应用程序(您目前没有检查 - 我建议指定该块和日志记录),这确实可能导致问题。