2

NSURLSessionDownload我使用任务和NSURLSession后台配置启动了一堆下载。大多数情况下一切正常,但有时回调方法中location指定的位置没有临时文件。delegate它发生在模拟器和设备上。这是代码,但一切看起来都非常简单,就像他们拥有 SimpleBackgroundTransfer 示例一样。

 ....
for (NSUInteger i = 0; i < 10; i++) {
    NSString *downloadURLString = ...;
    NSURLSessionDownloadTask *task = [[self backgroundURLSession] downloadTaskWithURL:[NSURL URLWithString:downloadURLString]];
    [task resume];
}
 ....


- (NSURLSession *)backgroundURLSession
{
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *identifier = @"com.yyy.backgroundTransfer";
        NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration         backgroundSessionConfiguration:identifier];
        session = [NSURLSession sessionWithConfiguration:sessionConfig
                                                delegate:self
                                           delegateQueue:[NSOperationQueue mainQueue]];
    });    

    return session;
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
    NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[location path]], nil);
    /// This assert gets triggered every now and then. Any idea why? 
    /// And downloadTask.originalRequest in fact has a valid download URL and the status code for the response in downloadTask it is 200
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
     NSLog(@"%s", __PRETTY_FUNCTION__);
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
     NSLog(@"%s", __PRETTY_FUNCTION__);
}

另外,奇怪的是,当这个奇怪的事情发生时,没有NSURLSessionDelegate调用其他方法,只是URLSession:downloadTask:downloadTask:location位置 URL 没有文件(downloadTask.originalRequest实际上有一个有效的下载 URL 和 downloadTask 中响应的状态代码是 200)。
如果发生这种奇怪的事情,它会发生在所有预定的下载中,就像系统根本无法创建文件一样。URLSession:downloadTask:downloadTask:location被立即调用。
重新启动设备/模拟器似乎总是有帮助。重新启动应用程序永远不会有帮助。
有没有人经历过这样的事情?

4

0 回答 0