在我的应用中,我已经很久了
- (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
完成之前仍然被调用。
有没有人有其他想法如何同步这些电话?
答案 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:
,因为这是不必要的,并且是造成问题的原因。