【发布时间】:2012-08-07 10:03:49
【问题描述】:
我知道每种工作方式之间的区别,但我想从性能角度了解(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 会同时运行队列。
提前致谢。我真的很想澄清这个问题。
【问题讨论】:
-
GCD 不会在这个队列上同时运行,因为你已经创建了一个 serial 队列。对于并发队列,您必须传入 DISPATCH_QUEUE_CONCURRENT 参数。但是,它可以与 other 队列并行运行。
-
@borrrden 如果我理解正确,这个队列将在设备上同时运行,我添加到这个队列的其他块或任务将连续运行,然后我只有一个块,所以它不相关.根据文档:您可以根据需要创建任意数量的串行队列,并且每个队列相对于所有其他队列同时运行。换句话说,如果您创建四个串行队列,每个队列一次只执行一个任务,但最多仍可以同时执行四个任务,每个队列一个。
-
@borrrden 哈哈,原来不是这么说的!但没关系,我们的意思是一样的。
-
@borrrden 对原始问题并不重要,但要澄清一下:iOS 目前不支持 DISPATCH_QUEUE_CONCURRENT(仅限 Mac OS X 10.7 或更高版本),因此手动创建的队列是串行的。不过,全局队列是并发的。见Concurrency Programming Guide。
-
@RobertRyan 网上各种消息称 iOS 5 也支持它,在 queue.h 中它甚至被标记为从 iOS 4.3 开始可用
标签: ios concurrency nsurlconnection grand-central-dispatch