8

我知道每个工作方式之间的区别,但我想从性能角度了解(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 会同时运行队列。

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

4

1 回答 1

5

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

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

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

于 2012-08-10T05:41:32.577 回答