加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 后台获取中多个异步请求的最佳实践是什么?

发布时间:2020-12-14 02:26:09 所属栏目:百科 来源:网络整理
导读:我有一个可以拥有多个用户帐户的应用.我需要在后台更新所有这些内容.问题是: 时间有限(约30秒,但请求可能需要更长时间) 所有请求都是异步的 什么时候应该调用完成处理程序? Grand Central Dispatch的团队基本上是为了解决这个问题.来自Apple的 documentati
我有一个可以拥有多个用户帐户的应用.我需要在后台更新所有这些内容.问题是:

>时间有限(约30秒,但请求可能需要更长时间)
>所有请求都是异步的

什么时候应该调用完成处理程序?

Grand Central Dispatch的团队基本上是为了解决这个问题.来自Apple的 documentation主题:

A dispatch group is a way to monitor a set of block objects for completion. (You can monitor the blocks synchronously or asynchronously depending on your needs.) Groups provide a useful synchronization mechanism for code that depends on the completion of other tasks. For more information about using groups,see Waiting on Groups of Queued Tasks.

有两种方法可以使用组来监视任务组.第一种是使用异步回调,另一种是阻止当前队列,直到所有分组任务都完成.无论哪种方式,设置都是相同的.

我将通过一个快速示例来帮助您入门(我将在Swift中回答,但同样的方法在Objective-C中超过1-1).首先,定义您的组:

let group = dispatch_group_create()

每个要完成的异步任务输入一次组:

dispatch_group_enter(group)
dispatch_group_enter(group)

运行异步任务,当您想要将每个任务标记为已完成时,请调用dispatch_group_leave:

firstAsyncTask {
    dispatch_group_leave(group)
}

secondAsyncTask {
    dispatch_group_leave(group)
}

如上所述,当组中的所有任务都已完成时,您可以等待当前队列(将阻塞线程)或指定要异步调用的块.

等待

dispatch_group_wait(group,30 * NSEC_PER_SEC)

这将停止当前线程的执行,直到所有组任务完成,或者30秒后(以较早者为准).

如果您想删除任何时间限制:

dispatch_group_wait(group,DISPATCH_TIME_FOREVER)

异步

这个有点简单,只是因为它没有那么多.您指定一个块来调用块作为第二个参数.完成所有组的任务后,将调用此块:

dispatch_group_notify(group,dispatch_get_main_queue()) {
    // Code goes here.
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读