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

Poc*_*chi 8 concurrency nsurlconnection grand-central-dispatch ios

我知道每个工作方式之间的区别,但我想从性能明智的角度来看(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);
        }          
    }  
}
Run Code Online (Sandbox Code Playgroud)

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

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

Cod*_*odo 5

如果使用NSURLConnectionsendAsynchronousRequest,那么几乎所有的处理都在主线程的地方,尤其是XML解析将对主线程上完成.但是,您的代码示例使用不同的线程进行处理.

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

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