2015-03-01 8 views
6

Muszę zadzwonić 2 apis w kontroler widoku, aby pobrać niektóre dane z serwera, chcę, aby rozpocząć w tym samym czasie, ale następny krok będzie uruchamiany tylko wtedy, gdy oba z nich są wrócił (nie ma znaczenia, że ​​to sukces lub porażka). Mogę wymyślić 2 rozwiązania: 1. Połącz je ze sobą. Wywołaj api1, wywołaj api2 w obsłudze wyników api1, poczekaj na wynik api2 2. Ustaw 2 zmienne wskaźnika Bool, utwórz funkcję sprawdzania, jeśli oba te wskaźniki są prawdziwe, wykonaj następne. W obu programach obsługi wyniku Apisa ustaw odpowiednią zmienną wskaźnikową, a następnie funkcję sprawdzania połączenia, aby zdecydować, czy dobrze jest przejśćJak obsłużyć wiele połączeń sieciowych w Alamofire

Pierwsza z nich nie jest wystarczająca i nie mogę powiedzieć, że druga to eleganckie rozwiązanie. Czy Alamofire ma coś w rodzaju sygnału łączonego w Reactivecocoa? Albo jakieś lepsze rozwiązanie?

+2

Na przykład: http://commandshift.co.uk/blog/2014/03/19/using-dispatch-groups-to-wait-for-multiple-web-services/? – jrturton

+0

@jrturton jest bardzo pomocny, postanawiam użyć grupy wysyłkowej, aby rozwiązać ten problem. –

Odpowiedz

8

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.

+0

Tak, chcę się ich pozbyć, ale kiedy umieścisz je w ten sposób, wygląda to o wiele lepiej niż myślałem, porównuję twój kod z dispatch_group, dzięki –

+0

Urocza elegancka odpowiedź - dziękuję za to! – nicktones

+0

Czy wysyłanie grup byłoby lepszym rozwiązaniem, czy też prosta zmienna wskaźnika Bool wydaje się być jedynym sposobem na zrobienie czegoś? – Harish