swift - 由于 Swift 超时,如何取消 cloudKit 操作?

标签 swift timeout cloudkit nsoperation

我正在寻求有关如何因给定超时设置取消 cloudKit 操作的帮助?我的案例是我使用 CKModifyRecordsOperation 将一些更改上传到 iCloud,如果失败,我会将那些失败的记录保存到本地存储。但是有一点,手术要花这么长时间……

因此,我想为该操作设置一个大约 60 秒的超时时间,如果超时,我将取消该操作。现在我只使用 sleep func,虽然这不在主线程中,但它使每个添加的操作至少运行 60 秒。我知道这不是正确的解决方案。我的代码如下:

let uploadOperation = CKModifyRecordsOperation(recordsToSave: recordsToSave, recordIDsToDelete: recordIDsToDelete)
uploadOperation.modifyRecordsCompletionBlock = { (savedRecords, deletedRecordIDs, error) in
    if let error = error {
        ...
        CloudKitManager.persistentFailedRecords(saveFailed, deleteFailed)
    } 
}

CloudKitManager.privateDB.add(uploadOperation)    

sleep(60)
if uploadOperation.isExecuting {
    uploadOperation.cancel()
}

我搜索了一些关于操作超时的内容,答案主要集中在 NSURLSession 上,没有关于 CloudKit 操作的答案。我尝试使用它自己的属性“timeoutIntervalForRequest”,但它不起作用。

任何帮助将不胜感激!谢谢!

最佳答案

你设置对了吗?:

let operationConfiguration = CKOperation.Configuration()

operationConfiguration.timeoutIntervalForRequest = 60
operationConfiguration.timeoutIntervalForResource = 60

let fetchRecordZoneChangesOperation = CKFetchRecordZoneChangesOperation()

fetchRecordZoneChangesOperation.configuration = self.operationConfiguration

// etc...

关于swift - 由于 Swift 超时,如何取消 cloudKit 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40259370/

相关文章:

swift - 使用 LiteralConvertible 的自定义文字方法

ios - 无法在 UITableView Swift 中隐藏空单元格

arrays - 在不使用索引的情况下使用for循环在Swift 4中填充数组

sql-server - 使用 SQL Azure 从 session 状态提供程序( Entity Framework )持续接收 "timeout period elapsed"

go - 使用 Gocql 获取超时错误

ios - Dropbox UIDocumentPicker 插件无法打开 OS X 文件包

ios - 如何将委托(delegate)传递的数据转换为不同的值?

iphone - 通过 WiFi 连接的设备与 Web 服务器建立长时间开放连接会出现哪些问题?

ios - discoverAllContactUserInfosWithCompletionHandler返回同一用户的多个记录?

ios - CloudKit 和键值存储之间的区别