我需要经历一个大约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];
}
}
});
}
这很好用,我的主要线程没有被阻止,但我的记忆遍布屋顶 - 我如何让它被释放?一旦队列为空,它就会掉线,但我需要它清理出来。
答案 0 :(得分:3)
虽然您在后台运行代码,但您同时在后台运行所有代码。您可以快速遍历阵列,创建一个新的ASIHttpRequest,它将尝试同时下载和保存数据。您可能希望在dispatch_async
内部移动循环,或使用执行相同操作但限制NSOperation
上的最大并发操作的NSOperationQueue
。如果您将dispatch_async
内的循环移动到一次执行一个循环,请记住在本地创建NSAutoreleasePool
并定期消耗它。
答案 1 :(得分:0)
ASIHTTPRequest
。