2011-02-15 3 views
1

Этот вопрос для тех из вас, кто, в отличие от меня, truely понимает многопоточность в приложениях для какао. Вот, вкратце, ситуация:ОК для запуска фоновых потоков из других потоков фона? (NSObj)

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

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

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

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

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

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

ответ

3

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

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

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

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

+0

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

1

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

+0

спасибо за ваш ответ Darkdust. Приятно знать, что я все еще в безопасной зоне.Я все равно должен проверить, поддерживает ли NSOperationQueue какие-либо реальные преимущества в производительности. – m0rtimer

1

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

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

Смежные вопросы