Выполнение селектора в начале / конце цикла выполнения
Все события и методы в iOS обрабатываются с использованием NSRunLoop
: пользовательские события, вызовы методов, ротации, таймеры, соединения и т. д.
Мой вопрос:
Как я могу выполнить селектор в точный момент цикла выполнения как начало и конец?
2 ответа
Вы можете создать CFRunLoopObserver
который вызовет блок при входе и выходе из цикла. Ты используешь CFRunLoopAddObserver
добавить своего наблюдателя в цикл выполнения и CFRunLoopGetMain
чтобы получить цикл выполнения для добавления.
Вот довольно бессмысленный пример их использования:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(NULL, (kCFRunLoopEntry | kCFRunLoopExit), YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity)
{
static unsigned long count = 0;
NSLog(@"activity %lu: %@", ++count, (activity & kCFRunLoopEntry ? @"Enter" : @"Exit"));
});
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
}
Это просто устанавливает наблюдателя, который регистрирует каждый вход и выход в цикл выполнения. Вы можете запустить его как законченное приложение в XCode и посмотреть, сколько раз цикл выполнения проходит.
Обратите внимание, что CFRunLoopObserverCreateWithHandler
возвращает ссылку, которой вы владеете, если вы удалите наблюдателя, за который вы несете ответственность.
Я преобразовал принятый код ответа @CRD в версию Swift.
let observerRef = CFRunLoopObserverCreateWithHandler(nil, CFRunLoopActivity.entry.rawValue | CFRunLoopActivity.exit.rawValue, true, 0) { observer, activity in
// Do something in RunLoop
}
CFRunLoopAddObserver(CFRunLoopGetMain(), observerRef, .commonModes)