GCD串行(FIFO)队列,NSURLConnection sendSynchronousRequest(或NSData dataWithContentsOfURL)和内存管理

时间:2013-01-10 08:33:48

标签: networking memory-management queue grand-central-dispatch

我有一张桌子,有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的作用。

1 个答案:

答案 0 :(得分:0)

您是否需要序列队列?下载必须按特定顺序一个接一个地完成吗?如果没有,那么尝试使用并发队列。您可以按如下方式获取全局并发队列:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);