ОК для запуска фоновых потоков из других фоновых потоков? (NSObj) - PullRequest
1 голос
/ 15 февраля 2011

Этот вопрос для тех из вас, кто, в отличие от меня, верно понимает многопоточность в приложениях какао. Вот, вкратце, ситуация:

Ситуация:
Мое приложение достигает параллелизма, используя методы, предоставленные в NSObject. Пожалуйста, скажите мне, если все в порядке, чтобы сделать следующее:

1) Мой контроллер основного вида запускает некоторую работу в фоновом режиме, чтобы освободить интерфейс:

[self performSelectorInBackground:@selector(loadImages:) withObject:nil];

2) Фоновая работа делит свою задачу на несколько меньших задач в нескольких фоновых потоках, так что каждая задача обновляется по завершении (в отличие от завершения всех задач):

[self performSelectorInBackground:@selector(loadOneImage:) withObject:nil];

Обоснование:
Это был единственный способ, который я мог изобрести, чтобы завершить выполнение отдельных задач ( загрузка / отрисовка пользовательских UIViews ) в наборе для обновления в пользовательском интерфейсе AS. В противном случае все задачи обновляются только после завершения последней задачи в группе ...

Ответы [ 3 ]

3 голосов
/ 15 февраля 2011

да, вы можете использовать performSelectorInBackground:... вызовы для порождения вторичных потоков из вторичных потоков.

если у вас есть много потоков для создания (таким образом), рассмотрите NSOperationQueue. В противном случае вы можете получить массу фоновых тем. 100 потоков (например), каждая загрузка одного изображения в мобильное устройство неэффективно использует ресурсы - и не будет отзывчивой. NSOperationQueue позволяет ограничить максимальное количество потоков / рабочих и повторно использовать рабочие потоки.

примечание: использовалось «100 потоков», потому что для аппаратного обеспечения это число далеко не логично (вопрос помечен iPhone) если загрузка всего вашего изображения происходит в памяти, просто используйте последовательный (1 рабочий за раз) NSOperationQueue - NSOperations может указывать приоритет. если изображения загружаются, вы можете придерживаться 4 или менее.

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

1 голос
/ 15 февраля 2011

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

Так что лучше, если вы идете за очередями операций, а не порождения потока из другого фонового потока.

1 голос
/ 15 февраля 2011

Насколько я понимаю, в этом подходе нет ничего плохого.Согласно документу, performSelectorInBackground:withObject: просто порождает другой поток и запускает там ваш селектор.Это не перечисляет никаких ограничений.Только не забудьте настроить пулы автоматического выпуска в каждом методе, который вы вызываете через performSelectorInBackground:withObject:, чтобы не пропускать память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...