1

我基本上是在搞乱 CloudKit。我有 2 个问题需要帮助/教育。

(1) 当我尝试在关闭 WiFi 的模拟器中运行以下代码(模拟网络不可用)时,我希望它会抛出网络不可用错误。但是,cloudKit 不会抛出任何错误,该函数也不会执行任何操作,即不会执行 modifyRecordZonesCompletionBlock 内的任何一个打印语句

self.container = CKContainer.default()
self.privateDB = self.container.privateCloudDatabase
let createZoneGroup = DispatchGroup()

createZoneGroup.enter()

let createZoneOperation = CKModifyRecordZonesOperation(recordZonesToSave: [customZone], recordZoneIDsToDelete: [])

createZoneOperation.modifyRecordZonesCompletionBlock = { (saved, deleted, error) in
if let theerror = error {
// Need to handle error
    print("Create Custom zone error \(theerror)")
} else {
    print("Custom Zone created")
}
    createZoneGroup.leave()
}

createZoneOperation.qualityOfService = .background
self.privateDB.add(createZoneOperation)

但是,当我将 to 更改createZoneOperation.qualityOfServicedefaultoruserInitiated时,它会抛出一个错误(如下),这是预期的行为。为什么是这样?它只是模拟器异常还是抛出云套件错误与服务的操作质量有关,为什么?我在 cloudkit API 参考中找不到有关此行为的任何信息。

Create Custom zone error <CKError 0x60800005a2e0: "Partial Failure" (2/1011); "Failed to modify some record zones"; partial errors: {
    Main:__defaultOwner__ = <CKError 0x610000242910: "Network Unavailable" (3/NSURLErrorDomain:-1009); "The Internet connection appears to be offline.">
}>

(2) 另外,我希望它会抛出一个直接Network Unavailable错误,而不是一个Partial Failure包含错误的失败错误Network Unavailable。这是预期的行为吗?它是否总是抛出Partial Failure错误,然后必须打开包装才能找到包含的错误消息?文档似乎非常缺乏任何解释,除非我没有找到正确的位置。

任何帮助将不胜感激。谢谢你。

4

1 回答 1

2

我试着回答这两个问题...

网络

没有模拟器错误或问题,您不会收到错误连接,因为 .background 服务质量意味着......

系统比可以推迟到更佳时间的后台工作更早地执行用户发起的工作。

也许这就是您没有收到错误的原因,这是因为系统正在等待更好的网络条件,而您设置 .default 或 .userInitiate 系统期望“实时”响应。

引用iOS 应用程序的能源效率指南

为了更好地模拟网络条件,请使用Apple 的Network Link Conditioner工具。在这里您可以找到有关它的更多信息。

部分错误

我不确定,但我认为 Partial Failure 是所有 CKxxxxxOperation 错误结果的通用包装器。

这是有道理的,因为这些操作涉及 1..N 个 CKRecords,其中一些可以正常完成,而另一些可能会出错

于 2017-07-07T07:45:22.990 回答