iPhone - Grand Central Dispatch не работает правильно на iPhone 4S - PullRequest
3 голосов
/ 18 ноября 2011

У меня есть это приложение, созданное для iPhone 4, когда оно было запущено.Теперь это приложение не работает на iPhone 4S.

Я идентифицировал секцию преступника как часть GCD.Вот оно:

dispatch_group_t my_group = dispatch_group_create();

dispatch_queue_t queue1 = 
        dispatch_queue_create("Queue 1", NULL);

dispatch_queue_t queue2 = 
        dispatch_queue_create("Queue 2", NULL);


dispatch_group_async(my_group, queue1, ^{
        [self doStuff1];
});

dispatch_group_async(my_group, queue2, ^{
        [self doStuff2];
});

dispatch_group_notify(my_group, dispatch_get_main_queue(), ^{
 // this is block 3, this is to be executed after both queues end processing
 // this is never executed on iPhone 4S, but is executed on iPhone4
 // no error message, but execution never starts inside this block
});

Идея такова: создаются две очереди и группа.Я запускаю задачи для обеих очередей, асинхронно, используя группу.Когда оба завершены, группа запускает еще один блок задач.

Это прекрасно работает на iPhone 4, но последний блок 3 так и не был достигнут.

Есть причина для этого?Любые подсказки?

спасибо.

Ответы [ 2 ]

5 голосов
/ 19 ноября 2011

Возможно, doStuff1 и doStuff2 заблокированы или что-то еще блокирует основной поток? В отличие от 4, 4S имеет несколько ядер, поэтому может случиться так, что вы столкнулись с некоторыми проблемами многопоточной блокировки, которых раньше не видели.

Вы уверены, что оба блока на самом деле заканчиваются, и что основной поток доступен для запуска результирующего блока? Возможно, какой-то полный код (т. Е. Тела doStuff1 и 2) поможет?

2 голосов
/ 19 ноября 2011

Первое, что я хотел бы сделать, это изменить код на dispatch_async все в очереди 1;очевидно, вы не получите параллелизма, но сразу узнаете, сталкиваются ли dostuff1 и dostuff2 как-то, если проблема немедленно исчезнет.На одноядерном компьютере это, вероятно, поведение, которое вы видели раньше.

...