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

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

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

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

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

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

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

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

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

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

4 Solutions collect form web for “Как вызвать метод как можно скорее, но как можно скорее в следующей итерации цикла запуска?”

Если вы беспокоитесь о том, что 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

Сохранение файлов cookie в приложении iOS?

Класс не читается … Неизвестный тип имени

LaunchScreen xib и отображение номера версии приложения из plist

Разница между _ и «я». в Objective-C

Создание анимации анимации вращающегося круга

пользовательский UIButton с изображением

Почему мой UIScrollView становится рендерингом медленным после добавления усилий теневого слоя к каждому UIImage, которые являются областями моего scrollview?

iOS: Почему кнопка выхода из системы Facebook отображается неправильно?

Приложение Meteor / Cordova / Phonegap iOS не работает при развертывании в производство

iOS симулятор и gps

Ошибка при использовании

Тип «Любой?» не имеет элементов подписи (используя Firebase)

Apple Maps, Raster Overlays Над ярлыками – не удалось декодировать

Отключите масштабирование div, но позвольте увеличить страницу (альтернативный div)

Совместимы ли поворотные представления с Auto Layout?

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.