新しい Cloud Kit フレームワークは、CRUD のために 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 がまだ割り当てられていないため、上記の疑似コードは機能しません。fetchOperation1 の completionBlock で fetchOperation2 の init をネストすることもできますが、ここで使用しようとしている NSOperation の依存関係機能を捨てるよりも。
したがって、NSOperationの依存関係がチェーン内でデータを渡すように機能する、クリーンで読みやすい標準(リアクティブココアなどはありません)ソリューションを探しています。