PerformSelector После задержки не работает в фоновом режиме - iPhone
У меня есть приложение 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;
});
}
Я добавил этот код вместо этого, но метод "Повторное подключение" не вызван после указанной задержки.
Я вызываю метод reconectInBackgroundAfterDelay, пока я уже в фоновом режиме.
Любые другие предложения?
Изменить 2
Нашел решение. См. Ниже
Ответы
Ответ 1
Единственное решение, которое я нашел до сих пор:
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];
});
Ответ 2
Вы помещаете эту строку в блок beginBackgroundTaskWithExpirationHandler
? Посмотрите на раздел Завершение задачи конечной длины в фоновом режиме на http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html.
Ответ 3
Я тестировал его некоторое время, обнаружил, что в фоновом режиме ios при запуске события corebluetooth, если вы хотите что-то задержать, используйте объект NSTimer, вы должны быть меньше 10 секунд, а если более 10 секунд, таймер будет недействительным.