iOS应用程序在后台运行仅1秒

时间:2015-02-27 12:43:36

标签: ios objective-c iphone

我有2个班级,ViewController班级和Worker。我需要在后台运行的所有代码都在Worker类中。

我的ViewController看起来像这样:

- (void)viewDidLoad {
 //create an instance of 'Worker'
}
- buttonClick {
 //call the 'manager' method in the worker instance that was just created (do this method as a background thread)
}

我的Worker课程类似于:

- (void)manager {
    //call 'repeat' method as a background thread    
}

- (void)repeat {
    //call 'innerWorker' method as a background thread    
}
- (void)innerWorker {
    //do work
}

repeat方法需要每秒运行一次。

我已经尝试了以下两种方法来使repeat方法每秒运行一次。

方法1:

timerObj = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(repeatMethod) userInfo:nil repeats:YES]; 

方法2: 将此代码放在repeat

的末尾
dispatch_queue_t q_background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, q_background, ^(void){
    [self repeatMethod];
});

只要应用程序位于前台,这两种方法都可以正常工作,但是当我按下主页按钮时,repeat方法最后一次运行,但不会调用innerWorker方法,然后应用程序被暂停。我通过在整个地方使用NSLog来了解这一点。

我意识到方法2有点像黑客,但这很好,因为这是一个我不会发布的内部应用程序。

使用此代码将所有方法称为后台线程:例如:

dispatch_queue_t q_background = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
        dispatch_async(q_background, ^{
            [self repeatMethod];
        });

我是iOS的新手,所以也许我在这里错过了一些小东西。我只是希望我的应用程序继续在后台运行。请帮帮我。

2 个答案:

答案 0 :(得分:1)

首先:dispatch_queue优先级与在后台运行无关......它是队列中的优先级。

以下是信息:

  

DISPATCH_QUEUE_PRIORITY_HIGH分派给队列的项目将以高优先级运行,即队列将被安排在任何默认优先级或低优先级队列之前执行。

     

DISPATCH_QUEUE_PRIORITY_DEFAULT调度到队列的项目将以默认优先级运行,即在调度所有高优先级队列之后,但在安排任何低优先级队列之前,将调度队列执行。

     

DISPATCH_QUEUE_PRIORITY_LOW调度到队列的项目将以低优先级运行,即在调度所有默认优先级和高优先级队列后,将调度队列执行。

     

DISPATCH_QUEUE_PRIORITY_BACKGROUND调度到队列的项目将以后台优先级运行,即在调度所有优先级较高的队列后,队列将被调度执行,系统将根据setpriority在具有后台状态的线程上运行此队列上的项目( 2)(即磁盘I / O被限制,线程的调度优先级设置为最低值)。

对于"真实"后台操作检查这个:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

您的问题的答案取决于您想要做什么。

答案 1 :(得分:0)

只有设置了相应plist标志的以下类型的应用才能在应用仍处于前台时执行后台进程:

  • 在后台播放用户可听内容的应用,
    例如音乐播放器应用
  • 在后台录制音频内容的应用
  • 随时向用户通知其位置的应用,例如 作为导航应用
  • 支持互联网协议语音(VoIP)的应用
  • 需要定期下载和处理新内容的应用
  • 从外部附件接收定期更新的应用

如果您的应用超出了其中一个类别,并且会通过应用商店批准,那么您需要制定另一种策略来完成您希望进行预制的后台工作。

可在此处找到更多信息:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW3