2012-01-25 2 views
1

Мне нужна фоновая операция, которая должна быть запланирована каждые 10 минут или около того. Операция состоит из сбора объектов из основных данных и загрузки их информации в веб-сервис, чтобы не изменять их каким-либо образом.Использование NSTimer для запуска NSThread в ios

Подход, о котором я думаю, заключается в создании nstimer в делегате приложения, который срабатывает каждые 10 минут. Это вызовет NSThread, который запустит операцию в фоновом режиме, не создавая никаких помех для пользователя. Поток будет здесь после выхода нормально.

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

Другое предложение в Интернете - использовать runloops, однако я не вижу использования в этом конкретном случае.

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

С уважением

ответ

2

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

[NSSTimer scheduledTimerWithTimeInterval:60.0 * 10.0 target:self selector:@selector(startBackgroundMethod) userInfo:nil repeats:YES]; 

Затем создать свой код фон метод как это:

- (void)startBackgroundMethod 
{ 
    //the timer calls this method runs on the main thread, so don't do any 
    //significant work here. the call below kicks off the actual background thread 
    [self performSelectorInBackground:@selector(backgroundMethod) withObject:nil]; 
} 

- (void)backgroundMethod 
{ 
    @autoreleasepool 
    { 
     //this runs in a background thread, be careful not to do any UI updates 
     //or interact with any methods that run on the main thread 
     //without wrapping them with performSelectorOnMainThread: 
    } 
} 

Что касается того, это на самом деле необходимо, чтобы сделать эту работу в фоновом потоке, что зависит от того, что это такое. Потоки следует избегать, если это строго необходимо из-за вероятности ошибок параллелизма, поэтому, если вы сообщите нам, что будет делать ваш поток, мы можем сообщить, подходит ли подход на основе runloop.

+0

Привет, Ник, благодарю вас за ответ. В основном поток имеет свой собственный общий контекст и извлекает объекты из постоянного хранилища. Затем он получает информацию от объектов и загружает их в веб-службу. Это никак не изменяет объекты. И именно из-за планирования и загрузки я думаю об этом подходе. Я использую ASIHTTPRequest для загрузки в веб-сервис. – Bjarke

+0

Возможно, вы захотите переосмыслить использование ASI, так как разработчик официально отказался от него, и он не очень хорошо работает с ARC. Вы можете выполнять загрузку с помощью обычного асинхронного NSURLConnection и запускаться на runloop без блокировки пользовательского интерфейса и без необходимости генерировать новый поток (я предполагаю, что он использует потоки внутри, но вам не нужно самостоятельно управлять параллелизмом). –