iOS:CloudKit执行(查询:)不执行任何操作 - 关闭未执行

时间:2018-02-28 19:13:42

标签: ios swift icloud cloudkit

我正在将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获取记录。

3 个答案:

答案 0 :(得分:1)

在此处显示的完成处理程序中,如果没有错误且未找到任何结果,则执行将通过并安静地退出。因此,此处发生了两种可能的情况:查询未运行或查询未找到任何结果。我按顺序执行以下调查步骤:

  1. 检查.entitlements文件中的密钥com.apple.dev.icloud-container-environment。如果此密钥不存在,那么xcode的构建将利用开发环境。如果设置了此键,则xcode的构建将访问此键指向的环境。 (从Testflight或应用程序商店安装此应用程序的用户将始终使用生产环境。)
  2. 在Web浏览器中打开cloudkit仪表板,并验证您期望的记录确实存在于步骤1指示的环境中以及您期望的容器中。如果记录不存在,那么您就已经找到了问题。
  3. 如果记录在仪表板中按预期显示,则将断点放在.perform行上。如果没有按预期调用查询,那么你需要先在调用堆栈中查看...谁应该调用这个函数?
  4. 如果按预期调用.perform,则在else语句中添加if let record。在else块中放置一个断点。如果触发,则查询已运行但未找到任何记录。
  5. 如果在上述步骤之后,您发现完成处理程序绝对没有执行,则表明查询格式错误。尝试使用cloudkit仪表板手动运行查询并观察结果。

答案 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.

enter image description here

答案 2 :(得分:0)

2019年,我在处理CloudKit任务时遇到此问题。 Thunk选择的答案没有帮助我,所以我想我将在这里分享我的魔力。我想到了删除断点并打印results的想法。而且有效。但是我仍然需要在闭包内部使用断点。好吧,我要做的是重新启动Xcode。您知道iOS开发中的演练,如果不正确,请重新启动Xcode,重新连接设备,然后执行其他操作。

enter image description here