我有一个表,有N行。每一行都连接到一个文件下载,所以我需要做音频文件的串行队列下载。每一行必须显示一个小图标,以显示该文件是正在下载还是在排队等待。当音频文件完全下载后,我用NSNotifications更新UI,然后直接传递下载下一个。到目前为止,我想出了这个,它运行良好。
swpadq.queue = dispatch_queue_create("com.audioDownload", DISPATCH_QUEUE_SERIAL);
dispatch_async(_queue, ^{
NSURLRequest *urlRequest_ = [NSURLRequest requestWithURL:audioURL_
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60.0f];
NSError *error_;
NSLog(@"downloading %@", [audioURL_ absoluteString]);
NSData *data_ = nil;
data_ = [NSData dataWithContentsOfURL:audioURL_
options:NSDataReadingUncached
error:&error_];
/*data_ = [NSURLConnection sendSynchronousRequest:urlRequest_
returningResponse:nil
error:&error_];*/
});
唯一的"小"问题是内存正在增长,保持缓存,直到所有的文件被完全下载,只有在这一刻,内存被释放。我有数百个文件要下载,这是个问题。我怎么解决这个问题?
而且,我如何释放或取消(我使用ARC)缓存,以删除串行块在每个nsurlrequest上持有的强保留周期?我真的不明白GCD是怎么做的,当队列完成时,为了释放所有的对象(特别是url缓存)。
需要串行队列有什么特别的原因吗?下载必须以特定的顺序一个接一个地完成吗?如果不是,那么尝试使用并发队列。全局并发队列可以通过以下方式获取:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);