objective-c - Swift 中的 CFNetwork 错误处理

标签 objective-c swift nsurlconnection cfnetwork

我有一个 objective-c 代码块,负责通过检查 NSError 代码错误来处理 HTTP 错误。该代码将错误消息发送回委托(delegate)(除非它是应用程序忽略的错误代码,例如已取消的请求)

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. 我要如何在 Swift 中编写相同的代码?我确实在 CFNetworkErrors 枚举下找到了错误代码定义。但是,error.codeCFNetworkErrors 枚举中的值无法直接比较,因为它们具有不同的类型。是否可以将 error.code 转换为 CFNetworkErrors 然后比较错误代码?
  3. 我可以安全地切换到使用 NSURL 错误,例如 NSURLErrorCancelled 吗? CFNetworks 错误和 NSURL 错误之间是否存在一对一的映射?

最佳答案

  1. 检查错误代码可能还不够。您几乎肯定还需要检查 HTTP 状态代码,除非您调用的委托(delegate)方法已经这样做了。 NSError 通常会告诉您传输级故障,而状态代码会告诉您服务器端故障,例如文件不存在。

  2. 不知道。这个问题大多与网络无关,所以你应该问一个单独的问题,并将其标记为 Swift 问题。 :-)

  3. 是的,你应该使用基金会代码。这些值应该始终相同,但 future Foundation 错误代码可能比 CF 代码更多,因为并非所有 Foundation 级功能都在 CF 层公开公开。

关于objective-c - Swift 中的 CFNetwork 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34025325/

相关文章:

xcode - NSMutableData setLength :NSUInteger crashing the app

objective-c - GK 成就说明和解锁列表

iphone - 无法检测 iPhone 上的纵向方向

ios - Swift:我可以加减 `dispatch_time_t` 变量吗?

ios - 如何在 Swift 中制作引脚注释标注?

android - iOS 中的 Android okhttp 相当于什么?

ios - UIPickerView 未从 viewDidAppear 加载

iphone - HTML 字符串设置为 UILabel

swift - Swift 中带有外部参数名称的方法选择器

objective-c - 将图像数组(包装在 NSData 中)上传到 iOS 中的服务器