在我的应用程序中,有一个函数可以通过HTTP URLConnection下载文件,并将接收的数据写入并附加到文件中。这是一些音乐文件,需要几分钟才能完成下载。在下载过程中,用户可能需要从服务器请求一些其他JSON数据。
问题是,我遇到的是请求被延迟,直到第一次连接(下载音乐文件)完成。它们都分成2个不同的对象,并由不同的类调用。
我也尝试用NSThread启动它们
[NSThread detachNewThreadSelector: @selector(threadDownload) toTarget: self withObject: nil ];
然而,第二个请求仍在等待第一个请求完成,并且由于下载时间过长,第二个请求会超时并出错。
希望您就如何克服此类问题发表意见?
答案 0 :(得分:1)
老实说,我不理解您的抱怨,因为 NSURLConnection 默认是异步的,除非您明确使用 sendSynchronousRequest:returningResponse:error:。 对于“正常使用”,即:使用 initWithRequest初始化:委托:然后调用 start ,该类将处理后台线程中的所有进程并返回到main线程只调用指定的委托。
答案 1 :(得分:1)
使用GCD,非常简单,所有线程都是透明完成的。
示例:
__block NSMutableArray *imageURLList = [NSMutableArray array];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (Helper *siteURL in list) {
dispatch_async(queue, ^{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:siteURL]];
NSURLResponse *response;
NSError *error;
NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (urlData.length)
[imageURLList urlData];
});
}
请注意,该块是异步执行的,因此可以使用sendSynchronousRequest:
。
如果循环不起作用,只需提出个别请求。
答案 2 :(得分:0)
这个东西最好的选择是使用ASIHTTPRequest。它易于集成,可以为您处理所有并发背景内容。
答案 3 :(得分:0)
您可以尝试这个名为ASIHTTPRequest的库,它可以做很多事情(我刚刚在几分钟前发布了相同的答案)。您可以有多个请求(异步),这应该可以解决您的问题。它非常易于使用。