2010-09-02 4 views
1

Я хочу запустить одиночный фоновый поток для приложения iPhone, который постоянно доступен в фоновом режиме и запускается, когда происходит определенное событие, и переходите к ожиданию запуска определенного события, чтобы снова запустить его выполнение , Во время выполнения потока, если конкретное событие снова запущено, поток должен перезапустить свою работу.Objective C - Single Background Thread

Я работаю над пользовательским приложением карты. В событии TouchesMoved мне нужно загрузить плитки изображения карты в соответствии с позициями, перемещенными в фоновом потоке. Проблема в том, что когда я перемещаю карту со скоростью, событие touchhesMoved запускается, когда предыдущий поток не завершил свою работу, и запущен новый поток. Это вызывает проблему безопасности потока, и мое приложение разбилось.

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

Пожалуйста, помогите

+0

Что все звучит разумно, какая у вас проблема? –

+0

добро пожаловать в SO, пожалуйста, измените свой вопрос, а не добавьте ответ. Кроме того, более конкретным вы задаете более высокую вероятность получения ответа, который вы ищете. –

+0

Андерс К - Спасибо, что указал на ошибку. Вопрос обновлен – Anis

ответ

6

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

Я успешно использовал NSInvocationOperation для подачи запросов как можно чаще, и это звучит как сопутствующие требования и поведение, которым вы пользуетесь. Я бы предположил в целом, что вы экспериментируете с ними в тестовом проекте; здесь вы можете проверить производительность.

Следующая блог помог мне начать играть с NSOperation:

http://www.dribin.org/dave/blog/archives/2009/09/13/snowy_concurrent_operations/

http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/

Как всегда, Apple, Threading Programming Guide является ключевым для чтения, чтобы выяснить, какой путь в зависимости от потребностей.

+0

Проблема с использованием NSOperation и NSOperationQueue. благодаря – Anis

0

Поместите цикл выполнения в вашем фоне вычислительного потока. Затем используйте очередь NSOperation для управления отправкой сообщений на нее. Очередь плюс цикл выполнения сериализует все рабочие запросы для вас.

+2

Вам не нужно создавать фоновый поток, если вы используете NSOperationQueue. – JeremyP

3

Это звучит как идеальная работа для NSOperationQueue. Прочитайте раздел очереди операций concurrency guide.

По сути, вы создаете объект NSOperation для каждой карты плитки нагрузки и поместить их в очередь, что только allows them to execute one at a time.