【发布时间】:2014-06-29 07:50:17
【问题描述】:
当我的应用程序正在下载大文件并且用户切换到另一个应用程序时,我正在运行这样的后台任务:beginBackgroundTaskWithExpirationHandler:
然后如果用户通过双击打开“应用程序切换器”,我的应用程序的屏幕截图是完全随机的。有时它显示的视图控制器甚至没有在应用程序中打开。
ignoreSnapshotOnNextApplicationLaunch 没有帮助,因为它根本不起作用。
Apple 说:Avoid updating your windows and views 这里:documentation,但我不会更新视图。
我也在运行计时器,以检查剩余多少后台时间,而这个计时器是我问题的原因。如果我不创建它,一切都会完美运行,但我无法在 Expiration 处理程序中保存下载状态 - 时间不够。
我怎样才能避免这种奇怪的行为?
-(void)appDidEnterBackground {
UIApplication *application = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
if(backgroundTimer == nil || ![backgroundTimer isValid]) {
backgroundTimer = [[NSTimer alloc]
initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:0]
interval:1
target:self
selector:@selector(checkBackgroundTimeRemaining)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:backgroundTimer forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];
}
}
- (void)checkBackgroundTimeRemaining {
NSTimeInterval timeRemaining = [[UIApplication sharedApplication] backgroundTimeRemaining];
if(timeRemaining < 5) {
if(backgroundTimer != nil) {
[backgroundTimer invalidate];
backgroundTimer = nil;
}
[downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
[self saveResumeData:resumeData];
}];
}
}
【问题讨论】:
标签: ios objective-c background-process