CloudKit 操作在开发版本中执行,但有时在生产版本中挂起

Posted

技术标签:

【中文标题】CloudKit 操作在开发版本中执行,但有时在生产版本中挂起【英文标题】:CloudKit operations execute in development version but sometimes hang in production version 【发布时间】:2015-10-26 00:41:24 【问题描述】:

我在我的应用中以两种不同的方式调用 iCloud 数据库:

1。 调用CKDatabase 便捷方法在开发(模拟器)和生产(设备)环境中完美运行:

let privateDatabase = CKContainer.defaultContainer().privateCloudDatabase

privateDatabase.fetchRecordWithID(recordID, completionHandler:  (record, error) -> Void in
    // handle record and errors
)

2。 将CKOperations 添加到主队列在开发环境中完美运行,并且在我在生产环境中测试时工作了一段时间 - 但是在经过几个小时的间歇性测试后,对数据库的调用刚刚开始挂起 - 不产生错误,并且不执行完成代码。 (fetchRecordWithID 调用仍然可以完美运行。)

let op1 = CKModifyRecordsOperation(recordsToSave: records, recordIDsToDelete: nil)
op1.modifyRecordsCompletionBlock =  (savedRecords, deletedRecordIDs, error) -> Void in
    // handle records and errors
    
op1.database = privateDatabase

// let op2, op3...

NSOperationQueue.mainQueue().addOperations([
    op1,
    op2,
    op3,
    ], waitUntilFinished: false)

在 CloudKit 仪表板的“使用”面板中,甚至没有任何东西接近极限。我没有考虑哪些其他变量 - 或者我可以运行哪些其他测试来找出问题所在?

【问题讨论】:

尝试设置 op1、op2 和 op3.qualityOfService = .UserInitiated 【参考方案1】:

尝试设置 op1、op2 和 op3.qualityOfService = .UserInitiated

该设置已在 ios 9 中设置为“较低”的标准值。

qualityOfService 的文档说明:

授予系统资源的相对重要性 手术。服务级别影响操作的优先级 对象被授予对系统资源的访问权限,例如 CPU 时间、网络 资源、磁盘资源等。更高质量的运营 服务级别的优先级高于系统资源,因此 以便他们可以更快地完成任务。您使用服务级别 确保响应显式用户请求的操作是 优先于不太重要的工作。该属性反映了 有效执行操作所需的最低服务水平。这 此属性的默认值为 NSOperationQualityOfServiceBackground,您应该保留该值 尽可能到位。更改服务级别时,请使用 适合执行相应的最低级别 任务。例如,如果用户启动了一项任务并正在等待它 最后,赋值NSOperationQualityOfServiceUserInitiated 到这个属性。系统可能会给运营带来更高的服务 如果有可用资源,则对操作进行分级。

【讨论】:

例如,背景应该会保留您的请求,直到设备的无线电通电为止。

以上是关于CloudKit 操作在开发版本中执行,但有时在生产版本中挂起的主要内容,如果未能解决你的问题,请参考以下文章

推送通知在开发中工作正常,但设备在生产中没有收到通知

Cloudkit 与组合

CloudKit 私有数据库开发者访问

Cloudkit 公共数据库错误:“不允许写入操作”

应用程序在调试版本中运行良好,但在生产中无法运行

了解 CloudKit 限制