[英]Concurrent Queue with GCD? (iOS 4.2.1)
我遇到问题:
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL);
concurrentQueue
在iOS 4.2.1(设备)上为nil
,但相同的代码在另一台运行iOS 5.0.1的设备上运行良好。
当我检查标题时它说自iOS 4.0以来它可用,我做错了吗?
下面的代码从互联网上获取图像,并且在4.2.1之后的所有内容中都运行良好但在4.2.1中没有,任何想法为什么? 您可以使用GCD以其他方式创建并发队列吗?
- (void)imageFromURL:(NSString*)link {
if ([link length] == 0)
return;
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL);
if (concurrentQueue == nil)
return;
dispatch_async(concurrentQueue, ^{
__block UIImage* image = nil;
dispatch_sync(concurrentQueue, ^{
NSError *error = nil;
NSURL *url = [[NSURL alloc] initWithString:link];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSData *imageData = [NSURLConnection sendSynchronousRequest:request
returningResponse:nil
error:&error];
if ( error == nil && imageData != nil) {
image = [UIImage imageWithData:imageData];
} else {
DLog(@"%@", [error description]);
}
if ([self.delegate respondsToSelector:@selector(setImage:)]) {
dispatch_sync(dispatch_get_main_queue(), ^{
[self.delegate setImage:image];
});
}
});
});
}
看来DISPATCH_QUEUE_PRIORITY_BACKGROUND
仅适用于iOS 5.0及更高版本。
DISPATCH_QUEUE_PRIORITY_BACKGROUND调度到队列的项目以后台优先级运行; 在调度所有高优先级队列并且系统在优先级设置为后台状态的线程上运行项目之后,计划执行队列。 这样的线程具有最低优先级,并且任何磁盘I / O都受到限制,以最小化对系统的影响。 适用于iOS 5.0及更高版本。
在用户运行iOS 4的情况下,您可以使用DISPATCH_QUEUE_PRIORITY_LOW
,然后对iOS 5及更高版本使用DISPATCH_QUEUE_PRIORITY_BACKGROUND
。
编辑
如果你在这种情况下没有仔细阅读,那么文档有点误导。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.