PerformSelector延迟不在后台模式下运行 - iPhone

时间:2011-10-09 13:28:13

标签: iphone objective-c ios4 nstimer nsrunloop

我有一个voip应用程序,它也在后台运行。 当我在后台时,我正在从主线程调用:(在我诊断网络丢失的情况下建立网络连接)。

[self performSelector :@selector(Reconnect:) withObject:nil afterDelay:60.0];

但是,只有当我的应用程序返回到前台时才会执行选择器。 我应该做些什么来让选择器在后台执行吗?

由于

修改

-(void) reconectInBackgroundAfterDelay:(NSTimeInterval) dealy
{
    NSLog(@"reconectInBackgroundAfterDelay");
    UIApplication*   app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        [self performSelector :@selector(Reconnect:) withObject:nil afterDelay:dealy];

        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

我添加了此代码,但仍未在提供的延迟后调用“重新连接”方法。 我已经在后台调用“reconectInBackgroundAfterDelay”方法。

还有其他建议吗?

编辑2 找到了解决方案。见下文

3 个答案:

答案 0 :(得分:22)

到目前为止我找到的唯一解决方案:

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

        NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:1 target:self  selector:@selector(Reconnect:) userInfo:nil repeats:NO];    

        [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];

        [[NSRunLoop currentRunLoop] run]; 
    }); 

答案 1 :(得分:1)

您是否已将此行放入beginBackgroundTaskWithExpirationHandler区块?请查看http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html在背景中完成有限长度任务部分。

答案 2 :(得分:1)

我测试了一段时间后,发现在ios后台运行时,一个corebluetooth事件即将到来,如果你想做一些延迟使用NSTimer对象,你必须小于10秒,如果超过10秒,计时器将无效。