【发布时间】:2014-03-26 22:00:47
【问题描述】:
我找到了几个post 询问如何运行后台任务。这可以。我知道了。有一个来自 Apple 的 guideline,只能用于某些类型的应用程序。
我的用例如下:我只想在聊天应用处于前台时更新联系人列表。因此,当应用程序分别进入以下状态时,我可以启动/暂停/恢复:didBegan、didEnterBackground、didResumeFromBackground。
如何使用 GCD 实现这一目标?
换句话说,我怎样才能以重复的方式安排一个异步任务,并且只每隔一段时间(比如每 0.5 秒)调用一次?使用 NSOperationQueue 有好的实现吗?
编辑 2:我要执行的任务:
1:从 Web 服务 API 获取一个 JSON 数据对象,其中包含有关联系人的信息(在线状态、设备、上次访问时间)
2:从 Web 服务 API 获取一个 JSON 数据对象,其中包含发送给用户的消息
编辑:NSOperation 文档将操作定义为只能用作“单次”的操作,因此创建递归操作可能不是解决此问题的最佳方法。
【问题讨论】:
-
嗯?递归操作?您可以使用块创建操作,它的行为与调度队列完全相同。
-
@LeoNatan 我在 cmets 中看到了你的观点。我会试试你的方法。所以基本上 NSTimer 对象仅在应用程序在前台而不是在后台并且有自己的内部恢复/挂起方法正确时执行?
-
是的。当应用程序进入后台时,计时器会暂停。当它返回前台时,计时器将恢复,任何到期的计时器都会触发。对此的一个警告是,您的应用程序可能会在后台唤醒(例如,来自推送)。当应用程序运行时,计时器也会在后台运行。
-
@LeonNatan 谢谢。不一样但相关:当APP进入后台时,调度队列会发生什么?队列是否暂停然后恢复?如果没有,如果任务还没有到达区块会发生什么?换句话说,如果我调用“dispatch_async(server_queue, ^{block})”,是否总是会到达 block?
-
整个应用程序被挂起,所以是的,调度队列和操作队列都被挂起。如果您已将任务或操作排入队列,它将在系统恢复后触发(当应用程序进入前台或恢复在后台运行时)。
标签: ios iphone objective-c grand-central-dispatch nsoperationqueue