我要遍历大约2000多个项目:
for (NSDictionary* dict in array) {
NSString *fileName = [NSString stringWithFormat:@"%@/%@_lg.jpg?t=",manufacturerID, [[dict valueForKey:@"ItemID"] stringByReplacingOccurrencesOfString:@" " withString:@"%20"]];
NSString *savePath = [documentsPath stringByAppendingPathComponent:fileName];
NSURL *url = [NSURL URLWithString: [[NSString stringWithFormat:kProductImagesURL, fileName]stringByAppendingString:lastImagesSyncDate]];
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_async(aQueue, ^{
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
int statusCode = [request responseStatusCode];
if (statusCode==200) {
NSData *responseData = [request responseData];
[responseData writeToFile:[savePath stringByReplacingOccurrencesOfString:@"%20" withString:@" "] atomically:YES];
}
}
});
}
这很好用,我的主线程没有被阻塞,但是我的记忆却如日中天-如何释放它?一旦队列为空,它就会掉落,但是我需要随着队列的进行清除。
最佳答案
尽管您在后台运行代码,但同时在后台运行所有代码。以最快的速度,您可以遍历数组,创建一个新的ASIHttpRequest,它将尝试同时下载和保存数据。您可能希望将循环移到dispatch_async
内,或使用做相同操作但限制NSOperation
上的最大并发操作数的NSOperationQueue
。如果将循环移动到dispatch_async
内部一次一次,请记住在本地创建一个NSAutoreleasePool
并定期将其消耗掉。