Я пытаюсь понять Operations и Threads лучше и посмотрел на подкласс AFNetworking AFURLConnectionOperation
, например, в реальном мире, исходный код.
Мое настоящее понимание - когда экземпляры NSOperation
добавляются в очередь операций, очередь, между прочим, управляет потоком, ответственным за выполнение операции. В документации Apple NSOperation
указывается, что даже если подклассы возвращают YES
для -isConcurrent
, операция всегда будет запускаться в отдельном потоке (начиная с 10.6).
Основываясь на сильном языке Apple в руководстве по программированию нитей и руководстве по программированию Concurrency, кажется, что управление потоком лучше всего оставить во внутренней реализации NSOperationQueue
.
Однако подкласс AFNetworking AFURLConnectionOperation
создает новый NSThread
, а выполнение метода -main
выполняется в этом потоке сетевого запроса. Зачем? Зачем нужен этот сетевой запрос? Является ли это защитным методом программирования, потому что библиотека предназначена для использования широкой аудиторией? Разве это меньше хлопот для потребителей библиотеки для отладки? Существует ли (тонкое) преимущество в производительности для всей сетевой активности в выделенном потоке?
(Добавлено 26 января)
В сообщении в блоге Дэйвом Дрибином он иллюстрирует, как переместить операцию обратно в основной поток, используя конкретный пример NSURLConnection.
Мое любопытство проистекает из следующего раздела в Руководстве по программированию Apple Thread:
Держите свои темы разумно занятыми.
Если вы решили создать и управлять потоками вручную, помнить, что потоки потребляют драгоценную систему Ресурсы. Вы должны сделать все возможное, чтобы убедиться, что любые задачи, которые вы выполняете назначать потоки достаточно долговечны и продуктивны. На В то же время вы не должны бояться прерывать потоки, которые тратя большую часть своего времени на простоя. В потоках используется нетривиальное количество память, некоторые из них подключены, поэтому освобождение простаивающего потока не только помогает уменьшите объем памяти приложений, он также высвободит больше физической памяти для использования других системных процессов.
Мне кажется, что поток запросов сетевой сети AFNetworking не "поддерживается достаточно занятым"; он запускает бесконечный цикл while для обработки сетевых операций ввода-вывода. Но, видите, что суть этих вопросов - я не знаю, и я только догадываюсь.
Любое понимание или деконструкция AFURLConnectionOperation
с особым отношением к операциям, потокам (циклы цикла?) и/или GCD было бы очень полезно для заполнения пробелов в моем понимании.