我发现有几个post询问如何运行后台任务。这可以。我知道了。来自Apple的guideline只能用于某些类型的应用。
我的用例如下:我想仅在APP处于前台时更新聊天应用程序的联系人列表。因此,当App分别处于以下状态时,我可以开始/暂停/恢复:didBegan,didEnterBackground,didResumeFromBackground。
如何使用GCD实现此目的?
换句话说,我如何以重复的方式安排异步任务并且每隔一段时间(例如每0.5秒)调用一次异步任务?使用NSOperationQueue有没有很好的实现?
编辑2:我想要执行的任务:
1:从Web服务API获取一个JSON数据对象,其中包含有关联系人的信息(在线状态,设备,最后一次)
2:从Web服务API获取包含消息给用户的JSON数据对象
编辑:NSOperation文档将操作定义为只能用作“单击”的操作,因此创建递归操作可能不是解决此问题的最佳方法。
答案 0 :(得分:3)
以下是一些关于如何使用计时器以及GCD和操作队列实现此目的的代码。
NSOperationQueue* queue = [NSOperationQueue new];
[queue setMaxConcurrentOperationCount:1]; //Make serial.
//dispatch_queue_t queue = dispatch_queue_create("queue", NULL); //Serial queue.
先生们,启动你的计时器:
[NSTimer scheduledTimerWithTimeInterval:0.0 target:appDelegate selector:@selector(timerTicked:) userInfo:nil repeats:NO]; //Start a timer with 0 so it ticks immediately.
现在在方法中:
- (void)timerTicked:(NSTimer*)timer
{
NSLog(@"Timer ticked!");
void (^block)() = ^{
//Do what you need here.
//Start a new timer.
[NSTimer scheduledTimerWithTimeInterval:1.0 target:appDelegate selector:@selector(timerTicked:) userInfo:nil repeats:NO];
};
[queue addOperationWithBlock:block];
//dispatch_async(queue, block);
}
我使用app委托,因为计时器保留了目标对象,所以我不希望它在视图控制器中。您可以在计时器滴答之后或操作/任务完成后安排下一个计时器,这是我喜欢的。
答案 1 :(得分:1)
使用NSTimer计划每0.5秒触发一次的计时器。它可以将您的NSOperation添加到NSOperationQueue。您可能希望创建一个最大并发度为1的特殊队列,因此它一次只能运行您的一件事。您可能还想在添加新操作时取消之前的所有操作,以防万一事情开始“堆积”。我不知道你的具体任务是什么,所以很难更准确。