NSURLSession上载任务不会调用completionHandler

时间:2014-02-21 02:10:33

标签: ios iphone objective-c nsurlsession

我正在使用 NSURLSession 上传任务,使用以下代码段发送带有 JSON 数据的 HTTP POST 请求。

NSData* requestData = [json_string dataUsingEncoding:NSUTF8StringEncoding];
NSURLSession *session = [NSURLSession sharedSession];
NSURL *remote_url = [NSURL URLWithString:@"http://<some ip>:<port>"];
NSMutableURLRequest *request =
[[NSMutableURLRequest alloc] initWithURL:remote_url];
[request setHTTPMethod:@"POST"];
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:requestData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSLog(@"response received...");
}];

NSLog(@"log before resume");
[uploadTask resume];
NSLog(@"log after resume");

我确实在服务器端接收数据,服务器发送 HTTP 200响应。然而,

NSLog(@"log after resume");
NSLog(@"response received...");

永远不会被召唤。为什么resume会阻止而永远不会调用completionHandler

1 个答案:

答案 0 :(得分:0)

我没有看到您的代码存在明显问题。也许您的session.delegateQueue被屏蔽了?

另一个方法:您可以跳过完成处理程序块,并尝试设置NSURLSession.delegate属性,并使用NSURLSessionTaskDelegate回调,以查看是否可以使其工作。例如,

@interface DelegateClass <NSURLSessionTaskDelegate>
@end

@implementation DelegateClass

(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"%s %@", __PRETTY_FUNCTION__, task.response);
}

@end

// ...

NSURLSession *session = [NSURLSession sharedSession];
session.delegate = [[DelegateClass alloc] init];
// ...

NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:requestData];
[uploadTask resume];

免费命名建议:自己一直走在这条路上,我相信你会通过承诺惯用的CamelCase名称(与使用snake_cased json_stringremote_url混合)来节省不必要的焦虑。