Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

#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/gd_libdispatch_ref/reference/reference.html.

Ссылка блоков:http://developer.apple.com/library/ios/#featuredureduredicles/short_practical_guide_blocks/index.html%23//apple_ref/doc/uid/tp40009758.

Фоновая ссылка на задачу:http://developer.apple.com/library/ios/documentation/uikit/reference/uiaclence_class/Reference/Reference.html#//apple_ref/occ/instm/uiacplication/beginbackgroundtaskwithexpirateHandler.:

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

Я предполагаю, что приложение не может законно претендовать на приложение «VoIP / Music / Location Aware», то если он реализует то, что описано здесь, он не будет выполнен, когда истечет временной интервал?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top