多个NSUrlConnection同时运行

时间:2011-09-22 10:31:40

标签: iphone ios

在我的应用程序中,有一个函数可以通过HTTP URLConnection下载文件,并将接收的数据写入并附加到文件中。这是一些音乐文件,需要几分钟才能完成下载。在下载过程中,用户可能需要从服务器请求一些其他JSON数据。

问题是,我遇到的是请求被延迟,直到第一次连接(下载音乐文件)完成。它们都分成2个不同的对象,并由不同的类调用。

我也尝试用NSThread启动它们

[NSThread detachNewThreadSelector: @selector(threadDownload) toTarget: self withObject: nil ];

然而,第二个请求仍在等待第一个请求完成,并且由于下载时间过长,第二个请求会超时并出错。

希望您就如何克服此类问题发表意见?

4 个答案:

答案 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。它易于集成,可以为您处理所有并发背景内容。

以下是网址:http://allseeing-i.com/ASIHTTPRequest/

答案 3 :(得分:0)

您可以尝试这个名为ASIHTTPRequest的库,它可以做很多事情(我刚刚在几分钟前发布了相同的答案)。您可以有多个请求(异步),这应该可以解决您的问题。它非常易于使用。