2015-10-19 145 views
2

虽然我打算将来切换到Alamofire,但与此同时,我正在将我的AFHTTPSessionManager子类从objc转换为swift。我有一些问题转换我的自定义dataTaskWithHTTPMethod方法。该函数将覆盖AFHTTPSessionManager.dataTaskWithHTTPMethod,以便我可以向请求添加一些额外的头并将响应主体传递到失败完成关闭中。在swift中使用AFHTTPSessionManager

@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替换。

回答

1

这是怎么了你的方法看起来像斯威夫特:

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关闭是必需的。如果您从未在没有成功和失败处理程序的情况下调用该方法,则可以删除这些可选项并在执行这些关闭时清除if let