Новая среда 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 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)
Но выше псевдокод никогда не может работать, поскольку fetchOperation1.operationResult еще не назначен при инициализации fetchOperation2. Вы можете вложить инициализацию fetchOperation2 в fetchOperation1 completeBlock, но чем вы отключаете функциональность зависимостей NSOperation, которую я пытаюсь использовать здесь.
Итак, я ищу чистый, читаемый, стандартный (без реактивного cocoa и такого) решения для работы, поскольку зависимости NSOperation передают данные в цепочке.