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

时间:2015-10-26 00:41:24

标签: nsoperation nsoperationqueue cloudkit cloudkit-environments

我在我的应用程序中以两种不同的方式调用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仪表板的“使用情况”面板中,甚至没有任何内容远远接近限制。还有哪些其他变量我没有考虑 - 或者我可以运行哪些其他测试来找出问题所在?

1 个答案:

答案 0 :(得分:1)

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

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

qualityOfService的文档说明:

  

向系统资源授予系统资源的相对重要性   操作。服务级别会影响操作的优先级   object可以访问系统资源,如CPU时间,网络   资源,磁盘资源等。操作质量更高   服务级别优先于系统资源   他们可以更快地完成任务。您使用服务级别   确保响应显式用户请求的操作   优先考虑不太重要的工作。这个属性反映了   有效执行操作所需的最低服务水平。该   此属性的默认值为   NSOperationQualityOfServiceBackground你应该保留这个价值   尽可能到位。更改服务级别时,请使用   适合执行相应的最低级别   任务。例如,如果用户启动任务并正在等待它   完成,分配值NSOperationQualityOfServiceUserInitiated   到这个属性。系统可以为操作提供更高的服务   如果资源可用,则操作级别。