为什么在单独的线程中使用异步HTTP请求而不是同步HTTP?

时间:2012-08-10 05:29:14

标签: ios concurrency nsurlconnection grand-central-dispatch

我知道每种方法的工作方式之间的区别,但我想以性能明智的观点(iphone中的资源)知道。

假设我发送了一个异步请求并等待代理被调用。这不会锁定我的执行线程。但是这样做与仅在另一个线程中使用GCD发送同步请求的区别是什么。

像这样:

dispatch_queue_t findPicsQueue;

findPicsQueue = dispatch_queue_create("FindPicsQueue", NULL);


dispatch_async(findPicsQueue, ^{

    NSData *theResponse = [NSURLConnection sendSynchronousRequest:theRequest
                                                        returningResponse:&response
                                                                    error:&error];

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;

    if (error) {
       NSLog(@"Error: %@",error)
    }

    if (httpResponse.statusCode == 200) 
    {
        [self parseXMLFile:theResponse]; // Parses Data and modifies picturesFound

        for (PictureData *tmp in picturesFound) {
            NSLog(@"%@",tmp);
        }          
    }  
}

它不会锁定我的界面,因为它没有在主线程中执行,但它会锁定这个特定的线程。而且我也认为GCD同时运行队列。

提前致谢。我真的想澄清这个问题。

1 个答案:

答案 0 :(得分:5)

如果对NSURLConnection使用sendAsynchronousRequest,那么几乎所有处理都在主线程上进行,特别是,XML解析将在主线程上完成。但是,您的代码示例使用不同的线程进行处理。

如果您的iPhone或iPad处理器有两个内核,则这种差异很大。然后,XML解析可以与主线程上的某些UI活动并行运行(在您的示例中)。因此,与在主线程上运行所有内容(sendAsynchronousRequest方法)相比,它可以更早完成。

对于只有一个核心的旧设备,一次只能运行一个线程,这两种方法的行为几乎相同。