2

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

4

1 回答 1

2

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

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

qualityOfService 的文档说明:

将系统资源授予操作的相对重要性。服务级别影响操作对象访问系统资源(如 CPU 时间、网络资源、磁盘资源等)的优先级。具有更高服务质量级别的操作被赋予比系统资源更高的优先级,以便它们可以更快地执行其任务。您使用服务级别来确保响应显式用户请求的操作优先于不太重要的工作。此属性反映了有效执行操作所需的最低服务级别。该属性的默认值为 NSOperationQualityOfServiceBackground并且您应该尽可能保留该值。更改服务级别时,请使用适合执行相应任务的最低级别。例如,如果用户启动一项任务并等待它完成,则将值分配NSOperationQualityOfServiceUserInitiated 给此属性。如果资源可用,系统可以为操作提供更高的服务级别。

于 2015-10-28T06:29:32.457 回答