Ios NSURLSession downloadTaskWithURL返回nill

Ios NSURLSession downloadTaskWithURL返回nill,ios,ios7.1,nsurlsession,nsurlsessiondownloadtask,Ios,Ios7.1,Nsurlsession,Nsurlsessiondownloadtask,我在应用程序中遇到了NSURLSessionDownloadTask的问题,我用代码创建了数百个下载任务: NSURLSessionDownloadTask * task = [_urlSession downloadTaskWithURL:downloadUrl]; NSLog(@"session: %@, download task %@ for url: '%@'",_urlSession, task, downloadUrl); if (!task) { N

我在应用程序中遇到了NSURLSessionDownloadTask的问题,我用代码创建了数百个下载任务:

NSURLSessionDownloadTask * task = [_urlSession downloadTaskWithURL:downloadUrl];
NSLog(@"session: %@, download task %@ for url: '%@'",_urlSession, task, downloadUrl);
if (!task)
{
     NSLog(@"ooops no task");
}else
{

} 
在xcode控制台中,我有如下消息:

2014-03-28 11:23:39.297 MYAPP[3838:60b] session: <__NSCFURLSession: 0x19471e70>, download task (null) for url: 'http://xxx.cloudfront.net/seminarcontent/nsm_photos_11_24d8505e-4ddd-4e9b-baef-a90d5e322702.jpg'
所有URL均有效,仅当我在应用程序启动后立即开始下载时才会发生这种情况

请分享你对我的问题的看法。提前谢谢

更新:

我还添加了对缓存目录的检查,确保在开始下载之前该目录存在,但没有任何更改

编辑
其他信息,我无法在模拟器中或在调试模式下(启用断点)的设备上重现该错误。

最后,在调试了几天之后,我找到了部分解决方案

  @synchronized(_urlSession)
  {
      task = [_urlSession downloadTaskWithURL:downloadUrl];
  }
我在代码中添加了锁,现在一切正常,但我想这不是一个解决方案,只是一种避免问题的方法


感谢@Jody Hagins提供的非常有用的评论。

nsnetworkd是代表您进行后台下载的守护程序。它将下载的URL存储在临时/专用位置。它失败,因为它无法创建用于存储下载文件的临时文件。错误2是
enoint
,在本例中,这意味着目录不存在。您是否可能更改了应用程序id?你在模拟器里。你为什么不打开一个终端,转到那个目录呢。另外,记录应用程序实际使用的缓存目录。也许守护进程和你的应用程序对应用程序id感到困惑。@JodyHagins感谢大家关注我的问题。我和你一样理解这个错误,但不知道为什么会发生这种情况,我没有更改bundleId,也无法在模拟器中重现。因此,如果这是在设备上发生的,可能是某种错误或竞争条件。但我从未见过这种情况发生。我建议您创建会话,然后调用
getTasksWithCompletionHandler:
。在完成处理程序中,忽略返回的任务。。。它很可能是空的,即使守护进程有任务。。。然后开始下载请求。该调用至少应该与守护进程(或某些共享数据结构)进行某种通信。无论如何,回调将位于会话的委托队列上,并且可能在启动时避免此竞争条件。此外,您知道它将创建Library/Caches/com.apple.nsnetworkd/,因此您可以先创建该目录,尽管它可能使用特殊凭据创建,并且您的创建可能会导致问题。。。我承认我没有遇到过这个问题,我也没有在目录结构创建之后检查它。。。但这值得一试。FWIW,我已经使用了很多后台任务机制,并且发现了很多问题,所以如果出现问题,我不会感到惊讶。。。但总的来说,这个功能非常棒。
_urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration  backgroundSessionConfiguration:sessionIdenttificator] delegate:self delegateQueue:nil];
  @synchronized(_urlSession)
  {
      task = [_urlSession downloadTaskWithURL:downloadUrl];
  }