NSOperationQueue много потоков - PullRequest
0 голосов
/ 31 мая 2011

В нашем приложении для iPhone есть несколько вкладок, и выбор каждой вкладки запускает сетевое подключение.В прошлом мы просто отсоединяли новую ветку для каждого соединения.А после нескольких очень быстрых переключений вкладок приложение перестало отвечатьТеперь мы решили использовать очередь операций, которая должна контролировать количество потоков и не должна позволять приложению перестать отвечать на запросы.Но теперь приложение перестает отвечать на запросы даже при меньшем числе быстрых переключений (хотя теперь оно быстрее восстанавливается после отсутствия ответа).Я запустил приложение на устройстве из xcode и приостановил его после нескольких быстрых переключений, чтобы увидеть количество потоков.И я обнаружил, что существует несколько потоков со следующим стеком:

    0 __workq_kernreturn
    2 _init_cpu_capabilities

Есть идеи, что это за потоки и как от них избавиться?

Ответы [ 2 ]

0 голосов
/ 31 мая 2011

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

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

одна очевидная реализация, которую необходимо поддерживать в этомслучай отмены операции: -[NSOperation cancel].когда кто-то отклоняется от представления, в котором есть ожидающий / незавершенный запрос, просто отмените его (если только вам не понадобятся данные для кэширования).

многие реализации также могут выиграть, делая запросы реже.например: если результаты вашего сервера обновляются только один раз в час, то нет смысла запрашивать его «примерно каждую минуту».

последний пункт: соединение может использовать сам рабочий поток - проверьтеAPI, который вы используете, чтобы уменьшить это, если это проблема.

0 голосов
/ 31 мая 2011

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

По моему мнению, эти потоки управляются Grand Central Dispatch.,GCD создаст рабочие потоки для обработки блоков (и операций), и это будет настолько эффективно, насколько это возможно.

...