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

标签 ios concurrency nsurlconnection grand-central-dispatch

我知道每个工作方式之间的差异,但我想从性能方面了解(iphone 内的资源)。

假设我发送了一个异步请求并等待委托(delegate)被调用。这不会锁定我的执行线程。但是,这样做与仅使用 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 同时运行队列。

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

最佳答案

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

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

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

关于ios - 为什么在单独的线程中使用异步 HTTP 请求而不是同步 HTTP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11895965/

相关文章:

ios - swift 中的微分函数?

c++ - C++11 中的线程移动

objective-c - 奇怪的内存泄漏? NSURLConnection 和 NSMutableData 对象

go - 如何从多个 goroutine 写入同一个 channel

objective-c - 从后台线程到服务器的异步请求

ios - 有些值无法通过 nsurl 发送?

ios - 显示空白屏幕的webview屏幕截图

ios - Swift - 如何在表格 View 单元格中显示视频的缩略图捕获?

ios - swift 3 : Add text to label if button is pressed

java - 异步通知 BlockingQueue 有可用项