PerformSelector После задержки не работает в фоновом режиме - iPhone - PullRequest
10 голосов
/ 09 октября 2011

У меня есть приложение voip, которое также постоянно работает в фоновом режиме. Пока я в фоновом режиме, я звоню из основного потока: (чтобы установить сетевое соединение в случае, если я диагностирую потерянную сеть).

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

Однако селектор выполняется только тогда, когда мое приложение возвращается на передний план. Должен ли я что-то сделать, чтобы селектор выполнялся в фоновом режиме?

Спасибо

Edit:

-(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;
    });
}

Я добавил этот код вместо этого, но метод «Reconnect» по-прежнему не вызывается после заданной задержки. Я вызываю метод reconectInBackgroundAfterDelay, когда я уже в фоновом режиме.

Любые другие предложения?

Редактировать 2 Нашел решение. Смотри ниже

Ответы [ 3 ]

22 голосов
/ 10 октября 2011

Единственное решение, которое я нашел до сих пор:

 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 голос
/ 04 июля 2013

Я тестировал его в течение некоторого времени и обнаружил, что в фоновом режиме ios запускается при наступлении события corebluetooth, если вы хотите что-то сделать с задержкой, используйте объект NSTimer , вам должно быть меньше 10 секунд, а если больше 10 секунд,Таймер будет недействительным.

1 голос
/ 09 октября 2011

Вы поместили эту строку в блок beginBackgroundTaskWithExpirationHandler? Взгляните на раздел Выполнение задачи конечной длины в фоновом режиме в http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html.

...