Ios NSURLSession上载任务不存在';t调用completionHandler
我正在使用nsursession上传任务发送httppost请求,其中包含JSON数据和以下代码片段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>:<
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];