Как вызвать метод как можно скорее, но как можно скорее в следующей итерации цикла запуска?

Мне нужно сохранить способ сказать: «iOS, я хочу, чтобы этот метод выполнялся как можно скорее, но НЕ в этой итерации цикла запуска. В ближайшее время, но, пожалуйста, не в этом. Спасибо».

Сейчас я всегда делаю это так:

[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0]; [self doSomeOtherThings]; 

С предположением, что -doSomeOtherThings всегда будет выполняться до -doSomethingInNextRunLoop .

В документации говорится:

Указание задержки 0 не обязательно приводит к тому, что селектор будет выполняться немедленно. Селектор все еще поставлен в очередь на цикл выполнения потока и выполняется как можно скорее.

Так что в принципе может случиться так, что метод будет вызван немедленно, как если бы я только что отправил прямое сообщение, вызвав -doSomethingInNextRunLoop для выполнения перед -doSomeOtherThings ?

Как я могу сделать абсолютно уверенным, что он будет вызван как можно скорее, но НИКОГДА никогда в этой же итерации цикла запуска?

Чтобы прояснить формулировку: с циклом запуска я имею в виду основной поток и итерацию, в которой все методы должны возвращаться, пока поток не будет готов снова для новых событий.

Если вы беспокоитесь о том, что Apple может когда-нибудь в специальном случае задержать 0, вы всегда можете указать задержку в 1е-37 или около того. Хотя документация для performSelector:withObject:afterDelay: может быть легко прочитана, чтобы гарантировать, что селектор всегда будет запланирован для следующей итерации цикла запуска.

Если вы беспокоитесь о том, что Apple может когда-нибудь задерживать специальные случаи меньше, чем какая-либо произвольная нижняя граница, вы всегда можете попробовать использовать параметр NSRunLoop performSelector:target:argument:order:modes: который конкретно указывается в документации, запланирует выполнение для следующей итерации .

Довольно тривиально, используя GCD (Grand Central Dispatch):

 dispatch_async (dispatch_get_main_queue (), ^{ NSLog (@"This stuff runs in the next iteration of the main run loop"); }); 

Я думаю, что вывод из чтения документации неверен.

Таким образом, в основном может случиться так, что метод вызывается немедленно, как если бы я только что отправил прямое сообщение

Нет. В приведенной вами документации указано, что селектор всегда ставится в очередь в цикле выполнения, несмотря ни на что. Таким образом, он никогда не будет выполнен как прямое сообщение.

Первое предложение с «не обязательно» могло бы немного ввести в заблуждение, но я думаю, что второе предложение должно действительно разъяснить, что вы боитесь, что это не гонг.

Конечно, вы просто это делаете;

 [self doSomeOtherThings]; [self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0]; 

Это гарантирует заказ выполнения, который вы хотите.

Interesting Posts

iOS – приложение «Речь в текст» с использованием Swift

WKWebView внутри UIScrollView: прокручивание конфликта

Ошибка при использовании Alamofire для загрузки изображения

Можно ли предоставить дополнительную информацию о моем приложении для поиска системы?

Кордова / Phonegap – пользовательский корневой путь iOS-файловой системы iOSExtraFilesystems не работает

Subview отображается неправильно

Запись огромных кусков данных в объекты NSData-iOS

Позиция NSTextAttachment внутри UILabel?

Не удается поделиться ссылкой с помощью UIActivityViewController

swift iOS – изображения UICollectionView перемешались после быстрой прокрутки

CABasicAnimation animate (поиск) по позиции во времени по всей временной шкале

Идентификатор приложения с идентификатором «com.example.app.extention» недоступен. Введите другую строку

Протокол внешних аксессуаров

iOS Bluetooth CBCharacteristic UUID устарел?

как я могу установить значок в панели вкладок в объективе-c?

Давайте будем гением компьютера.