2015-03-18 6 views
5

Использование Swift и NSURLSession. Локализованное определение NSError, которое я получаю, является очень общим, когда у меня нет подключения к Интернету (вручную отключена сеть wifi/cell). Он говорит: «Операция не может быть завершена.»Обработка ошибок NSURLSession

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

Я ищу более конкретное сообщение, чтобы отправить пользователю. Я включил точку останова и проверил все объекты, но не нашел ничего хорошего.

До стрижа я использовал AFNetworking объективные C:

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

Сообщение об ошибках я хотел бы получить здесь было очень описательным, что-то вроде «подключения к интернету, кажется, отсутствуют»

+1

Вы должны самостоятельно обрабатывать интернет-ошибки. 'AFNetworking' реализует' Reachability' сам по себе, поэтому их ошибки более наглядны и контекстны. Кроме того, вы можете использовать 'AFNetworking' в своем быстром проекте, как описано здесь.[AFNetworking Integrate Swift] (https://medium.com/@aommiez/afnetwork-integrate-swfit-80514b545b40) –

+0

hmm пыталась оторваться от зависимости внешних библиотек. Но похоже, что я буду использовать огонь alamo (AFNetworking версия Swift), затем https://github.com/Alamofire/Alamofire – MobileMon

+1

Небольшое разъяснение: я согласен с тем, что библиотеки, такие как Alamofire и AFNetworking, предлагают более богатую обработку ошибок, но это потому, повторно проверяя вещи, которые мы иначе должны проверить вручную (например, правильный «Content-Type», «statusCode» из 'NSHTTPURLResponse' и т. д.). Это не имеет никакого отношения к тому факту, что AFNetworking предлагает (но не использует, по умолчанию) Возможность повышения. Для общих сетевых ошибок они просто возвращают те же «объекты NSError», которые мы получаем, когда сами делаем это вручную. – Rob

ответ

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) 
} 
}) 

Эта реализация показывает предупреждение пользователю о том, что что-то пошло не так. Вы можете обрабатывать ошибку по своему усмотрению (например, повторив запрос без раздражения пользователя предупреждением). UIAlertController - только iOS 8. Если вы хотите, чтобы iOS 7 показывал UIAlertView.

18

Посмотрите на code и domain полученного объекта NSError. Вы можете диагностировать, почему он не смог их рассмотреть.

Например, если домен NSURLErrorDomain и код -1009 означают, что вы не подключены к Интернету. Таким образом, в Swift 3:

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

Вы можете увидеть список этих кодов в Global Variables - Foundation Constants Reference. Просто ознакомьтесь с «Доменю NSURL».

Кроме того, поиск NSURLErrorNotConnectedToInternet нажав команду + сдвиг + о и затем, вы будете перенаправлены на соответствующий заголовок (NSURLError.h). Лично для такого рода вещей я склонен доверять заголовкам немного больше, чем документация. Если вы сделаете это поиск при работе с Objective-C, вы даже можете увидеть перекрестную ссылку на CFURLError кодов (которые вы можете либо команда -Щелкните или команда + сдвиг + о и поиск kCFURLErrorNotConnectedToInternet) , и если вы их изучите, вы увидите числовые значения, связанные с этими константами.

+0

это полезно. Есть ли полный список, который указывает все коды ошибок/домены и их описания? – MobileMon

+1

Для кодов 'NSURLErrorDomain' я бы предложил посмотреть заголовки. См. Выше. Я не думаю, что другие домены здесь актуальны. – Rob

+0

Это перечисление домена NSUrlError [https://developer.apple.com/reference/foundation/nsurlerror](https://developer.apple.com/reference/foundation/nsurlerror) – bJacoG

-1

Вы хотите сказать operation.responseString для получения конкретной информации об ошибке? Я только что нашел его вчера, проверить это в блоке Провал AFHTTPSessionManager запроса

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

Вот the question I asked at AFN/Github. Надеюсь, это будет полезно.

Смежные вопросы