2015-12-01 2 views
2

У меня есть блок объектно-кода c, который отвечает за обработку ошибок HTTP, проверяя ошибку кода NSError. Код отправляет сообщение об ошибке обратно делегат (если это не код ошибки, что приложение игнорирует, например отмененные запросы)Обработка ошибок CFNetwork в Swift

failure:^(NSURLSessionTask *task, NSError *error, id responseObject) { 

    NSString *errorMessage = [self getErrorMessage:responseObject withError:error]; 

    if (error.code!=kCFURLErrorCancelled && 
     error.code!=kCFURLErrorCannotFindHost && 
     error.code!=kCFURLErrorCannotConnectToHost && 
     error.code!=kCFURLErrorNetworkConnectionLost && 
     error.code!=kCFURLErrorDNSLookupFailed && 
     error.code!=kCFURLErrorNotConnectedToInternet && 
     error.code!=kCFURLErrorTimedOut) { 
    if ([self.delegate respondsToSelector:@selector(didFailed:)]) { 
     [self.delegate didFailed:errorMessage]; 
    } 
    } 

    if (completionBlock != nil) completionBlock(NO); 
}]; 

У меня есть несколько вопросов/проблемы, связанные с этим блоком кода.

  1. Достаточно просто проверить код ошибки? Рамка, которую я использую, может возвращать разные типы ошибок, и я не уверен, что эти коды ошибок уникальны.
  2. Как мне пойти и написать тот же код в Свифт? Я нашел определения кодов ошибок под заголовком CFNetworkErrors. Тем не менее, error.code & значение из перечня CFNetworkErrors невозможно сравнивать напрямую, так как они имеют разные типы. Можно ли отличить error.code в CFNetworkErrors, а затем сравнить коды ошибок?
  3. Могу ли я безопасно использовать ошибки NSURL, такие как NSURLErrorCancelled? Существует ли сопоставление 1 к 1 между ошибками CFNetworks и ошибками NSURL?
+0

Имеются NSURLErrors, соответствующие всем этим ошибкам CF; нет необходимости использовать их вообще. См. NSURLError.h – gnasher729

ответ

1
  1. Это, вероятно, не достаточно, чтобы проверить код ошибки. Вам почти наверняка нужно также проверить код HTTP-кода, если только этот метод делегата не делает этого. NSError обычно сообщает вам о сбоях на уровне транспортного уровня, тогда как код состояния сообщает о сбоях на стороне сервера, таких как файл, который не существует.

  2. Не знаю. Этот вопрос в основном не связан с сетью, поэтому вам, вероятно, следует задать отдельный вопрос для него и пометить его как вопрос Swift. :-)

  3. Да, вы должны использовать коды Foundation. Значения всегда должны быть одинаковыми, но, скорее всего, будет больше кодов ошибок Foundation, чем CF-кодов, так как не все функции уровня Foundation публично отображаются на уровне CF.

+0

Вы получаете _either_ код ошибки или код состояния. Не оба. Вы получите код ошибки, если не получили соединение с сервером. Вы получаете код состояния, если у вас есть соединение с сервером, и сервер ответил. – gnasher729

+0

Хотя это * обычно * true, это не всегда так, по крайней мере, если вы используете делегатов - не уверены в блочном API. Вы получаете код состояния, когда клиент получает полный набор * headers *. В заголовках сервер отправляет заголовок Content-Length (или заголовок кодированной кодировки), который сообщает сетевому стеку, сколько данных ожидать. Если соединение не удается, пока сервер извлекает эти данные, вы должны получить как успешный код состояния, так и код ошибки транспорта, например NSURLErrorNetworkConnectionLost или NSURLErrorTimedOut, в зависимости от основной причины. – dgatwood

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