0

我想使用 aNSTimer作为后台任务。我写了这段代码:

UIBackgroundTaskIdentifier bgTask;
        UIApplication  *app = [UIApplication sharedApplication];
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            [app endBackgroundTask:bgTask];
        }];
        self.silenceTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(findlocation:) userInfo:nil repeats:NO];

但它不会findlocation在 30 秒后触发该方法。请指导我如何做到这一点。

4

4 回答 4

0

NSTimer当应用程序处于后台状态时暂停。

你必须启动一些后台任务来做你想做的事。但即便如此,您将被限制在应用程序进入后台后的一定时间内。

真正的后台行为仅适用于位置跟踪、VoIP 或音频应用程序。其他应用程序必须面临限制:一旦进入后台,您将有一定的时间来完成您从beginBackgroundTaskWithExpirationHandler: (backgroundTimeRemaining开始的任务)

检查此以获取更多信息http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html

对于一个干净的解决方案,请检查这个问题的接受答案如何让我的应用程序在后台运行 NSTimer?

于 2013-01-23T12:02:30.753 回答
0

此代码用于在应用程序进入后台时播放声音,您可以自定义它以供自己使用

- (void)applicationDidEnterBackground:(UIApplication *)application{
    backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (backgroundTask != UIBackgroundTaskInvalid)
            {
                [application endBackgroundTask:backgroundTask];
                backgroundTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [NSThread sleepForTimeInterval:3];
        [self startPlayingInBackground:@"default.aif"];
        NSLog(@"Time remaining: %f",[application backgroundTimeRemaining]);

        dispatch_async(dispatch_get_main_queue(), ^{
            if (backgroundTask != UIBackgroundTaskInvalid)
            {
                // if you don't call endBackgroundTask, the OS will exit your app.
                [application endBackgroundTask:backgroundTask];
                backgroundTask = UIBackgroundTaskInvalid;
            }
        });
    });
}

下面的行是代码,其中 m 播放声音是我的目标 c 函数

[self startPlayingInBackground:@"default.aif"];

参考自

于 2013-01-23T12:08:30.650 回答
0
UIBackgroundTaskIdentifier bgTask;
    UIApplication  *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
    self.silenceTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(findlocation:) userInfo:nil repeats:NO];

[[NSRunloop mainRunLoop] addTimer:self.silenceTimer forMode:NSDEfaultRunLoopMode];

于 2013-08-01T06:07:34.647 回答
-1

试试这个代码:

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 dispatch_source_t timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, backgroundQueue);
 dispatch_source_set_timer(timerSource, dispatch_time(DISPATCH_TIME_NOW, 0), 10.0*NSEC_PER_SEC, 0*NSEC_PER_SEC);
 dispatch_source_set_event_handler(timerSource, ^{
     if(queue)
         [self findlocation];
 });
 dispatch_resume(timerSource);
于 2013-01-23T12:02:03.383 回答