2013-02-13 10 views
6

Zwykle w moich aplikacjach iOS, które używają dużej liczby żądań HTTP do komunikacji z serwerem, dodaję NSBlockOperation do globalnej bramki NSOperationQueue, a następnie zawieszam i włączyć kolejkę, gdy aplikacja wykryje zmianę stanu połączenia internetowego, zapisując w ten sposób wszystkie żądania aktualnie w kolejce, dopóki kolejka nie zostanie zawieszona. Jednak nie jestem całkowicie pewien, że w ten sposób wszelkie aktualnie uruchomione operacje zostaną zatrzymane, a następnie ponownie dodane do górnej części kolejki.Najlepszym sposobem radzenia sobie ze zmianą połączenia internetowego za pomocą sieci HTTP

Moje pytanie brzmi: czy są jakieś lepsze sposoby radzenia sobie ze zmianą stanu sieci podczas pracy z żądań HTTP do zdalnego serwera w IE wstrzymywanie, wznawianie, anulowanie prośby itp ...

+0

easist sposób, który jest również najczęściej używany i wystarczający, to ignorowanie problemu. Twórz żądania, wysyłaj je na serwer i jeśli połączenie nie powiedzie się, wyświetl błąd użytkownikowi. Nic więcej. Możesz ponowić połączenie, gdy się nie powiedzie, ale nie polecam robić tego więcej niż raz dla żądania. – Sulthan

+0

@Szukaj alternatywnie, co jeśli żądania były wewnętrzne, np. analityka? –

Odpowiedz

2

Możesz użyć klasy Reachability, aby wykryć zmiany statusu sieci, aby uniknąć wysyłania żądań. Jest to oparte na i zaktualizowane z około sample code provided by Apple. Dzięki temu dowiesz się, kiedy połączenie internetowe zostanie zmienione bez odpytywania.

O ile mi wiadomo, jest to najlepszy sposób na wykrycie dostępności sieci. Otrzymasz natychmiastowe powiadomienie, gdy sieć stanie się ponownie dostępna. Wierzę, że to nawet mówi ci, jakiego rodzaju połączenie jest dostępne (WiFi lub komórkowe).

Jeśli połączenie zostanie odrzucone podczas wysyłania żądania, będziesz musiał obsłużyć ten stan, tak jak obecnie.

0

Wystarczy moje przemyślenia - powinieneś dodać anulowanie do twoich operacji (ręcznie) like here. Po wykryciu zmian stanu sieci (brak połączenia) można anulować bieżące operacje, wstrzymać kolejkę, powiadomić menedżera, aby mógł zmienić harmonogram operacji. Gdy sieć stanie się dostępna, wznów kolejkę.

+0

Właśnie to robię w tej chwili. –

+0

Z twojego pytania nie wynika jednoznacznie, czy dodałeś mechanizm anulowania do swoich operacji. Zawieszenie działania już działających operacji nie ma wpływu na kolejkę. –

+0

Ah, rozumiem.Aby było bardziej zrozumiałe, działające operacje powinny być śledzone i anulowane, gdy nastąpi zmiana w połączeniu internetowym, a następnie ponownie dodane na początku kolejki, a następnie ponownie wysłane, gdy będzie dostępne połączenie internetowe? –

0

Transakcje są właśnie w tym celu. Musisz wykonać polecenie ws atomowej, tzn. Rozpocząć transakcję, wykonać połączenie, uzyskać odpowiedź i zatwierdzić transakcję. Wtedy możesz być pewien, że twoje zadanie zostało zakończone.

W innym przypadku, ponownie rozpoczynasz transakcję, wywołujesz ws, wywołanie ws nie działa i nie możesz uzyskać odpowiedzi, niezależnie od przyczyny, i wycofujesz transakcję i logujesz/raportujesz tę sytuację. Musisz tylko upewnić się, czy naprawdę nie możesz sobie pozwolić na brakujące połączenia ws.

0

Jak sugeruje Luke, najlepiej jest sobie z tym poradzić: Apple sample. Ale chciałbym również zająć się twoją potrzebą wykrywania zmian w połączeniu sieciowym. Jest to obsługiwane przez obserwację powiadomienia o nazwie KReachabilityChangedNotification.

Innymi słowy, kontroler widoku lub kod delegat musi mieć następujący fragment w celu obsługi osiągalność sieciowego (czytaj „Połączenie”) zmiany:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; 

I

//Called by Reachability whenever status changes.  
- (void) reachabilityChanged: (NSNotification*)note  
{  
     Reachability* curReach = [note object];   
     //TODO: Your specific handling. 
} 
Powiązane problemy