Я изучаю сокетную связь на iPhone, и его гид сказал что-то о CFRunloop
(это руководство для CFNetwork
, можно ли это использовать на iOS?)
Где я могу узнать о runloop в iOS? Ссылка API недостаточно.
Есть ли руководство для iOS runloop механизма?
Ответ 1
Посмотрите главу "Запуск циклов" руководства по программированию Apple Threading. Вкратце:
- Существует один цикл запуска, связанный с каждым потоком.
- Запуск цикла должен выполняться, чтобы что-либо сделать. Основная функция приложения Apple позаботится об этом для вас в основном потоке.
- Запуск цикла выполняется в определенном режиме. "Общий режим" на самом деле представляет собой набор режимов, и есть API для добавления режимов в этот набор.
- Основной целью цикла является мониторинг таймеров и запуск источников цикла. Каждый источник зарегистрирован в определенном цикле запуска для определенного режима и будет проверяться только в соответствующее время, когда runloop работает в этом режиме.
- Цикл запуска проходит через несколько этапов, каждый из которых проходит вокруг своего цикла, например, проверяет таймеры и проверяет другие источники событий. Если он обнаружит, что любой источник готов к запуску, он вызывает соответствующий обратный вызов.
- Помимо использования готовых инструментов цикла запуска, вы можете создавать собственные источники цикла запуска, а также регистрировать наблюдателя цикла выполнения для отслеживания хода цикла выполнения.
Одна из основных ошибок - забыть запустить цикл выполнения, ожидая обратного вызова из источника runloop. Иногда это проблема, когда вы решаете заняться - ждать, когда что-то произойдет в основном потоке, но вы, скорее всего, столкнетесь с ней, когда создаете свой собственный поток и зарегистрируете источник runloop с этой runloop. Вы несете ответственность за создание пула автозаполнения и запуск runloop, если это необходимо, для не основных потоков, так как основная функция приложения не будет там, чтобы сделать это для вас.
Вместо этого вам лучше было бы прочитать "Apple Concurrency Руководство по программированию, в котором предлагаются альтернативы механизму runloop, таким как очереди операций и источники отправки. В разделе" Замена кода цикла "главы" Миграция с потоков" предлагается использовать источники рассылки вместо источников runloop для обработки событий.
Ответ 2
Взгляните на эти статьи в документах Apple:
Пример кода для запуска асинхронных соединений через цикл запуска:
SimpleURLConnections (хотя этот использует API NSURLConnection)
Ответ 3
NSRunLoop - это Event-Driven-Mode
(android Handler-Looper-MessageQueue
и memcached
и т.д.)
Мы используем
pipe()
для генерации двух fd (один дляread
, другой дляwrite
). Мы можем разбудить поток (который читалread
fd), написав несколько байтов вwrite
fd в другом потоке.
Этот проект (спонсор от меня) может предоставить вам дополнительную информацию.
Я считаю, что этот проект может помочь вам понять iOS/Mas Runloop четко и достаточно, чтобы вы могли проектировать свой проект с помощью runloop правильно и эффективно.
Надеюсь, это поможет вам.