2015-03-18 18 views
5

Używanie Swift i NSURLSession. Opis NSError zlokalizowany jest bardzo ogólny, gdy nie mam połączenia z Internetem (ręcznie wyłączono sieć Wi-Fi/komórkową). Mówi „Operacja nie może być zakończona.Obsługa błędów NSURLSession

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 

szukam bardziej konkretnej wiadomości do wysłania do użytkownika. Włączam punkt przerwania i sprawdzam wszystkie obiekty, ale nie mogę znaleźć niczego dobrego.

Przed szybkich używałem AFNetworking obiektywnych C:

failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

Komunikaty o błędach chciałbym uzyskać tutaj były bardzo opisowe, coś jak „połączenie internetowe wydaje się być zalogowany

+1

Musisz samodzielnie radzić sobie z błędami w Internecie. 'AFNetworking' samo implementuje' Reachability', dlatego ich błędy są bardziej opisowe i świadome kontekstu. Dodatkowo możesz użyć 'AFNetworking' w swoim szybkim projekcie, jak to opisano tutaj.[AFNetworking Integrate Swift] (https://medium.com/@aommiez/afnetwork-integrate-swfit-80514b545b40) –

+0

hmm próbował oderwać się od zależności zewnętrznych bibliotek. Ale wygląda na to, że użyję ognia alamo (AFNetworking version of Swift), a następnie https://github.com/Alamofire/Alamofire – MobileMon

+1

Drobne wyjaśnienie: Zgadzam się, że biblioteki takie jak Alamofire i AFNetworking oferują bogatszą obsługę błędów, ale to dlatego, że " ponowne sprawdzenie dla rzeczy, które inaczej musielibyśmy ręcznie sprawdzić (np. poprawny 'Content-Type',' statusCode' 'NSHTTPURLResponse', itp.). Nie ma to nic wspólnego z faktem, że AFNetworking oferuje (ale nie używa domyślnie) Zasięg. W przypadku ogólnych błędów sieci po prostu zwracają te same obiekty 'NSError', które otrzymujemy, gdy sami robimy to ręcznie. – Rob

Odpowiedz

0
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
if error == nil { 
    //all ok do what you want to do 
} else { 
    let alertController = UIAlertController(title: "Error", message: "Put your error message here", preferredStyle: .Alert) 

    let cancelAction = UIAlertAction(title: "OK", style: .Cancel) { (action) in 
         } 
    alertController.addAction(cancelAction) 
    self.presentViewController(alertController, animated: true) 
} 
}) 

Ta implementacja pokazuje ostrzeżenie dla użytkownika, że ​​coś poszło nie tak. Możesz obsłużyć błąd w dowolny sposób (na przykład, ponawiając żądanie bez denerwowania użytkownika za pomocą alertu). UIAlertController to tylko iOS 8. Jeśli chcesz obsługiwać iOS 7, pokaż UIAlertView.

18

Spójrz na code i domain powstałej NSError obiektu. Możesz zdiagnozować, dlaczego nie udało się na nie spojrzeć. Na przykład domena NSURLErrorDomain i kod oznacza, że ​​nie masz połączenia z Internetem. Więc w Swift 3:

if let error = error as? NSError, error.domain == NSURLErrorDomain && error.code == NSURLErrorNotConnectedToInternet { 
    print("not connected") 
} 

można zobaczyć listę tych kodów w Global Variables - Foundation Constants Reference. Po prostu zbadaj w "domenie NSURL".

Również poszukiwanie NSURLErrorNotConnectedToInternet przez naciśnięcie polecenie + przesunięcie + o a następnie będziesz przeniesiony do odpowiedniego nagłówka (NSURLError.h). Osobiście dla tego rodzaju rzeczy, ufam nagłówkom trochę bardziej niż dokumentacja. Jeśli zrobisz to szukanie pracy z Objective-C, można nawet zobaczyć odsyłacz do CFURLError kodów (które można albo komenda -Kliknij lub komenda + przesunięcie + o i szukać kCFURLErrorNotConnectedToInternet) , a jeśli je odkryjesz, zobaczysz wartości numeryczne powiązane z tymi stałymi.

+0

jest to pomocne. Czy istnieje pełna lista określająca wszystkie kody/domeny błędów i ich opisy? – MobileMon

+1

Dla kodów 'NSURLErrorDomain' sugeruję przeglądanie nagłówków. Patrz wyżej. Nie sądzę, że inne domeny są tutaj odpowiednie. – Rob

+0

To jest wyliczenie domeny NSUrlError [https://developer.apple.com/reference/foundation/nsurlerror](https://developer.apple.com/reference/foundation/nsurlerror) – bJacoG

-1

Czy masz na myśli operation.responseString dla specyficznej odpowiedzi błędu z backendu? Właśnie znalazłem go wczoraj, to sprawdzić w bloku awaria AFHTTPSessionManager życzenie

NSError *underError = error.userInfo[@"NSUnderlyingError"]; 
NSData *responseData = underError.userInfo[@"com.alamofire.serialization.response.error.data"]; 

Oto the question I asked at AFN/Github. Mam nadzieję, że będzie to pomocne.