ios - 在 swift 中使用 AFHTTPSessionManager

标签 ios objective-c swift afnetworking nsurlsession

虽然我确实计划在未来切换到 Alamofire,但与此同时,我希望将我的 AFHTTPSessionManager 子类从 objc 转换为 swift。我在转换自定义 dataTaskWithHTTPMethod 方法时遇到一些问题。该函数覆盖了 AFHTTPSessionManager.dataTaskWithHTTPMethod,因此我可以向请求添加一些额外的 header 并将响应主体传递到失败完成闭包中。

@interface WebAPIClient : AFHTTPSessionManager

及实现函数:

- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
                                   URLString:(NSString *)URLString
                                   csrfToken:(NSString *)csrfToken
                                  parameters:(id)parameters
                                     success:(void (^)(NSURLSessionDataTask *, id))success
                                     failure:(void (^)(NSURLSessionDataTask *, NSError *, id))failure
{
  NSError *serializationError = nil;
  NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[NSURL URLWithString:URLString relativeToURL:self.baseURL].absoluteString parameters:parameters error:&serializationError];
  if (serializationError) {
    if (failure) {
      dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
        failure(nil, serializationError, nil);
      });
    }

  return nil;
  }

  if (csrfToken!=nil) {
    [request setValue:@"XMLHttpRequest" forHTTPHeaderField:@"X-Requested-With"];
    [request setValue:csrfToken forHTTPHeaderField:@"X-CSRFToken"];
  }


  __block NSURLSessionDataTask *dataTask = nil;
  dataTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
  if (error) {
    if (failure) {
      failure(dataTask, error, responseObject);
    }
  } else {
    if (success) {
      success(dataTask, responseObject);
    }
  }
  }];

  return dataTask;
}

我通常很难搞清楚如何重写函数的第一部分。在 swift 中处理 NSError 并将其传递给函数的行为不同,我无法使用 NSErrorPointer 替换。

最佳答案

这就是你的方法在 Swift 中的样子:

typealias DataTaskSuccessHandler = (dataTask: NSURLSessionDataTask?, responseObject: AnyObject?) -> ()
typealias DataTaskErrorHandler = (dataTask: NSURLSessionDataTask?, error: NSError?, responseObject: AnyObject?) -> ()

func dataTask(withHTTPMethod httpMethod: String, urlString: String, csfrToken: String?, parameters: AnyObject?, success: DataTaskSuccessHandler?, failure: DataTaskErrorHandler?) -> NSURLSessionDataTask? {
    var dataTask: NSURLSessionDataTask?
    var serializationError: NSError?
    guard let absoluteURLString = NSURL(string: urlString, relativeToURL: baseURL)?.absoluteString else { return nil }
    let request = requestSerializer.requestWithMethod(httpMethod, URLString: absoluteURLString, parameters: parameters, error: &serializationError)
    if serializationError != nil {
        if let failure = failure {
            dispatch_async(completionQueue ?? dispatch_get_main_queue(), { () -> Void in
                failure(dataTask: nil, error: serializationError, responseObject: nil)
            })
        }
        return nil
    }

    if let csfrToken = csfrToken {
        request.setValue("XMLHttpRequest", forHTTPHeaderField: "X-Requested-With")
        request.setValue(csfrToken, forHTTPHeaderField: "X-CSRFToken")
    }

    dataTask = dataTaskWithRequest(request, completionHandler: { (_, responseObject, error) -> Void in
        if let error = error, let failure = failure {
            failure(dataTask: dataTask, error: error, responseObject: responseObject)
        } else if let success = success {
            success(dataTask: dataTask, responseObject: responseObject)
        }
    })

    return dataTask
}

我不确定调用函数时是否需要 successfailure 闭包,所以我将它们定义为 Optionals。如果你从不调用没有成功和失败处理程序的方法,你可以删除那些 Optionals 并在执行这些闭包时摆脱 if let

关于ios - 在 swift 中使用 AFHTTPSessionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33218721/

相关文章:

ios - 不能使用类型为 ($T12, @lvalue CGFloat) 的参数列表调用 *

ios - 将设备更新到 iOS 11.2 会破坏 Xcode 9.1 的支持

ios - 为什么我不能在我的prepareForSegue方法中快速转换发送者?

ios - (kCFStreamErrorDomainSSL,-9814)

ios - controllerDidChangeContent 核心数据严重应用错误

iOS/Obj-C - didReceiveRemoteNotification 语句没有触发?

ios - 使用插件更改当前页面

xcode - 我如何在 Swift SpriteKit 的游戏中保存 "coins"?

ios - 相机处于横向模式

ios - 在异步加载中重新加载数据