Выполнение селектора в начале / конце цикла выполнения

Все события и методы в 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)

Другие вопросы по тегам