如何确定CloudKit区域是否已经存在

7
要在私有CKRecordZone中添加CKRecord,您需要确保该区域已存在。
但这是否意味着每次我需要插入记录时都需要使用fetchAllRecordZonesWithCompletionHandler获取所有区域并查找我的区域是否存在?这不是很有效率。
采取什么最好的策略?
我看到的大多数示例都展示了如何创建一个区域并在其中添加记录。但你不会每次创建区域,也不能假设它已经存在...
如果该区域尚未创建,则下面的代码将失败。
let customZone = CKRecordZone(zoneName: self.zoneName!)
// Create a CKRecord
let lessonRecord = CKRecord(recordType: self.recordType, zoneID: customZone.zoneID)

感谢您的帮助。
2个回答

10
要查看特定区域是否存在,请使用CKFetchRecordZonesOperation并仅传递一个记录区域ID。
如果您的代码设置正确,则只需要执行此操作一次。
创建表示记录区域的类。此类应执行给定区域的所有CloudKit操作。当您为特定区域初始化此类的实例时,可以检查该区域是否存在。如果不存在,则创建该区域。然后,每次需要读取或写入该区域的数据时,都使用该区域助手类的特定实例。
当然,每个读取和写入操作都需要检查错误结果,以检查CKErrorZoneNotFound错误。出现这样的错误可能意味着该区域已从应用程序的另一副本中删除。

这对我来说有些奇怪。为什么我们不能直接在仪表盘上创建区域?这是否意味着我们可以从我们应用程序的dev版本中创建一个区域,然后删除该代码,并且在发布构建中再也不使用创建区域代码,只是假设该区域存在?(也不使用任何删除应用程序中区域的方法) - Jonny
区域仅存在于私人数据库中。您无法预先填充某人私人数据库中的区域或记录。它们必须为使用您的应用程序的每个用户创建。 - Duzmac
@Jonny 在开发版本中创建一个区域是没有任何好处的。1)该区域只存在于您自己的开发私有数据库中。2)该区域在生产私有数据库中不存在。 - rmaddy
啊,好的,抱歉,当然,是的,那很有道理。嗯,准确地说,区域也存在于共享数据库中。 - Jonny

0
另一种避免检查区域是否存在的方法是在尝试向不存在的区域上传记录时处理错误消息。由于大多数记录在上传时会成功,这似乎更有效率。
database.save(record) { record, error in
    if record != nil, error == nil {
        print("** Saved new record in iCloud")
    } else {
        if let error = error as? CKError, error.code == .zoneNotFound {
            self.createNewZone(zone: cZone)
        }
    }
}

检查错误的本地化描述是一个糟糕的解决方案。正确的解决方案是检查错误的代码。if let error = error as? CKError, error.code == .zoneNotFound {。在创建区域后,不要忘记重新保存失败的记录。 - HangarRash
我同意。我先尝试查找.code,但是出现了一个错误(类型'any Error'的值没有成员'code')。我漏掉了as? CKError。谢谢你的纠正。 - Markv07

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接