新的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。你可以在fetchOperation1的completionBlock中嵌入fetchOperation2的init,但是你放弃了NSOperation的依赖功能,我试图在这里使用它。
因此,我正在寻找一个干净,可读,标准(没有反应性可可等)的解决方案,NSOperation依赖项在其链中传递数据。