Using AFHTTPSessionManager in swift

时间:2015-10-19 15:47:07

标签: ios objective-c swift afnetworking nsurlsession

While I do plan to switch over to Alamofire in the future, in the meanwhile, I'm looking to convert my AFHTTPSessionManager subclasess from objc to swift. I'm having some issues converting my custom dataTaskWithHTTPMethod method. the function overrides the AFHTTPSessionManager.dataTaskWithHTTPMethod so I could add some extra headers to the request and pass the response body into the failure completion closure.

@interface WebAPIClient : AFHTTPSessionManager

and the implementation function:

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

I mostly have difficulties figuring out how to rewrite the first section of the function. Dealing with NSError in swift and passing it to a function behaves differently and I was unable to use the NSErrorPointer replacement.

1 个答案:

答案 0 :(得分: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闭包,因此我将它们定义为Optionals。如果你从未在没有成功和失败处理程序的情况下调用该方法,则可以删除那些Optionals并在执行这些闭包时删除if let