iOS:CloudKit perform(query:) 什么都不做 - 闭包没有执行

Fil*_*lip 5 ios icloud swift cloudkit

我正在将 CloudKit 添加到我的应用程序以启用 iCloud 同步。但是我的方法遇到了问题,即在私有数据库上使用执行方法执行查询。

我的方法运行良好,然后我更改了一些相关方法(只需检查 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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题从privateDatabase.perform一行开始,之后没有断点被击中,我的执行移动到调用这个 getAppDetailsFromCloud 的函数。没有错误...

这是我第一次实现 CloudKit,我不知道为什么上面的闭包没有任何反应。

感谢帮助。

编辑:忘了提到这个方法过去工作正常,我能够从 iCloud 获取记录。我没有对它进行任何编辑,现在它不像描述的那样工作:/

编辑 2:当我在没有附加调试器的情况下运行应用程序时,一切正常。我可以按预期同步设备之间的所有数据。当我尝试调试代码时,我再次没有从 iCloud 获得任何记录。

Thu*_*unk 2

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

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