【问题标题】:NSURLSession upload task doesn't call completionHandlerNSURLSession 上传任务不调用completionHandler
【发布时间】:2014-03-22 08:16:05
【问题描述】:

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

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

【问题讨论】:

  • 有没有可能是你在服务器端做错了什么?
  • 我没有遇到 [uploadTask resume] 之后的阻塞问题,但是自从我将模拟器更新到 iOS 10 后,执行对我来说也从未达到完成块。在此之前,iOS 9 总是成功或出错。

标签: ios iphone objective-c nsurlsession


【解决方案1】:

我认为您的代码没有明显问题。也许你的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 名称来避免不必要的焦虑(而不是与蛇形大小写 json_stringremote_url 混合使用)。

【讨论】:

  • 但是这些都不能解释为什么 他的 代码不起作用。以及如何阻塞委托队列?这是共享会话。
  • 第 1 点:如果委托回调有效,但完成处理程序无效,这将是一个很好的线索。奖励:工作代码。第2点:可能是一个很长的镜头,但是共享会话的delegateQueue被阻止是不可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
相关资源
最近更新 更多