GCD的并发队列? (iOS 4.2.1)

时间:2011-12-07 18:34:49

标签: ios ios4 grand-central-dispatch

我遇到问题:

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL);
iOS 4.2.1(设备)上的

concurrentQueuenil,但相同的代码在另一台运行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];
                });
            }           
        });
    }); 
}

1 个答案:

答案 0 :(得分:32)

似乎DISPATCH_QUEUE_PRIORITY_BACKGROUND仅适用于iOS 5.0及更高版本。

  

DISPATCH_QUEUE_PRIORITY_BACKGROUND   调度到队列的项目以后台优先级运行;在调度所有高优先级队列并且系统在优先级设置为后台状态的线程上运行项目之后,计划执行队列。这样的线程具有最低优先级,并且任何磁盘I / O都受到限制,以最小化对系统的影响。   适用于iOS 5.0及更高版本。

Found here

如果用户正在运行iOS 4,您可以使用DISPATCH_QUEUE_PRIORITY_LOW,然后使用DISPATCH_QUEUE_PRIORITY_BACKGROUND进行iOS 5及更高版本。

修改

如果你在这种情况下没有仔细阅读,那么文档会有一点误导。

enter image description here