【发布时间】:2014-08-15 19:23:27
【问题描述】:
新的 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 依赖项在其链中传递数据。
【问题讨论】:
-
如果您在第一个操作的完成块中创建第二个操作,则第二个操作将始终在第一个操作之后运行。如果您仍然可以按顺序执行,那么是否分配依赖关系又有何关系?
-
@TomHarrington 这是一个简化的例子。我有一个操作 A 将其结果发送到操作 B1 和操作 B2,它们需要将其结果发送到操作 C。嵌套变得非常快(又名“回调地狱”)并且需要一种模式来使其对“复杂”具有可读性'这样的情况。
标签: icloud nsoperation nsoperationqueue ios8 cloudkit