我正在使用 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
?
答案 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_string
和remote_url
混合)来节省不必要的焦虑。