相关疑难解决方法(0)

防止dispatch_after()后台任务被执行

这是我的问题.当我的应用程序进入后台时,我希望它在一段时间后执行一个功能.这就是我做的:

- (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");
}
Run Code Online (Sandbox Code Playgroud)

taskIdentifier 变量在myAppDelegate.h文件中声明如下:

UIBackgroundTaskIdentifier taskIdentifier;
Run Code Online (Sandbox Code Playgroud)

一切都按照预期的方式工作,我看到控制台在30秒后就打印了HELLO.但是doSomething如果应用程序进入前景直到30秒结束,我不想被执行.所以我需要取消它.这就是我这样做的方式:

- (void)applicationWillEnterForeground:(UIApplication *)application
{    
    isRunningInBackground = NO;
    [self stopBackgroundExecution];
}

- (void)stopBackgroundExecution
{
    [[UIApplication sharedApplication] endBackgroundTask:taskIdentifier];
    taskIdentifier = UIBackgroundTaskInvalid;
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是它没有取消doSomething,它仍然执行.我究竟做错了什么?如何取消该功能?

cocoa-touch grand-central-dispatch ios

12
推荐指数
5
解决办法
1万
查看次数

标签 统计

cocoa-touch ×1

grand-central-dispatch ×1

ios ×1