新的 Cloud Kit 框架将 NSOperation 广泛用于其 CRUD。这些操作的结果以块的形式返回。例如:
let fetchOperation = CKFetchRecordsOperation(recordIDs: [recordID1, recordId2])
fetchOperation.fetchRecordsCompletionBlock = {(dict: NSDictionary!, error: NSError!) -> Void in
// dict contains RecordId -> Record
// do something with the records here (if no error)
}
我想链接其中一些操作(依赖项),并将操作的结果传递给链中的下一个操作。简化示例来说明这一点(伪代码!):
let fetchOperation1 = CKFetchRecordsOperation(recordIDs: [recordID1, recordId2])
fetchOperation1.fetchRecordsCompletionBlock = {(dict: NSDictionary!, error: NSError!) -> Void in
if error {
// handle error
} else {
// dict contains RecordId -> Record
// let's pretend our records contain references to other records
// that we want to fetch as well
fetchOperation.operationResult =
dict.allValues().map(
{ $0.getObject("referencedRecordId"}
)
}
}
let fetchOperation2 = CKFetchRecordsOperation(recordIDs: fetchOperation1.operationResult)
fetchOperation2.fetchRecordsCompletionBlock = {(dict: NSDictionary!, error: NSError!) -> Void in
if error {
// handle error
} else {
// dosomething
}
}
fetchOperation2.addDependency(fetchOperation2)
但是上面的伪代码永远无法工作,因为在您初始化 fetchOperation2 时尚未分配 fetchOperation1.operationResult。您可以将 fetchOperation2 的 init 嵌套在 fetchOperation1 的 completionBlock 中,但是您放弃了 NSOperation 的依赖功能,我在这里尝试使用它。
因此,我正在寻找一种干净、可读、标准(无反应可可等)的解决方案,让 NSOperation 依赖项在其链中传递数据。