ios - CloudKit CKdatabaseOperation 不会根据 .qualityOfService 设置在模拟器中抛出错误

标签 ios swift ios-simulator cloudkit ckoperation

我基本上是在摆弄 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)

但是,当我将 createZoneOperation.qualityOfService 更改为 defaultuserInitiated 时,它会抛出一个错误(如下所示)预期的行为。为什么是这样?这只是模拟器异常还是云套件错误的抛出与服务的操作质量有关,为什么?我无法在 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 错误,而不是 Network UnavailablePartial Failurefailure 错误> 错误包裹在里面。这是预期的行为吗?它是否总是抛出一个 Partial Failure 错误,然后必须解包才能找到包含的错误消息?文档似乎非常缺乏任何解释,除非我没找到正确的地方。

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

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

网络

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

The system performs work initiated by a user sooner than background work that can be deferred until a more optimal time.

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

引自Energy Efficiency Guide for iOS Apps

要更好地模拟网络条件,请使用 Apple 的 Network Link Conditioner 工具。 Here you could find more info关于它。

部分错误

我不确定,但我认为部分失败是所有 CKxxxxxOperation 错误结果的通用包装器。

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

关于ios - CloudKit CKdatabaseOperation 不会根据 .qualityOfService 设置在模拟器中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44894713/

相关文章:

ios - 如何从 iOS 私有(private) api 二进制文件中获取 header 和函数?如何对应用程序进行逆向工程?

ios - 解析 Swift : Check if update was successfully committed

ios - UISwitch 在 Xcode 9.3 的模拟器中损坏?

ios - 为什么我的委托(delegate)仅在定义为 VC 而不是外部类时才起作用?

ios - 使用 CALayer 使按钮变圆的令人费解的行为

ios - 时间戳中的日期变得错误

ios - UILongPressGestureRecognizer- 如何在按住的同时增加大小

ios - 在新窗口或选项卡中打开的链接未在 native iOS 中加载

xcode - 如何拖动iphoneX模拟器?

ios - 奇怪的导航 Controller 行为