Completing a Long-Running Task in the Background(在后台完成长时间运行的任务)

   当app运行中,按下home键,则此app进入后台,所有操作都将会被中止。若此时有一个需长时间运行的任务尚未结束,则可以向ios借用时间让其在后台继续完成

方法

   - (void)applicationDidEnterBackground:(UIApplication *)application 

   - (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler 

   - (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier


e.g. --AppDelegate.m文件中

@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;//请求在后台运行的任务标识(唯一)

@property (nonatomic, strong) NSTimer *myTimer; //用来模拟需长时间运行的操作


- (BOOL) application:(UIApplication *)application

  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];   

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

    return YES;

}

//是否支持多任务处理

- (BOOL) isMultitaskingSupported{    

    BOOL result = NO;

    if ([[UIDevice currentDevice]respondsToSelector:@selector(isMultitaskingSupported)]){

        result = [[UIDevice currentDevice]  isMultitaskingSupported];

    }

    return result;   

}

//进入后台运行,如按home

- (void)applicationDidEnterBackground:(UIApplication *)application{   

    if ([self isMultitaskingSupported] == NO){

        return;

    }   

    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f

                                                    target:self

                                                  selector:@selector(timerMethod:)

                                                  userInfo:nil

                                                   repeats:YES];

    //向IOS借时间来执行需长时间运行的任务

    self.backgroundTaskIdentifier = [application  beginBackgroundTaskWithExpirationHandler:^(void) {

                                       [self endBackgroundTask]; //必须匹配一个结束任务的操作,来标识此任务运行结束,应用完全进入后台休眠状态

                                    }];    

}

- (void) endBackgroundTask{    

    dispatch_queue_t mainQueue = dispatch_get_main_queue();   

    __weak AppDelegate *weakSelf = self;   

    dispatch_async(mainQueue, ^(void) {

        AppDelegate *strongSelf = weakSelf;

        if (strongSelf != nil){

            [strongSelf.myTimer  invalidate];

            [[UIApplication sharedApplication]  endBackgroundTask:self.backgroundTaskIdentifier];

            strongSelf.backgroundTaskIdentifier =UIBackgroundTaskInvalid;

        }        

    });   

}

- (void) timerMethod:(NSTimer *)paramSender{    

    NSTimeInterval backgroundTimeRemaining = [[UIApplication sharedApplication] backgroundTimeRemaining]; //后台运行时间   

    if (backgroundTimeRemaining ==DBL_MAX){

        NSLog(@"Background Time Remaining = Undetermined");

    } else {

        NSLog(@"Background Time Remaining = %.02f Seconds",

              backgroundTimeRemaining);

    }    

}

//重新点击app应用图标,进入前台

- (void)applicationWillEnterForeground:(UIApplication *)application{   

    if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid){

        [self endBackgroundTask];

    }    

}



当Flink应用程序在长时间没有数据输入的情况下,可能会出现Checkpoint过期的问题。这种情况下,Flink无法生成或完成检查点,可能导致应用程序失败。 出现这个问题的原因可能有以下几个方面: 1. 数据源停止发送数据:检查您的数据源是否停止发送数据。如果数据源没有产生新数据,Flink就无法生成新的检查点。 2. 数据流处理逻辑错误:检查您的应用程序中的数据流处理逻辑是否正确。可能存在计算逻辑错误或数据流堵塞的情况,导致长时间没有新的数据进入。 3. 并行度设置不合理:如果应用程序的并行度设置过高,但输入数据量较少,可能导致部分任务长时间没有新数据输入,从而导致Checkpoint过期。可以尝试调整并行度,使其与输入数据量相匹配。 4. 网络延迟或故障:如果应用程序的输入数据需要通过网络传输,那么可能会受到网络延迟或故障的影响。检查网络连接和配置,确保网络畅通。 针对以上问题,您可以采取以下措施: - 检查数据源是否正常运行,并确保有新的数据输入。 - 检查应用程序中的数据流处理逻辑,排除计算逻辑错误或数据流堵塞的情况。 - 调整应用程序的并行度,使其与输入数据量相匹配。 - 检查网络连接和配置,确保网络畅通。 通过排查以上可能的原因和采取相应的措施,您可以解决长时间无数据输入导致Checkpoint过期的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值