与GCD同时排队? (iOS 4.2.1)
Iam有问题:
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创build一个并发队列吗?
- (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都会受到限制,以最大限度地减less对系统的影响。 在iOS 5.0及更高版本中可用。
在这里find
在用户运行iOS 4的情况下,您可以使用DISPATCH_QUEUE_PRIORITY_LOW
,然后在iOS 5及更高版本中使用DISPATCH_QUEUE_PRIORITY_BACKGROUND
。
编辑
如果在这种情况下没有仔细阅读,文档有点误导。
- 澄清dispatch_queue,重入和死锁
- NSOperationqueue背景,下载图片
- multithreading:只有在完成执行其他方法后才执行方法调用
- 如何在asynchronous块内为dispatch_group_async调度dispatch_group_wait
- 如何在Swift 2.0中创build一个dispatch_block_t数组?
- asynchronousswift 3
- 核心数据保存对象在后台问题
- Swift 3:DispatchQueue.main.async {}和DispatcQueue.main.async之间的区别(execute:{})?
- 如果我嵌套dispatch_async调用会发生什么?