AFURLConnectionOperation 在第二次下载开始后停止调用 downloadProgressBlock

Posted

技术标签:

【中文标题】AFURLConnectionOperation 在第二次下载开始后停止调用 downloadProgressBlock【英文标题】:AFURLConnectionOperation stops calling downloadProgressBlock after second download is started 【发布时间】:2014-10-03 12:12:16 【问题描述】:

我正在使用 AFNetworking,并且我有一个 AFURLConnectionOperation 来下载文件 - 如下所示:

AFURLConnectionOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
[operation setDownloadProgressBlock:^(NSUInteger bytesRead,long long totalBytesRead,long long totalBytesExpectedToRead) 
    // Update progress stuff
];
[operation setCompletionBlock:^
    // Do completion stuff
];
[operation start];

此代码包含在一个方法中,并且运行良好....直到我尝试下载第二个文件。

此时,第一个操作的downloadProgressBlock 完全停止调用。 但是,第一次下载仍在继续,最后调用completionBlock - 只是没有任何进度更新。

我认为这可能与保留/ARC/其他任何东西有关,但老实说我不知道​​ - 这对我来说没有意义。一切正常,直到第二次下载开始,尽管这些方法是单独调用的,operation 变量和进度块不相互依赖,相互引用或做任何彼此相关的事情!

编辑:我还没有找到这个问题的原因/解决方案,但我找到并发布了一个解决方法,使用不同的 AFNetworking 方法下载文件。如果有人可以解决原始问题,请发布答案,我将奖励您。

【问题讨论】:

【参考方案1】:

我从未解决过这个问题,但我找到了解决方法。问题中的示例代码来自 AFNetworking 早期版本的 wiki。我再次检查了一下,现在他们似乎已经更新了他们建议的下载文件的方法,所以我现在正在使用这段代码:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSProgress *progress;

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) 
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
 completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) 
    NSLog(@"File downloaded to: %@", filePath);
];
[downloadTask resume];

结合this *** answer 观察NSProgress 更新。这完美地工作并实现了我想要的行为,尽管它有点复杂。

【讨论】:

以上是关于AFURLConnectionOperation 在第二次下载开始后停止调用 downloadProgressBlock的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中覆盖 Objective-C 的只读属性?

如何在 Swift 中覆盖 Objective-C 的只读属性?