2014-03-28 74 views
3

我有我的應用程序NSURLSessionDownloadTask問題,我創造幾百個下載任務,代碼:NSURLSession downloadTaskWithURL返回nill

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' 

此外,在主辦單位的控制檯我看到此消息:

nsnetworkd[322] <Error>: __NSCFLocalDownloadFile: error 2 creating temp file: /private/var/mobile/Applications/MYAPPGUID-BD21-4C5A-8DB6-845D80BE75E3/Library/Caches/com.apple.nsnetworkd/CFNetworkDownload_R91Hqn.tmp 

NSURLSession create d與前:

_urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdenttificator] delegate:self delegateQueue:nil]; 

所有URL都是有效的,這隻有當我剛過應用程序啓動

請分享我的問題,你的想法開始發生下載。提前致謝。

更新:

我還添加了檢查的緩存目錄,肯定是存在之前,我開始下載,但什麼都沒有改變

編輯

其他信息,我不能重現的bug模擬器或在調試模式下的設備上(啓用斷點)。

+1

nsnetworkd是代表您進行後臺下載的守護進程。它將下載的URL存儲在臨時/私人位置。它失敗了,因爲它無法創建存儲下載文件的臨時文件。錯誤2是'ENOENT',在這種情況下,這意味着該目錄不存在。是否有可能更改了您的應用ID?你在模擬器中。你爲什麼不實際調出一個終端並進入該目錄。另外,記錄您的應用程序真正使用的緩存目錄。也許守護進程和你的應用程序已經對應用程序ID感到困惑。 –

+0

@JodyHagins謝謝關注我的麻煩。我以同樣的方式理解這個錯誤,但不知道爲什麼發生這種情況,我不改變bundleId,並且我不能在模擬器中重現這一點。 – sage444

+0

因此,如果在設備上發生這種情況,它可能是一些錯誤或競爭條件。我從來沒有見過它發生。我建議你創建你的會話,然後調用'getTasksWithCompletionHandler:'。在完成處理程序中,忽略返回的任務......即使守護程序有任務...也很可能是空的,然後開始下載請求。這個調用至少應該與守護進程進行某種通信(或者一些共享的數據結構)。無論如何,回調將在會話的委託隊列中,並且可能會在啓動時避免這種競爭狀態。 –

回答

1

最後,調試了幾天後發現了部分解決方案。

@synchronized(_urlSession) 
    { 
     task = [_urlSession downloadTaskWithURL:downloadUrl]; 
    } 

我加的鎖我的代碼和現在的一切,應該工作,但我想這不是一個解決方案只是一種避免問題。

感謝@Jody Hagins提供了非常有幫助的意見。