我知道每种方法的工作方式之间的区别,但我想以性能明智的观点(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同时运行队列。
提前致谢。我真的想澄清这个问题。
答案 0 :(得分:5)
如果对NSURLConnection
使用sendAsynchronousRequest
,那么几乎所有处理都在主线程上进行,特别是,XML解析将在主线程上完成。但是,您的代码示例使用不同的线程进行处理。
如果您的iPhone或iPad处理器有两个内核,则这种差异很大。然后,XML解析可以与主线程上的某些UI活动并行运行(在您的示例中)。因此,与在主线程上运行所有内容(sendAsynchronousRequest
方法)相比,它可以更早完成。
对于只有一个核心的旧设备,一次只能运行一个线程,这两种方法的行为几乎相同。