0

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

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

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

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

我认为这很好。但我的问题是当有人在解密我的文件home期间单击按钮时。applicationWillEnterForeground再次applicationDidEnterBackground开始,但我的解密还没有完成。处理它的最佳方法是什么。是否也可以等到前台完成?

4

1 回答 1

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仍在工作,如果是,请创建一个计时器以稍后再试以对其进行解码。

于 2012-12-10T16:03:58.250 回答