Twoja ocena jest w 100% poprawna. W tej chwili dwie opcje, które określiłeś, są naprawdę jedynymi możliwymi podejściami. Zgadzam się z tobą, że twoja druga opcja jest znacznie lepsza niż pierwsza z twoich przypadków użycia.
Jeśli chcesz połączyć ReactiveCocoa z Alamofire, to z pewnością jest to możliwe, ale nie zostało to jeszcze zrobione zgodnie z moją wiedzą. Możesz także sprawdzić, czy PromiseKit byłby w stanie zaoferować jakąś pomoc, ale nie został również sklejony z Alamofire. Próba połączenia jednej z tych bibliotek z serializatorami odpowiedzi Alamofire nie będzie w żadnym razie trywialnym zadaniem.
Przełączanie biegów trochę, naprawdę nie sądzę, ReactiveCocoa lub PromiseKit są bardzo dobrze dostosowane do przypadku użycia, ponieważ nie są połączenia łańcuchowe usług, prowadzisz je równolegle. Ponadto nadal musisz uruchomić całą logikę analizowania i określić, czy każdy z nich zakończył się sukcesem, czy nie, a następnie zaktualizować aplikację odpowiednio. Osiągam to, że opcja 2 będzie zdecydowanie najlepsza, chyba że chcesz dołożyć wszelkich starań, aby połączyć PromiseKit lub ReactiveCocoa z serializatorami odpowiedzi Alamofire.
Oto, co zasugerowałbym, aby ograniczyć komplikacje.
import Foundation
import Alamofire
class ParallelServiceCaller {
var firstServiceCallComplete = false
var secondServiceCallComplete = false
func startServiceCalls() {
let firstRequest = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["first": "request"])
firstRequest.responseString { request, response, dataString, error in
self.firstServiceCallComplete = true
self.handleServiceCallCompletion()
}
let secondRequest = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["second": "request"])
secondRequest.responseString { request, response, dataString, error in
self.secondServiceCallComplete = true
self.handleServiceCallCompletion()
}
}
private func handleServiceCallCompletion() {
if self.firstServiceCallComplete && self.secondServiceCallComplete {
// Handle the fact that you're finished
}
}
}
Realizacja jest naprawdę czysta i łatwa do naśladowania. Chociaż rozumiem twoje pragnienie pozbycia się flag ukończenia i funkcji wywołania zwrotnego, pozostałe opcje, takie jak ReactiveCocoa i/lub PromiseKit, nadal będą miały dodatkową logikę i mogą w końcu sprawić, że sprawy będą bardziej skomplikowane.
Inną możliwą opcją jest użycie grup wysyłkowych i semaforów, ale to naprawdę zwiększa złożoność, ale może przybliżyć Cię do stylu ReactiveCocoa lub PromiseKit.
Mam nadzieję, że pomoże to rzucić trochę światła.
Na przykład: http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/? – jrturton
@jrturton jest bardzo pomocny, postanawiam użyć grupy wysyłkowej, aby rozwiązać ten problem. –