Я хочу иметь возможность выполнить block
на следующей итерации цикла запуска. Не так важно, будет ли он выполняться в начале или в конце следующего цикла цикла, только это выполнение отложено до завершения всего кода в текущем цикле выполнения.Как вы планируете выполнение блока на следующей итерации цикла запуска?
Я знаю, что следующее не работает, потому что оно чередуется с основным циклом запуска, поэтому мой код может выполняться в следующем цикле выполнения, но он может и не быть.
dispatch_async(dispatch_get_main_queue(),^{
//my code
});
Ниже я считаю, страдает та же проблема, что и выше:
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^(void){
//my code
});
Теперь я считаю, следующее будет работать, как он будет помещен в конце цикла ток запуска (поправьте меня, если Я ошибаюсь), будет ли это работать?
[self performSelector:@selector(myMethod) withObject:nil afterDelay:0];
Как насчет таймера с 0
интервалом? В документации указано: If seconds is less than or equal to 0.0, this method chooses the nonnegative value of 0.1 milliseconds instead.
Выполняет ли это перевод для обеспечения выполнения на следующей итерации цикла запуска?
[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(myMethod) userInfo:nil repeats:NO];
Это все варианты, которые я могу думать, но я не все еще не ближе к выполнению блока (в отличие от вызова метода) на следующей итерации цикла запуска с гарантией того, что она не будет рано.
Спасибо за добавление деталей CFRunLoop. – lal
Это отличное резюме того, что делает цикл выполнения. Для вопроса OP я бы сказал, что 'CFRunLoopPerformBlock()' будет самым кошерным способом убедиться, что блок выполняется в следующем цикле цикла выполнения. В документах явно не указано, что блок не будет выполнен, если он добавлен в середине цикла, но они говорят: «Этот метод блокирует только блок и не запускает автоматически указанный цикл цикла, выполнение блока происходит в следующий раз, когда цикл запуска просыпается, чтобы обрабатывать другой источник ввода ». Вы можете проверить, добавив блок в обратный вызов наблюдателя. –