applicationWillEnterForeground / applicationDidEnterBackground一起工作

时间:2012-12-10 15:21:38

标签: objective-c ios background

我的应用中有解密和加密方法。当应用程序进入后台时,文件会被加密。如果应用程序进入前台,则文件将被解密。这是主要的故事。这两个部分都需要一些时间和大量的内存。在后台,我做了类似的事情。

encryptionTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
    // Wwe took too long. Stop task.
}];

在applicationWillEnterForeground中,我正在执行以下操作:

if (encryptionTaskId != UIBackgroundTaskInvalid) {
    [[UIApplication sharedApplication] endBackgroundTask:encryptionTaskId];
}

我认为这很有效。但我的问题是在home解密我的文件期间有人点击applicationWillEnterForeground按钮。 applicationDidEnterBackground再次开始,但我的解密没有完成。处理这个问题的最佳方法是什么。是否有可能等到前景结束?

1 个答案:

答案 0 :(得分:0)

您是否能够检测文件当前是否正在被访问或正在加密/解密?如果是这样,请创建一个计时器,在上一个方法停止后的几秒钟内再次进行加密/解密。

更新:

请参阅http://developer.apple.com/library/ios/DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW28您应该可以使用beginBackgroundTaskWithExpirationHandler:。在你的应用程序移到后台之前,这会给你额外的时间来完成处理。

更新2:

确保encryptionTaskId是实例变量

- (void)applicationDidEnterBackground:(UIApplication *)application 
{
    encryptionTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
        encryptionTaskId = UIBackgroundTaskInvalid;
    }];

    [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    encryptionTaskId = UIBackgroundTaskInvalid;
}

然后在applicationDidEnterForeground中,您需要检查encryptionTaskId是否仍然有效,如果是,请创建一个计时器,以便稍后再次尝试对其进行解码。