Jar*_*rod 5 swift ios8 background-fetch
我有一个可以拥有多个用户帐户的应用.我需要在后台更新所有这些内容.问题是:
什么时候应该调用完成处理程序?
Grand Central Dispatch的团队基本上是为了解决这个问题.从Apple 关于该主题的文档:
调度组是一种监视一组块对象以完成的方法.(您可以根据需要同步或异步监视块.)组为代码提供了有用的同步机制,这取决于其他任务的完成.有关使用组的详细信息,请参阅等待排队任务组.
有两种方法可以使用组来监视任务组.第一种是使用异步回调,另一种是阻止当前队列,直到所有分组任务都完成.无论哪种方式,设置都是相同的.
我将通过一个快速示例来帮助您入门(我将在Swift中回答,但同样的方法在Objective-C中超过1-1).首先,定义您的组:
let group = dispatch_group_create()
Run Code Online (Sandbox Code Playgroud)
每个要完成的异步任务输入一次组:
dispatch_group_enter(group)
dispatch_group_enter(group)
Run Code Online (Sandbox Code Playgroud)
运行异步任务,如果要将每个任务标记为已完成,请调用dispatch_group_leave
:
firstAsyncTask {
dispatch_group_leave(group)
}
secondAsyncTask {
dispatch_group_leave(group)
}
Run Code Online (Sandbox Code Playgroud)
如上所述,当组中的所有任务都已完成时,您可以等待当前队列(将阻塞线程)或指定要异步调用的块.
dispatch_group_wait(group, 30 * NSEC_PER_SEC)
Run Code Online (Sandbox Code Playgroud)
这将停止当前线程的执行,直到所有组任务完成,或者30秒后(以较早者为准).
如果您想删除任何时间限制:
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
Run Code Online (Sandbox Code Playgroud)
这个有点简单,只是因为它没有那么多.您指定一个块来调用块作为第二个参数.完成所有组的任务后,将调用此块:
dispatch_group_notify(group, dispatch_get_main_queue()) {
// Code goes here.
}
Run Code Online (Sandbox Code Playgroud)
我最近遇到了类似的情况,并在这里发布了一个问题。
诀窍是(异步)启动所有请求,并让每个请求执行一个回调函数,检查它是否是最后一个请求,或者是否仍有待处理的请求。
如果这确实是最后一个请求,那么回调应该执行最终的完成处理程序。
源代码可以直接从我对这个问题的回答复制到游乐场中:
归档时间: |
|
查看次数: |
2580 次 |
最近记录: |