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_];*/
});
唯一の「小さな」問題は、メモリが増加し、すべてのファイルが完全にダウンロードされるまでキャッシュを保持し、現時点でのみメモリが解放されることです。ダウンロードするファイルが何百もありますが、これは問題です。どうすればこれを解決できますか?
また、各 nsurlrequest でシリアル ブロックが保持している強力な保持サイクルを削除するために、キャッシュを解放または無効化 (ARC を使用しています) するにはどうすればよいですか? すべてのオブジェクト(特にURLキャッシュ)を解放するためにキューが完了すると、GCDが何をするのか本当にわかりません。