我要遍历大约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并定期将其消耗掉。

07-26 09:40