GCD串行(FIFO)队列,NSURLConnection sendSynchronousRequest(或NSData



我有一个表,有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);

最新更新