0

我有一张桌子,有 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 上持有的强保留周期?当队列完成以释放所有对象(尤其是 url 缓存)时,我真的不明白 GCD 做了什么。

4

1 回答 1

0

您需要串行队列有什么特别的原因吗?下载必须以特定的顺序一个接一个地完成吗?如果没有,请尝试使用并发队列。您可以通过以下方式获取全局并发队列:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

于 2013-08-28T05:18:33.443 回答