虽然我确实计划在未来切换到 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
}
我不确定调用函数时是否需要 success
和 failure
闭包,所以我将它们定义为 Optionals。如果你从不调用没有成功和失败处理程序的方法,你可以删除那些 Optionals 并在执行这些闭包时摆脱 if let
。
关于ios - 在 swift 中使用 AFHTTPSessionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33218721/