背景和NSThread

问题描述:

我想了解NSThread是如何工作的,当应用程序去背景。我有以下代码在appdeligate:背景和NSThread

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [self backgroundHandler]; 
} 

- (void)backgroundHandler { 

    NSInteger counter=0;int scontinue=true; 
    while(scontinue){ 
     NSLog(@"counter:%d",counter++); 
     sleep(1) 

    } 
} 

当我去背景然后它打印出每隔1秒一个值。我保持它打开了大约5分钟,它给了我:

counter:1 
counter:2 
... 
counter:300 

而这一直在继续。但是,如果尝试进入前台,backgroundHandler不会退出while循环,并且我的应用程序不响应任何内容。

现在我改变applicationDideEnterBackground,而是我使用一个线程,即

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [NSThread detachNewThreadSelector:@selector(backgroundHandler) toTarget:self withObject:nil]; 
} 
- (void)backgroundHandler { 
    NSInteger counter=0;int scontinue=true; 
    while(scontinue){ 
     NSLog(@"counter:%d",counter++); 
     //sleep(1) : I remove the sleep for the shake of the example 
    } 
} 

虽然我期待有相同的行为在前面的情况下,线程似乎是举办一些毫秒后。所以我得到的结果是:

counter:1 
counter:2 
... 
counter:30 

现在线程在那个时候没有执行任何操作。当我走到前台时,线程再次开始运行,即计数器增加并且正在打印输出。应用程序正常运行。

上面的例子是我打算做的一个相当简单的版本。我真正想要的是,只要用户不去前台,通过应用程序转到后台与服务器进行通信的时间。什么时候它应该终止。所以我真正想要的是上面简单示例的组合,即当在while循环中继续询问服务器时,以及当我进入前台时,我的应用程序开始正常响应并终止backgroundHandler for循环。

任何帮助?

- (void)applicationDidEnterBackground:(UIApplication *)application的主要目的是在应用程序进入后台时保存应用程序的状态。在这种情况下,如果应用程序开始使用大量的CPU或RAM,则操作系统将根据手机的状态终止应用程序。

当您想要执行后台操作或服务时,通过调用AppDelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中的[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];来启用后台提取。

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    //Add your code here 
[self setBackgroundCheckInterval:UIBackgroundFetchResultNewData]; 
    completionHandler(UIBackgroundFetchResultNewData); 
} 
- (void)setBackgroundCheckInterval:(NSInteger)resultCode 
{ 
    UIBackgroundRefreshStatus status = [UIApplication sharedApplication].backgroundRefreshStatus; 
    if (status == UIBackgroundRefreshStatusAvailable) 
    { 
     switch (resultCode) 
     { 
      case UIBackgroundFetchResultFailed : 
       [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:BACKGROUND_CHECK_INTERVAL_NO_NEW_DATA]; 
       break; 

      case UIBackgroundFetchResultNewData : 
       [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:BACKGROUND_CHECK_INTERVAL_NEW_DATA]; 
       break; 

      case UIBackgroundFetchResultNoData : 
       [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:BACKGROUND_CHECK_INTERVAL_NO_NEW_DATA]; 
       break; 
     } 
    } 
} 
+0

这些常数变量是什么? BACKGROUND_CHECK_INTERVAL_NO_NEW_DATA BACKGROUND_CHECK_INTERVAL_NEW_DATA BACKGROUND_CHECK_INTERVAL_NO_NEW_DATA –

+0

Furhtermore,因为我很新,有可能给我一个参考/书一个完整的例子来检查? –

+0

BACKGROUND_CHECK_INTERVAL_NO_NEW_DATA BACKGROUND_CHECK_INTERVAL_NEW_DATA这些是为后台进程提供timeValue以运行的宏 –