_urlsession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration backgroundSessionConfiguration:IDentifIEr] delegate:self delegateQueue:nil];
这是在符合URLSessionDataTaskDelegate的类中创建的,具体定义:
– URLSession:dataTask:dIDReceiveResponse:completionHandler:– URLSession:dataTask:dIDBecomeDownloadTask:– URLSession:dataTask:dIDReceiveData:
然后,使用以下代码创建上载任务:
Nsstring *urlString = [Nsstring stringWithFormat:@"%@%@?filename=%@",HOST,UPLOAD_PATH,filename];NSMutableURLRequest *attachmentUploadRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];attachmentUploadRequest.httpMethod = @"POST";[attachmentUploadRequest addValue:@"application/binary" forhttpheaderFIEld:@"Content-Type"];NSURLSessionTask* task = [_urlsession uploadTaskWithRequest:attachmentUploadRequest fromfile:filePath];task.taskDescription = 'upload';
但是,我得到的委托回调序列并不像预期的那样:
URLSession:dIDReceiveChallenge:completionHandler:]:196: Respond with <NSURLCredential: 0x1cf4fe00>:URLSession:task:dIDSendBodyData:totalBytesSent:totalBytesExpectedToSend:]:282: Task 'upload' sent 32768 bytesURLSession:task:dIDSendBodyData:totalBytesSent:totalBytesExpectedToSend:]:282: Task 'upload' sent 48150 bytesURLSession:dataTask:dIDReceiveData:]:222: Task 'upload' got some data:
值得注意的是,正文数据按预期发送,但随后立即切换到dIDReceiveData委托回调,事先没有dIDReceiveResponse回调.这对我来说是一个意外的行为:我希望收到有关响应的信息,以便我可以正确设置数据,或者更好的是,将任务转换为下载任务以将响应保存到文件中.
如果在默认URL会话中提交上载任务,则调用dIDReceiveResponse,我可以成功将任务转换为后台下载任务.
我在Apple的文档中找不到任何关于是否应该为后台的NSURLSessionUploadTasks调用dIDReceiveResponse的指示.它们似乎应该:NSURLSessionUploadTask的文档表明它是NSURLSessionDataTask的子类,行为有少量修改,但是列出的差异都没有涉及不发送dIDReceiveResponse回调.没有任何特定于后台会话的文档提到此限制.
这是一个错误,还是错过/误解了一些文档,说明后台的上传任务不会调用dIDReceiveResponse?
解决方法 在最近的Tech Talks期间,我向Apple工程师询问了这一点.他们跟进并给出了以下响应 – 并不完全令人满意,如果它与任何其他http处理流程不同,我觉得他们应该记录这种行为.特别是因为前景行为确实获得了dIDReceiveData,但没有获得dIDReceiveResponse.他们至少需要记录这种非显而易见的行为.“今天的工作方式是我们不会发送dIDReceiveResponse回调用于后台上传,以避免在应用程序尚未运行时唤醒应用程序.缺点是应用程序无法选择将后台上传转换为下载任务我们的决定是基于期望文件上传的响应数据很小,因此将响应数据传递给客户端,因为NSData而不是下载的文件就可以了.“
总结以上是内存溢出为你收集整理的是否应该使用自定义委托为NSURLSessionUploadTasks调用didReceiveResponse?全部内容,希望文章能够帮你解决是否应该使用自定义委托为NSURLSessionUploadTasks调用didReceiveResponse?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)