新的Cloud Kit框架對其CRUD使用了廣泛的NSOperation。這些操作的結果以塊形式返回。例如:如何在NSOperation依賴關係之間交流結果?
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依賴關係在其鏈條中傳遞數據。
如果您在創建第一個操作的完成一塊的第二操作,第二操作將永遠是第一位之後運行。爲什麼不管你是否分配依賴關係,如果你仍然可以按順序執行? –
@TomHarrington這是一個簡化的例子。我有一個操作A將結果發送到操作B1和操作B2,它們需要將它們的結果發送到操作C.嵌套變得非常快速(又名'callback hell'),並且需要一個模式來使'complex '這樣的情況。 –