Я испытываю что-то странное с GCD.
Сначала у меня есть метод, который выполняет тяжелые вычисления, а затем выполняет некоторые вычисления макета пользовательского интерфейса и обновляет пользовательский интерфейс на основе результатов.
Без GCD пользовательский интерфейс останавливается примерно на 0,5 секунды каждый раз, когда вызывается этот метод.
Итак, я пошел в GCD и сделал следующее:
// INIT
// stored in ivar (called only once!)
dispatch_queue_t q = dispatch_queue_create("com.testcompany.myqueue", NULL);
// WORK
dispatch_async(q, ^(void) {
[self performHeavyCalculationAndUpdateUI]; // modifies self.calculationData
});
После этого измененияЭтот метод занимает около 2-5 секунд , пока изменение не появится в пользовательском интерфейсе.
Рабочий код в -performHeavyCalculationAndUpdateUI:
, выполняющийся в последовательной очереди, вызывает некоторый код модификации пользовательского интерфейса в основной очереди (основной поток) способ Роберт Райан предложил здесь :
dispatch_async(dispatch_get_main_queue(), ^{
// Read ivars and objects used during calculation in the serial queue (problem?)
CalculationData *result = self.calculationData;
// UI updates like [foo addSubview:bar];
});
В основной очереди я также читаю некоторые ивары и объекты, которые использовались во время вычисления в последовательной фоновой очереди.Может ли это быть проблемой?
Это все еще занимает около 2-5 секунд, пока что-то не появляется.Намного дольше, чем без GCD.
Я не использую GCD нигде, кроме как здесь.
Кто-нибудь еще сталкивался с подобными проблемами с GCD и знает решение?
После нескольких часов я разобрался: Причина .