Это моя проблема. Когда мое приложение входит в фон, я хочу, чтобы он выполнял функцию через определенный промежуток времени. Это то, что я делаю:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
isRunningInBackground = YES;
taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
int64_t delayInSeconds = 30;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
{
[self doSomething];
});
}
- (void)doSomething
{
NSLog(@"HELLO");
}
taskIdentifier
переменная объявляется в файле myAppDelegate.h следующим образом:
UIBackgroundTaskIdentifier taskIdentifier;
Все работает так, как предполагалось, я вижу, что консоль печатает HELLO только через 30 секунд. Но я не хочу, чтобы doSomething
выполнялся, если приложение переходит на передний план до 30 секунд. Поэтому мне нужно отменить это. Вот как я это делаю:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
isRunningInBackground = NO;
[self stopBackgroundExecution];
}
- (void)stopBackgroundExecution
{
[[UIApplication sharedApplication] endBackgroundTask:taskIdentifier];
taskIdentifier = UIBackgroundTaskInvalid;
}
Но, к сожалению, он не отменяет doSomething
, он все еще выполняется. Что я делаю не так? Как мне отменить эту функцию?