2010-11-11 4 views
3

Мне (в принципе) необходимо создать фоновый таймер на iOS 4, который позволит мне выполнить некоторый код, когда пройдет определенное количество времени. Я прочитал, что вы можете это сделать, используя некоторые [NSThread detachNewThreadSelector: toTarget: withObject:];, но как это работает на практике? Как я могу гарантировать, что поток останется в фоновом режиме. Локальные уведомления будут NOT работают для меня, так как мне нужно выполнить код, не уведомлять пользователя.iOS4 Создать фоновый таймер

Помощь будет оценена!

ответ

4

Вы можете использовать этот вызов для выполнения метода (селектора) объекта (toTarget) с некоторым параметром (withObject) в новом потоке (detachNewThred).

Теперь, если вы хотите выполнить задержанную задачу может быть лучшим подходом является performSelector: withObject: afterDelay: и если вы хотите, чтобы выполнить задачу на фоне вызвать detachNewThreadSelector: toTarget: withObject:

+0

подход 'beast' :) Хорошо, если я создаю поток с' detachNewThreadSelector: toTarget: withObject: 'останется ли он в фоновом режиме? –

+0

jajaja, извините за подход «зверя» =/Да, он будет выполняться параллельно с основным потоком, взгляните на методы 'performSelector' в NSObject для получения полного списка возможностей. –

+0

Удивительный человек, спасибо огромное, я вытаскивал свои волосы! :) –

20

Вы также можете сделать это с помощью Grand Central Dispatch (GCD) , Таким образом, вы можете использовать блоки, чтобы сохранить код в одном месте, и убедитесь, что вы снова вызываете основной поток, если вам нужно обновить свой интерфейс после завершения фоновой обработки. Вот простой пример:

#import <dispatch/dispatch.h> 

… 

NSTimeInterval delay_in_seconds = 3.0; 
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delay_in_seconds * NSEC_PER_SEC); 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

UIImageView *imageView = tableViewCell.imageView; 

// ensure the app stays awake long enough to complete the task when switching apps 
UIBackgroundTaskIdentifier taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:{}]; 

dispatch_after(delay, queue, ^{ 
    // perform your background tasks here. It's a block, so variables available in the calling method can be referenced here.   
    UIImage *image = [self drawComplicatedImage];   
    // now dispatch a new block on the main thread, to update our UI 
    dispatch_async(dispatch_get_main_queue(), ^{   
     imageView.image = image; 
     [[UIApplication sharedApplication] endBackgroundTask:taskIdentifier]; 
    }); 
}); 

Grand Central Dispatch (GCD) ссылка: http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

Blocks ссылка: http://developer.apple.com/library/ios/#featuredarticles/Short_Practical_Guide_Blocks/index.html%23//apple_ref/doc/uid/TP40009758

ссылка фона Задача: http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/beginBackgroundTaskWithExpirationHandler:

+0

+1 для блоков и новой горячей вспышки GCD. – Kongress

+1

Но этот dispatch_after не работает в фоновом режиме. Чтобы проверить то же самое, введите код в applicationDidEnterBackground: метод и посмотрите, вызван ли ваш блок или нет. –

+1

Хороший вопрос - я добавил фоновое задание на мой ответ. – mrwalker

0

ли эти предложенные методы применимо только в том случае, если приложение включено для выполнения фона (с использованием UIBackgroundM ода) в первую очередь?

Я предполагаю, что если приложение не может законно утверждать, что оно является приложением для обмена сообщениями/музыкой/местоположением, то, если оно реализует то, что описано здесь, оно не будет выполняться, когда истекает интервал времени?

+0

Нет, это неверно, однако вероятность того, что приложение все еще работает, является небольшим, в зависимости от установленного вами времени. Когда у вас есть приложение voip/music/location, ОС обычно пытается сохранить его независимо от того, что и не остановить процесс для освобождения ресурсов. –