【问题标题】:Using AFHTTPSessionManager in swift快速使用 AFHTTPSessionManager
【发布时间】:2015-10-19 15:47:07
【问题描述】:

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

@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;
}

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

【问题讨论】:

    标签: ios objective-c swift afnetworking nsurlsession


    【解决方案1】:

    这就是你的方法在 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 闭包,因此我将它们定义为可选项。如果您在没有成功和失败处理程序的情况下从不调用该方法,则可以在执行这些闭包时删除这些 Optional 并摆脱 if let

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 2016-03-25
      • 2015-06-10
      相关资源
      最近更新 更多