appWillEnterForeground:在appDidEnterBackground之前调用:完成

时间:2014-02-19 16:52:57

标签: ios iphone multithreading cocoa nsnotifications

在我的应用中,我已经很久了

- (void)appDidEnterBackground:(NSNotification*)notif方法,

执行需要1-2秒。这会导致以下问题:如果我关闭应用程序并再次打开它,而不是

- (void)appWillEnterForeground:(NSNotification*)notif

-appDidEnterBackground完成之前调用

,这会导致崩溃 - 数据不一致,或类似的事情。我想要防止这种情况发生,而不是调查我的数据究竟是什么问题 - 我想等到appDidEnterBackground完成。

我的代码:

- (void)appDidEnterBackground:(NSNotification*)notif
{
    [self processAppDidEnterBackgroundRoutines];

    NSLog(@"%s - end", __FUNCTION__);
}

- (void)processAppDidEnterBackgroundRoutines
{
    // 1-2 seconds prosessing
}

- (void)appWillEnterForeground:(NSNotification*)notif
{   
    NSLog(@"%s - begin", __FUNCTION__);
}

我试着打电话

[self performSelectorOnMainThread:@selector(processAppDidEnterBackgroundRoutines) withObject:nil waitUntilDone:YES];

,但由于某些原因它没有帮助 - appWillEnterForeground:processAppDidEnterBackgroundRoutines完成之前仍然被调用。

有没有人有其他想法如何同步这些电话?

2 个答案:

答案 0 :(得分:2)

将两者放入串行队列是否可行?

- (void)appDidEnterBackground:(NSNotification*)notif
{
    dispatch_sync( serialQueue, ^()
    {
        [self processAppDidEnterBackgroundRoutines];
    });
}

- (void)processAppDidEnterBackgroundRoutines
{
    // 1-2 seconds prosessing
}

- (void)appWillEnterForeground:(NSNotification*)notif
{   
    dispatch_sync(serialQueue, ^()
    {
       // do your stuff
    });
}

答案 1 :(得分:0)

您的问题似乎是因为您在performSelectorOnMainThread:方法中使用了appDidEnterBackground:。这导致该选择器稍后运行,因为您已经在主线程上运行。只是停止执行performSelectorOnMainThread:,因为这是不必要的,并且是造成问题的原因。