iOS:仅在APP处于活动状态时重复执行任务(无背景)

时间:2014-02-24 23:26:28

标签: ios iphone objective-c grand-central-dispatch nsoperationqueue

我发现有几个post询问如何运行后台任务。这可以。我知道了。来自Apple的guideline只能用于某些类型的应用。

我的用例如下:我想仅在APP处于前台时更新聊天应用程序的联系人列表。因此,当App分别处于以下状态时,我可以开始/暂停/恢复:didBegan,didEnterBackground,didResumeFromBackground。

如何使用GCD实现此目的?

换句话说,我如何以重复的方式安排异步任务并且每隔一段时间(例如每0.5秒)调用一次异步任务?使用NSOperationQueue有没有很好的实现?

编辑2:我想要执行的任务:

1:从Web服务API获取一个JSON数据对象,其中包含有关联系人的信息(在线状态,设备,最后一次)

2:从Web服务API获取包含消息给用户的JSON数据对象

编辑:NSOperation文档将操作定义为只能用作“单击”的操作,因此创建递归操作可能不是解决此问题的最佳方法。

2 个答案:

答案 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的特殊队列,因此它一次只能运行您的一件事。您可能还想在添加新操作时取消之前的所有操作,以防万一事情开始“堆积”。我不知道你的具体任务是什么,所以很难更准确。