Das neue Cloud Kit-Framework verwendet NSOperation umfassend für seine CRUD. Die Ergebnisse dieser Operationen werden in Blöcken zurückgegeben. Zum Beispiel:Wie kommuniziert man Ergebnisse zwischen NSOperation-Abhängigkeiten?
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)
}
ich Kette wollen einige dieser Operationen (Abhängigkeiten) und das Ergebnis einer Operation zur nächsten Operation in der Kette übergeben. Vereinfachtes Beispiel zu veranschaulichen diesen (Pseudo-Code!):
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)
Aber vor Pseudo-Code nie funktionieren kann, da die fetchOperation1.operationResult ist noch nicht zugewiesen, wenn Sie fetchOperation2 init. Sie könnten die init von fetchOperation2 in completionBlock von fetchOperation1 verschachteln, aber dann verlassen Sie die Abhängigkeitsfunktion von NSOperation, die ich hier verwenden möchte.
Also, ich bin auf der Suche nach einer sauberen, lesbaren, Standard (keine reaktiven Kakao und so) Lösung zu arbeiten haben NSOperation Abhängigkeiten Daten entlang in ihrer Kette weitergeben.
Wenn Sie die zweite Operation in der ersten Operation der Beendigung Block, die zweite Operation nach dem ersten immer ausgeführt werden erstellen. Warum ist es wichtig, ob Sie Abhängigkeiten zuweisen oder nicht, wenn Sie immer noch in der Reihenfolge ausgeführt werden? –
@ TomHarrington Dies ist ein vereinfachtes Beispiel. Ich habe eine Operation A, die ihr Ergebnis an Operation B1 und Operation B2 sendet, die ihr Ergebnis an Operation C senden müssen. Das Verschachteln wird ziemlich schnell zu einem Chaos (aka 'Callback-Hölle') und benötigt ein Muster, um es für 'komplex lesbar zu machen 'Fälle wie diese. –