pierwsze, NSOperationQueue
pozwalają enqueue operacji, że jest jakiś asynchronicznych operacji o start
metody, metody cancel
i kilka właściwości obserwowalnych, podczas gdy w kolejce wysyłki można złożyć blok lub funkcja zamknięcia do kolejki wysyłkowej, która zostanie następnie wykonana.
"Operacja" jest semantycznie fundamentalnie inna niż blok (lub zamknięcie, funkcja). Operacja ma podstawowe zadanie asynchroniczne, podczas gdy blok (zamknięcie lub funkcje) jest właśnie taki.
Co zbliża się do NSOperation
, choć jest asynchroniczny funkcji, np:
func asyncTask(param: Param, completion: (T?, Error?) ->())
Teraz Futures możemy zdefiniować tę samą funkcję asynchroniczną jak:
func asyncTask(param: Param) -> Future<T>
dzięki czemu takie asynchroniczne funkcje są bardzo przydatne.
Ponieważ kontrakty mają funkcje COMBINATOR jak map
i flatMap
i tak dalej, możemy dość łatwo „emulować” na „zależność” cechę NSOperation
, tylko w mocniejszym, bardziej zwięzły i bardziej zrozumiały sposób.
Możemy również zaimplementować jakąś NSOperationQueue
z kilku linii kodu opartych wyłącznie na GCD, powiedzieć „TaskQueue” oraz z zasadniczo takie same funkcje, takie jak „maxConcurrentTasks” i można go używać do enqueue funkcje zadania (nie operacje), w jeszcze bardziej potężny, bardziej zwięzły i bardziej zrozumiały sposób, jak również. ;)
Aby uzyskać operację do anulowania, należy utworzyć podklasę o nazwie NSOperation
- podczas gdy można utworzyć funkcję asynchroniczną "ad-hod" - wbudowaną.
Ponadto, od anulowanie jest niezależną koncepcją, możemy założyć, że istnieje pewna biblioteka, której implementacja jest oparta wyłącznie na GCD, która rozwiązuje ten problem w, uhm, zwykły sposób;) To może wyglądać tak :
self.cancellationRequest = CancellationRequest()
self.asyncTask(param: param, cancellationToken: cr.token).map { result in
...
}
i później:
override func viewWillDisappear(_ animated: animated) {
super.viewWillDisappear(animated)
self.cancellationRequest.cancel()
}
więc IMHO nie ma naprawdę żadnego powodu, aby użyć przylegający NSOperation
i NSOperationQueue
, i nie ma powodu, dla podklasy więcej NSOperation
, co jest dość skomplikowane i zaskakujące trudne, chyba że nie dbasz o wyścigi danych.