Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在后台每X分钟执行一次函数';行不通_Ios_Iphone_Objective C_Ios7_Nsthread - Fatal编程技术网

Ios 在后台每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]; }); } 当应用程序位于前台时,它

我使用此代码每X分钟执行一次函数:

- (void)executeEveryOneMinute
{
    [self myFunction];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(60 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        [self executeEveryOneMinute];

    });
}
当应用程序位于前台时,它就会工作。
但当应用程序进入后台时,它就不再工作了。
当我再次将应用程序返回前台时,它会执行一次功能。
并继续每隔一分钟再次调用函数。


那么,如何使它也在后台工作呢?

计时器在主线程上工作。当应用程序进入后台时,其计时器将失效。所以,当应用程序进入后台时,您不能执行相同的操作。

您不能借助计时器来执行此操作,因为它将在后台失效。您可以尝试检查。

有关可能性的讨论,请参阅的“后台执行和多任务处理”部分。例如,你可以让应用程序在后台运行几分钟,以完成一些有限长度的任务。或者,如果应用程序正在执行一个非常特殊的功能列表(引用上述文档),您可以在后台继续运行应用程序更长的时间:

  • 在后台向用户播放音频内容的应用程序,如音乐播放器应用程序
  • 在后台录制音频内容的应用程序
  • 随时通知用户其位置的应用程序,如导航应用程序
  • 支持互联网语音协议(VoIP)的应用程序
  • 需要定期下载和处理新内容的应用程序
  • 从外部附件接收定期更新的应用程序
实现这些服务的应用程序必须声明它们支持的服务,并使用系统框架实现这些服务的相关方面。声明服务可以让系统知道您使用了哪些服务,但在某些情况下,实际上是系统框架阻止了应用程序挂起

但是,iOS电池/电源管理的一个基本设计原则是,随机应用程序不能(也不应该)继续在后台运行。但是,如果您分享您正试图做的事情(即,您在
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
的类。见我的答复的增编。