Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.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
Iphone 如何知道任务是否在后台执行_Iphone_Objective C_Ios_Ipad_Background - Fatal编程技术网

Iphone 如何知道任务是否在后台执行

Iphone 如何知道任务是否在后台执行,iphone,objective-c,ios,ipad,background,Iphone,Objective C,Ios,Ipad,Background,在我的应用程序中,我用一种方法下载了很多图片 我用的是一个 downloadTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [[UIApplication sharedApplication] endBackgroundTask:downloadTask];

在我的应用程序中,我用一种方法下载了很多图片

我用的是一个

 downloadTask = [[UIApplication sharedApplication]
                   beginBackgroundTaskWithExpirationHandler:^{

                       [[UIApplication sharedApplication] endBackgroundTask:downloadTask]; 
                       downloadTask = UIBackgroundTaskInvalid;

                   }]; 
这是工作正常,如果我按下主页或睡眠按钮,图像继续下载

我在UIAlertView内部的UIProgressView中显示进度,当百分比为100%时,alertView将消失,我将viewController更改为其他,在其中显示已加载的图像。 但我只希望在下载完成时应用程序真的处于活动状态时发生这种情况

我一直在看应用程序的状态,而它的屏幕关闭下载

[UIApplication sharedApplication].applicationState
在所有donwload期间,状态为UIApplicationStateActive

我如何知道下载是在屏幕关闭还是打开的情况下进行的

接受答案后编辑:

我刚刚发现,如果我点击home按钮,应用程序将进入UIApplicationStateBackground,如果我点击wake/sleep,它将进入UIApplicationStateInactive


按照正确答案的方法,我的应用程序在这两种情况下都会继续加载。

您可以通过在指定的应用程序委托方法中设置标志来检查您的应用程序是否在后台运行。
applicationidentinterbackground:
applicationWillEnterForeground:
。例如:

- (void)applicationDidEnterBackground:(UIApplication *)application
    _applicationRunsInForeground = NO;
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    _applicationRunsInForeground = YES;
}

如果您不希望在应用程序代理中具有此
\u applicationrunsinfront
标志,可以改为在viewcontroller类中观察代理的NSNotifications(
UIApplicationWillEnterForegroundNotification
UIApplicationIdentinterBackgroundNotification
).

您可以通过在指定的应用程序委托方法
applicationidentinterbackground:
applicationWillEnterForeground:
中设置一个标志来检查您的应用程序是否在后台运行。例如:

- (void)applicationDidEnterBackground:(UIApplication *)application
    _applicationRunsInForeground = NO;
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    _applicationRunsInForeground = YES;
}
如果您不希望在应用程序代理中具有此
\u applicationrunsinfront
标志,可以改为在viewcontroller类中观察代理的NSNotifications(
UIApplicationWillEnterForegroundNotification
UIApplicationIdentinterBackgroundNotification
).

屏幕在两种状态下关闭(应用程序尚未打开时除外):

  • 暂停:在这种情况下,您不必担心,因为在应用程序再次激活之前,下载不会继续进行;它将在
  • background:在进入挂起状态之前,它处于该状态的时间有限,此时屏幕已关闭。在这里,您可能需要检查是否执行您所说的所有操作,因为在这种状态下,代码仍然可以执行。在此状态下,应用程序状态为UIApplicationStateBackground,因此您可以执行如下检查:
您可能需要检查应用程序是否在后台执行,以获得结果。就这样,

if([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
  // Do stuff  
}
如果它在后台,那么屏幕将关闭

更新:经过几次测试,我发现您正在体验的行为可能是由于在主线程上执行下载

您应该在(例如)全局队列上发送下载。这样,应用程序将按预期进入后台状态:

....
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.bti];
    }];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self doBackgroundStuff];
});
....
这样,如果在下载过程中将应用程序放在后台,应用程序状态将变为UIApplicationStateBackground,然后您可以按照我最初编写的那样进行检查。如果您正在进行UI更新,请记住将其发送回主线程(因为下载现在位于另一个线程上)。

屏幕在两种状态下关闭(应用程序尚未打开时除外):

  • 暂停:在这种情况下,您不必担心,因为在应用程序再次激活之前,下载不会继续进行;它将在
  • background:在进入挂起状态之前,它处于该状态的时间有限,此时屏幕已关闭。在这里,您可能需要检查是否执行您所说的所有操作,因为在这种状态下,代码仍然可以执行。在此状态下,应用程序状态为UIApplicationStateBackground,因此您可以执行如下检查:
您可能需要检查应用程序是否在后台执行,以获得结果。就这样,

if([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
  // Do stuff  
}
如果它在后台,那么屏幕将关闭

更新:经过几次测试,我发现您正在体验的行为可能是由于在主线程上执行下载

您应该在(例如)全局队列上发送下载。这样,应用程序将按预期进入后台状态:

....
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.bti];
    }];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self doBackgroundStuff];
});
....

这样,如果在下载过程中将应用程序放在后台,应用程序状态将变为UIApplicationStateBackground,然后您可以按照我最初编写的那样进行检查。如果您正在进行UI更新,请记住将其发送回主线程(因为下载现在位于另一个线程上)。

问题是,在应用程序完成后台任务之前,不会调用ApplicationIdentinterBackground,这是不可能的。当用户点击home按钮或用户按下设备上的sleep/wake按钮时,总是会调用ApplicationIdentinterBackground委托方法。问题是,在应用程序完成后台任务之前不会调用ApplicationIdentinterBackground,这是不可能的。当用户点击home按钮或用户按下设备上的sleep/wake按钮时,总是会调用ApplicationIdentinterBackground委托方法。但似乎使用beginBackgroundTaskWithExpirationHandler,应用程序直到