Есть ли руководство по механизму запуска iOS? - PullRequest
14 голосов
/ 02 июня 2011

Я изучаю сокетную связь на iPhone, и его руководство что-то говорит о CFRunloop (это руководство для CFNetwork, это можно использовать на iOS?) Где я могу узнать о runloop на iOS? Ссылка на API недостаточна.

Ответы [ 3 ]

37 голосов
/ 02 июня 2011

Посмотрите на главу "Run Loops" Руководства по программированию потоков от Apple. Вкратце:

  • С каждым потоком связан один цикл выполнения.
  • Цикл выполнения должен быть запущен, чтобы делать что-либо.Основная функция приложения Apple позаботится об этом для вас в главном потоке.
  • Цикл выполнения выполняется в определенном режиме.«Общий режим» на самом деле представляет собой набор режимов, и есть API для добавления режимов к этому набору.
  • Основное назначение цикла выполнения - мониторинг таймеров и запуск источников цикла.Каждый источник зарегистрирован в определенном цикле выполнения для определенного режима и будет проверяться только в соответствующее время, когда цикл запуска работает в этом режиме.
  • Цикл выполнения проходит несколько этапов в каждом обходецикл, такой как проверка таймеров и проверка других источников событий.Если он обнаруживает, что любой источник готов к запуску, он запускает соответствующий обратный вызов.
  • Помимо использования готовых инструментов цикла выполнения, вы можете создавать свои собственные источники цикла выполнения, а также регистрировать наблюдателя цикла выполнения дляотслеживать ход цикла выполнения.

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

Вы бы лучше прочитали Apple Руководство по программированию параллелизма вместо этого, которое предлагает альтернативы механизму runloop, такие как очереди операций и источники отправки.В разделе «Замена кода выполнения цикла» главы «Перенос из потоков» предлагается использовать источники диспетчеризации вместо источников цикла выполнения для обработки событий.

5 голосов
/ 02 июня 2011

Посмотрите на эти статьи в документации Apple:

Цикл основного события

Циклы выполнения

ДляПример кода о том, как запускать асинхронные соединения через цикл выполнения:

SimpleURLConnections (хотя в этом примере используется API-интерфейс NSURLConnection)

1 голос
/ 28 августа 2016

NSRunLoop - это Event-Driven-Mode (android Handler-Looper-MessageQueue и memcached и т. Д.)

Мы используем pipe() для генерации двух fd (один для read, другой для write).Мы можем разбудить поток (который прочитал read fd), записав несколько байтов в write fd в другом потоке.

Этот проект (мой спонсор) может дать вам больше информации.

https://github.com/wuyunfeng/LightWeightRunLoop

Я считаю, что этот проект может помочь вам четко и в достаточной степени понять iOS / Mas Runloop, поэтому вы можете разработать свой проект, используя правильно runloop иэффективно.

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

...