iOS中的dispatch_async内存问题

时间:2011-06-28 15:09:57

标签: iphone ios grand-central-dispatch

我需要经历一个大约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];
                        }  
                    }
                });
            }

这很好用,我的主要线程没有被阻止,但我的记忆遍布屋顶 - 我如何让它被释放?一旦队列为空,它就会掉线,但我需要它清理出来。

2 个答案:

答案 0 :(得分:3)

虽然您在后台运行代码,但您同时在后台运行所有代码。您可以快速遍历阵列,创建一个新的ASIHttpRequest,它将尝试同时下载和保存数据。您可能希望在dispatch_async内部移动循环,或使用执行相同操作但限制NSOperation上的最大并发操作的NSOperationQueue。如果您将dispatch_async内的循环移动到一次执行一个循环,请记住在本地创建NSAutoreleasePool并定期消耗它。

答案 1 :(得分:0)

  1. 尝试分配,初始化,释放一个,而不是获得自动释放ASIHTTPRequest
  2. 没有尝试过,但考虑交替异步和同步调用(到同一个线程,而不是主线程),比如有20个异步请求后跟一个同步......这个技巧可能有所帮助。