我有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的新手,所以也许我在这里错过了一些小东西。我只是希望我的应用程序继续在后台运行。请帮帮我。
答案 0 :(得分:1)
首先:dispatch_queue优先级与在后台运行无关......它是队列中的优先级。
以下是信息:
DISPATCH_QUEUE_PRIORITY_HIGH分派给队列的项目将以高优先级运行,即队列将被安排在任何默认优先级或低优先级队列之前执行。
DISPATCH_QUEUE_PRIORITY_DEFAULT调度到队列的项目将以默认优先级运行,即在调度所有高优先级队列之后,但在安排任何低优先级队列之前,将调度队列执行。
DISPATCH_QUEUE_PRIORITY_LOW调度到队列的项目将以低优先级运行,即在调度所有默认优先级和高优先级队列后,将调度队列执行。
DISPATCH_QUEUE_PRIORITY_BACKGROUND调度到队列的项目将以后台优先级运行,即在调度所有优先级较高的队列后,队列将被调度执行,系统将根据setpriority在具有后台状态的线程上运行此队列上的项目( 2)(即磁盘I / O被限制,线程的调度优先级设置为最低值)。
对于"真实"后台操作检查这个:
您的问题的答案取决于您想要做什么。
答案 1 :(得分:0)
只有设置了相应plist标志的以下类型的应用才能在应用仍处于前台时执行后台进程:
如果您的应用超出了其中一个类别,并且会通过应用商店批准,那么您需要制定另一种策略来完成您希望进行预制的后台工作。
可在此处找到更多信息: