Ios 在后台每X分钟执行一次函数';行不通
我使用此代码每X分钟执行一次函数:Ios 在后台每X分钟执行一次函数';行不通,ios,iphone,objective-c,ios7,nsthread,Ios,Iphone,Objective C,Ios7,Nsthread,我使用此代码每X分钟执行一次函数: - (void)executeEveryOneMinute { [self myFunction]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self executeEveryOneMinute]; }); } 当应用程序位于前台时,它
- (void)executeEveryOneMinute
{
[self myFunction];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self executeEveryOneMinute];
});
}
当应用程序位于前台时,它就会工作。但当应用程序进入后台时,它就不再工作了。
当我再次将应用程序返回前台时,它会执行一次功能。
并继续每隔一分钟再次调用函数。
那么,如何使它也在后台工作呢?计时器在主线程上工作。当应用程序进入后台时,其计时器将失效。所以,当应用程序进入后台时,您不能执行相同的操作。您不能借助计时器来执行此操作,因为它将在后台失效。您可以尝试检查。有关可能性的讨论,请参阅的“后台执行和多任务处理”部分。例如,你可以让应用程序在后台运行几分钟,以完成一些有限长度的任务。或者,如果应用程序正在执行一个非常特殊的功能列表(引用上述文档),您可以在后台继续运行应用程序更长的时间:
- 在后台向用户播放音频内容的应用程序,如音乐播放器应用程序
- 在后台录制音频内容的应用程序
- 随时通知用户其位置的应用程序,如导航应用程序
- 支持互联网语音协议(VoIP)的应用程序
- 需要定期下载和处理新内容的应用程序
- 从外部附件接收定期更新的应用程序
executeeEveryoneMinute
方法中正在做的事情),我们可以提供有关如何实现预期效果的建议(如果可能)
如果你想在后台继续上传,在iOS 7和更大的版本中,你应该考虑使用<代码> NSURLSECTION/COD>后台会话配置(<代码> [NSURLSESACTION BACKESSESSIONSONTION: IDENTIONER ] ;IOS 8中有类似的方法)。不仅在应用程序离开前台后,而且在应用程序终止后(例如由于内存压力或崩溃),这将继续尝试上载(自动,无需您进一步干预)。AFNetworking提供了一个基于
NSURLSession
的类,它支持这一点(尽管它不是基于NSOperation
)。通过这种方式,您可以享受后台上传,但符合苹果公司关于后台操作的指导原则,尤其是与每60秒重试一次相比,对电池的影响更小
我建议您参考WWDC 2013视频的后半部分,它演示了这个过程(他们正在下载,但上传的想法是一样的)。您应该使用后台任务来实现您想要的
UIApplication* app = [UIApplication sharedApplication];
task = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:task];
task = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task.
NSLog(@"Started background task timeremaining = %f", [app backgroundTimeRemaining]);
if (connectedToNetwork) {
// do work son...
}
[app endBackgroundTask:task];
task = UIBackgroundTaskInvalid;
});
我能做些什么使这在前台/后台都能工作?你能给我一些我能做的例子吗?这里是我要做的。我在本地数据库(电话)中有一些数据,必须确保将它们发送到服务器。我正在使用AFNetworking将数据传递到服务器。若用户第一次尝试上传数据但失败(例如,并没有互联网,或者服务器关闭),我会将其保存在本地数据库中,并且我需要每隔几分钟尝试将其发送到服务器,直到成功。我不知道是否有更好的方法可以做到这一点。@1110 iOS7提供了后台上传功能,它可以为您做到这一点。AFNetworking还提供了一个基于
NSURLSession
的类。见我的答复的增编。