11

新しい 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の依存関係がチェーン内でデータを渡すように機能する、クリーンで読みやすい標準(リアクティブココアなどはありません)ソリューションを探しています。

4

3 に答える 3

2

この例の編集で示されているように、最初のブロックの上に 2 番目の操作を宣言するだけで、レコード ID を設定してフェッチすることができます。

let fetchOperation1 = CKFetchRecordsOperation(recordIDs: [recordID1, recordId2])
let fetchOperation2 = CKFetchRecordsOperation()

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
               fetchOperation2.recordIDs = 
                   dict.allValues().map(
                      { $0.getObject("referencedRecordId"}
               )
            }
        }

fetchOperation2.fetchRecordsCompletionBlock = {(dict: NSDictionary!, error: NSError!) -> Void in
            if error {
              // handle error
            } else {
              // dosomething
            }
        }

fetchOperation2.addDependency(fetchOperation1)

また、最初のブロックでエラーが発生した場合は、キューのすべての操作をキャンセルする必要があります。各ブロックは引き続き呼び出されますが、NSError がキャンセルに設定されます。したがって、カスタム操作の場合のように、特別な最終ブロックは必要ありません。

于 2016-03-30T22:40:49.587 に答える