Понимание NSRunLoop

Может ли кто-нибудь объяснить, что такое NSRunLoop ? так как я знаю, что NSRunLoop – это что-то, что связано с NSThread ? Так что предположим, что я создаю Thread как

 NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil]; [th start]; -(void) someMethod { NSLog(@"operation"); } 

поэтому после того, как эта нить закончит его работу? зачем использовать RunLoops или где использовать? из документов Apple я прочитал что-то, но это не понятно для меня, поэтому, пожалуйста, объясните, насколько это возможно

Цикл запуска – это абстракция, которая (помимо прочего) обеспечивает механизм для обработки источников входных данных (сокетов, портов, файлов, клавиатуры, мыши, таймеров и т. Д.).

Каждый NSThread имеет свой собственный цикл запуска, к которому можно получить доступ через метод currentRunLoop.

В общем случае вам не нужно напрямую обращаться к циклу запуска, хотя есть некоторые (сетевые) компоненты, которые могут позволить вам указать, какой цикл цикла они будут использовать для обработки ввода-вывода.

Цикл выполнения для данного потока будет ждать, пока один или несколько его источников ввода не будут иметь некоторые данные или событие, затем запустите соответствующий обработчик (ы) ввода для обработки каждого входного источника, который «готов».

После этого он вернется в свою петлю, обработает входные данные из разных источников и «спят», если нет работы.

Это довольно высокое описание уровня (попытка избежать слишком большого количества деталей).

РЕДАКТИРОВАТЬ

Попытка ответить на комментарий. Я разбил его на части.

  • это означает, что я могу только получить доступ / запустить, чтобы запустить цикл внутри потока правильно?

В самом деле. NSRunLoop не является потокобезопасным и должен быть доступен только из контекста потока, который запускает цикл.

  • есть ли простой пример того, как добавить событие в цикл цикла?

Если вы хотите контролировать порт, вы просто добавите этот порт в цикл выполнения, а затем цикл выполнения будет следить за этим портом для активности.

 - (void)addPort:(NSPort *)aPort forMode:(NSString *)mode 

Вы также можете добавить таймер

 - (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode 
  • что означает, что он вернется в свою петлю?

Цикл запуска будет обрабатывать все готовые события на каждой итерации (в соответствии с его режимом). Вам нужно будет посмотреть документацию, чтобы узнать о режимах запуска, поскольку это немного выходит за рамки общего ответа.

  • запускает цикл неактивным, когда я запускаю поток?

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

  • возможно ли добавить некоторые события в цикл цикла Thread за пределами потока?

Я не уверен, что вы имеете в виду здесь. Вы не добавляете события в цикл выполнения. Вы добавляете источники входного сигнала и источники таймера (из потока, которому принадлежит цикл запуска). Затем цикл цикла отслеживает их активность. Разумеется, вы можете обеспечить ввод данных из других потоков и процессов, но ввод будет обрабатываться циклом запуска, который контролирует эти источники в потоке, который запускает цикл цикла.

  • это означает, что иногда я могу использовать run loop для блокировки потока на время

В самом деле. Фактически, цикл цикла будет «оставаться» в обработчике событий, пока этот обработчик события не вернется. Вы можете видеть это в любом приложении достаточно просто. Установите обработчик для любого действия ввода-вывода (например, нажатия кнопки), которое будет спать. Вы заблокируете цикл основного запуска (и весь пользовательский интерфейс), пока этот метод не завершится.

То же самое относится к любому циклу запуска.

Я предлагаю вам прочитать следующую документацию по циклам запуска:

https://developer.apple.com/documentation/foundation/nsrunloop

и как они используются в потоках:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

Runloops – это нечто вроде коробки, где только что происходит.

В основном в Runloop вы переходите к обработке некоторых событий, а затем возвращаетесь. ИЛИ верните, если он не обработает какие-либо события до того, как истечет время ожидания. Вы можете сказать, что он похож на асинхронные NSURLConnections, обрабатывая данные в фоновом режиме, не мешая вашему текущему циклу, но в то же время вам нужны данные синхронно. Это можно сделать с помощью Runloop, которые поддерживают ваш асинхронный NSURLConnection и предоставляют данные во время вызова. Вы можете использовать Runloop следующим образом:

 NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1]; while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil]) loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1]; 

в этом Runloop он будет работать до тех пор, пока вы не выполните часть своей другой работы и не установите для параметра YourBoolFlag значение false .

Точно так же вы можете использовать их в потоках.

Надеюсь, это поможет вам.

Запуск циклов – это то, что отделяет интерактивные приложения от инструментов командной строки .

  • Инструменты командной строки запускаются с параметрами, выполняют свою команду, а затем выходят.
  • Интерактивные приложения ждут ввода пользователя, реагируют, а затем возобновляют ожидание.

Отсюда

Они позволяют подождать до тех пор, пока пользователь не ответит и не ответит соответственно, дождитесь, пока вы не получите завершениеHandler и не примените его результаты, подождите, пока вы не получите таймер и не выполните функцию. Если вы не можете слушать пользовательские краны, вы не можете дождаться, когда произойдет сетевой вызов, вы не сможете проснуться через x минут.

Также из этого комментария :

Фоновые потоки не имеют собственных runloops, но вы можете просто добавить их. Например, AFNetworking 2.x сделал это. Это была проверенная и истинная техника для NSURLConnection или NSTimer для фоновых потоков, но мы не делаем этого сами, потому что новые API-интерфейсы устраняют необходимость этого. Но похоже, что URLSession делает, например, здесь простой запрос , запуская обработчики завершения обработки [см. Левую панель изображения] в основной очереди, и вы можете видеть, что в ней есть цикл выполнения в фоновом потоке

NSRunLoop – это

Event-Driven-Mode

Project LightWeightRunLoop реализует NSRunLoop всего менее четырех сотен строк кода

https://github.com/wuyunfeng/LightWeightRunLoop

В дополнение к внедрению NSRunLoop с использованием IO-мультиплексирования используется некоторый API-интерфейс Runloop-Relative Fundation, такой как выполнение селектора (или задержки несколько раз) в другом потоке, таймер , URLConnection и т. Д.

  • Вертикально выравнивать текст вверху в UILabel
  • Удаление не выбранных элементов из UIPickerView
  • Облегченная, обратимая анимация с использованием Core Animation
  • Предупреждение при добавлении и использовании нового метода во внешнем библиотечном протоколе
  • Ускорят ли изменения NSUndoManager в фоновом режиме?
  • Вариадическая функция без нулевого завершения
  • reloadData не работает для UICollectionView в iOS7
  • Бесконечный прокручиваемый фон в SpriteKit
  • Организация различных версий приложения в Xcode
  • NSUTF8StringEncoding возвращает nil NSString
  • Общий размер объекта NSMutableArray
  • Давайте будем гением компьютера.