iOS4 Создать фоновый таймер - PullRequest
3 голосов
/ 11 ноября 2010

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

Помощь будет принята!

Ответы [ 3 ]

20 голосов
/ 14 ноября 2010

Вы также можете сделать это с помощью 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

Ссылка на блоки: 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:

4 голосов
/ 11 ноября 2010

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

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

0 голосов
/ 06 декабря 2011

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

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

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