Параллельная очередь с GCD?(iOS 4.2.1) - PullRequest
9 голосов
/ 07 декабря 2011

У меня проблемы с:

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL);

concurrentQueue - это nil на iOS 4.2.1 (устройство), но тот же код отлично работает на другом устройстве с 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 Ответ

32 голосов
/ 07 декабря 2011

Похоже, DISPATCH_QUEUE_PRIORITY_BACKGROUND доступно только для iOS 5.0 и более поздних версий.

DISPATCH_QUEUE_PRIORITY_BACKGROUND Элементы, отправленные в очередь, работают с фоновым приоритетом;очередь запланирована для выполнения после того, как все очереди с высоким приоритетом были запланированы, и система запускает элементы в потоке, приоритет которого установлен для фонового состояния.Такой поток имеет самый низкий приоритет, и любой дисковый ввод-вывод регулируется, чтобы минимизировать влияние на систему.Доступно в iOS 5.0 и более поздних версиях.

Найдено здесь

В случае, если пользователь работает под управлением iOS 4, вы можете перейти с DISPATCH_QUEUE_PRIORITY_LOW и затем использовать DISPATCH_QUEUE_PRIORITY_BACKGROUND для iOS 5 и более поздних версий.

Редактировать

Документация немного вводит в заблуждение, если в этом случае вы не будете внимательно ее читать.

enter image description here

...