我正在将CloudKit添加到我的应用中以启用iCloud同步。但是我的方法遇到问题,在私有数据库上使用perform方法执行查询。
我的方法工作正常,然后我改变了一些相关的方法(只是检查iCloud是否可用),突然我的执行方法什么也没做。什么都不是,我的意思是perform(query: )
闭包中没有任何东西被执行。我在第一行有断点,下一行有其他断点,但从未设法击中它们。
private static func getAppDetailsFromCloud(completion: @escaping (_ appDetails: [CloudAppDetails]?) -> Void) {
var cloudAppDetails = [CloudAppDetails]()
let privateDatabase = CKContainer.default().privateCloudDatabase
let query = CKQuery(recordType: APPID_Type, predicate: NSPredicate(format: "TRUEPREDICATE"))
privateDatabase.perform(query, inZoneWith: nil) { (records, error) in
if let error = error {
print(error)
completion(nil)
} else {
if let records = records {
for record in records {
let appId = record.object(forKey: APPID_ID_Property) as? Int
let isDeleted = record.object(forKey: APPID_ISDELETED_Property) as? Int
if let appId = appId, let isDeleted = isDeleted {
cloudAppDetails.append(CloudAppDetails(id: appId, isDeleted: isDeleted == 1))
}
}
completion(cloudAppDetails)
return
}
}
completion(nil)
}
}
我的问题从privateDatabase.perform
行开始,之后没有命中断点,我的执行转移到调用此函数的函数getAppDetailsFromCloud。没有错误...
这是我第一次实现CloudKit,我不知道为什么在上面的闭包中没有发生任何事情。
感谢您的帮助。
编辑:忘记提到这个metod曾经工作正常,我能够从iCloud获取记录。我没有对它进行任何编辑,现在它没有按照描述的那样工作:/
编辑2:当我在没有附带调试器的情况下运行应用程序时,一切都运行良好。我可以按预期在设备之间同步所有数据。当我尝试调试代码时,我再次没有从iCloud获取记录。
答案 0 :(得分:1)
在此处显示的完成处理程序中,如果没有错误且未找到任何结果,则执行将通过并安静地退出。因此,此处发生了两种可能的情况:查询未运行或查询未找到任何结果。我按顺序执行以下调查步骤:
com.apple.dev.icloud-container-environment
。如果此密钥不存在,那么xcode的构建将利用开发环境。如果设置了此键,则xcode的构建将访问此键指向的环境。 (从Testflight或应用程序商店安装此应用程序的用户将始终使用生产环境。).perform
行上。如果没有按预期调用查询,那么你需要先在调用堆栈中查看...谁应该调用这个函数?.perform
,则在else
语句中添加if let record
。在else块中放置一个断点。如果触发,则查询已运行但未找到任何记录。答案 1 :(得分:1)
The closure executes asynchronously and usually you need to wait few seconds.
Take into account you can't debug many threads in same way as single. Bcs debugger will not hit breakpoint in closure while you staying in your main thread.
答案 2 :(得分:0)