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

标签 ios swift icloud cloudkit

我正在将 CloudKit 添加到我的应用程序以启用 iCloud 同步。但是我的方法遇到了问题,该方法在私有(private)数据库上使用 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,我不知道为什么上面的闭包没有任何反应。

感谢您的帮助。

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

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

最佳答案

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

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

关于iOS:CloudKit perform(query:) 什么都不做 - 闭包未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49036932/

相关文章:

iOS7 iphone rightBarButtonItem 标题未居中/显示不正确

iphone - 如何用项目构建ZBar SDK而不是使用静态库?

ios - 确定响应者链是否将处理一个 Action

ios - 导航 Controller 标题未显示?

iphone - 手动同步 iCloud

php - 从 php 服务器向 ios 设备发送多个推送通知

ios - 如何从 UITableViewController 中删除行

swift - 将两个 Cloud Firestore 集合查询到 1 个对象中

cocoa - 可以将 CoreData 与 iCloud 同步吗?

ios - 来自 iCloud/CloudKit 的序列号