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.
答案 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
}
我不确定在调用函数时是否需要success
和failure
闭包,因此我将它们定义为Optionals。如果你从未在没有成功和失败处理程序的情况下调用该方法,则可以删除那些Optionals并在执行这些闭包时删除if let
。