Swift 中的 CFNetwork 错误处理

CFNetwork error handling in Swift

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

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. 只检查错误代码就足够了吗?我使用的框架可能 return 不同类型的错误,我不确定这些错误代码是否唯一。
  2. 我要如何在 Swift 中编写相同的代码?我确实在 CFNetworkErrors 枚举下找到了错误代码定义。但是,error.codeCFNetworkErrors 枚举中的值不能直接比较,因为它们具有不同的类型。是否可以将 error.code 转换为 CFNetworkErrors 然后比较错误代码?
  3. 我可以安全地切换到使用 NSURL 错误,例如 NSURLErrorCancelled 吗? CFNetworks 错误和 NSURL 错误之间是否存在一对一的映射?
  1. 检查错误代码可能还不够。您几乎肯定还需要检查 HTTP 状态代码,除非您调用的委托方法已经这样做了。 NSError 通常会告诉您传输级故障,而状态代码会告诉您服务器端故障,例如文件不存在。

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

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