背景和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;
}
}
}
这些常数变量是什么? BACKGROUND_CHECK_INTERVAL_NO_NEW_DATA BACKGROUND_CHECK_INTERVAL_NEW_DATA BACKGROUND_CHECK_INTERVAL_NO_NEW_DATA –
Furhtermore,因为我很新,有可能给我一个参考/书一个完整的例子来检查? –
BACKGROUND_CHECK_INTERVAL_NO_NEW_DATA BACKGROUND_CHECK_INTERVAL_NEW_DATA这些是为后台进程提供timeValue以运行的宏 –