Ios NSURLSession上载任务不存在';t调用completionHandler

Ios NSURLSession上载任务不存在';t调用completionHandler,ios,iphone,objective-c,nsurlsession,Ios,Iphone,Objective C,Nsurlsession,我正在使用nsursession上传任务发送httppost请求,其中包含JSON数据和以下代码片段 NSData* requestData = [json_string dataUsingEncoding:NSUTF8StringEncoding]; NSURLSession *session = [NSURLSession sharedSession]; NSURL *remote_url = [NSURL URLWithString:@"http://<some ip>:<

我正在使用nsursession上传任务发送httppost请求,其中包含JSON数据和以下代码片段

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");

从来没有人打过电话。为什么
resume
阻止并从不调用
completionHandler

我看不出您的代码有明显的问题。可能您的
会话.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];
@接口DelegateClass
@结束
@DelegateClass的实现
(void)URLSession:(NSURLSession*)会话任务:(NSURLSessionTask*)任务未完成错误:(NSError*)错误
{
NSLog(@“%s%@”,函数,任务.response);
}
@结束
// ...
NSURLSession*会话=[NSURLSession sharedSession];
session.delegate=[[DelegateClass alloc]init];
// ...
NSURLSessionUploadTask*uploadTask=[会话uploadTaskWithRequest:RequestFromData:requestData];
[上传任务恢复];

免费命名建议:我自己也有过这样的经历,我相信你可以通过使用惯用的骆驼壳名称(而不是与snake\u cased
json\u string
remote\u url
)来避免不必要的焦虑。

但这些都不能解释为什么他的代码不起作用。如何阻止代理队列?第一点:如果委托回调有效,但完成处理程序没有,这将是一个很好的线索。奖励:工作代码。第2点:这可能是一个长期的问题,但共享会话的
委派队列是否不可能被阻止?是否可能您在服务器端做了一些错误的事情?我在[uploadTask resume]之后没有遇到阻止问题,但由于我将模拟器更新为iOS 10,对我来说,执行永远不会达到完成阶段。在iOS9之前,无论成功与否,它都能达到目标。
@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];