【发布时间】:2015-09-12 03:47:13
【问题描述】:
我之前问过这个问题。我想我的问题用错了。基本上我想在应用程序终止时将数据从我的应用程序保存到解析后端。即应用程序从应用程序列表中被刷掉并杀死。 iOS 文档说实际上会调用 applicationDidEnterBackground 而不是 applicationWillTerminate,因此可以在此方法中完成任何工作。
applicationWillTerminate: 对于不支持后台执行或与 iOS 3.x 或更早版本链接的应用程序,当用户退出应用程序时始终调用此方法。对于支持后台执行的应用程序,当用户退出应用程序时通常不会调用此方法,因为在这种情况下应用程序只是移动到后台。但是,该方法可能会在应用程序在后台运行(未挂起)并且系统出于某种原因需要终止它的情况下调用。
但是,这不是 100%,并且从我的测试 applicationDidEnterBackground 不会在我每次退出应用程序时调用。那么当一个应用程序以 100% 的保证被终止时,如何保存数据呢?
这是我在 applicationDidEnterBackground 时保存的代码:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
//End the Task
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if([self getController]){
CatsViewController *catsViewController = [self getController];
if(catsViewController.currentUser){
int count = (int)[MyViewController.currentUser.messages count];
PFInstallation *currentInstallation = [PFInstallation currentInstallation];
currentInstallation.badge = count;
[currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
}
else{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}
else{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
});
}
如果能得到这方面的任何指示,那就太好了。谢谢
【问题讨论】:
-
任何你不能保存更改而不是“退出”的原因
-
我正在尝试使解析与我的徽章编号保持同步(徽章编号是我的应用程序中的消息数)。与其每次删除消息以更新对象时都进行额外的解析,不如在应用程序进入后台或通过单个调用退出时执行此操作。即用户打开应用删除 3 条消息,然后切换应用单个 api 调用以更新徽章计数而不是 3。
标签: ios objective-c