美文网首页iOS开发
Swift 并发请求 同步通知最终结果

Swift 并发请求 同步通知最终结果

作者: iOS坚持者 | 来源:发表于2019-07-10 17:23 被阅读0次

在开发过程中,都会同服务器进行交互,获取数据上传资源等。
在并发请求时,往往都只需要最终的一个结果。
比如,request请求 A,和请求 B, 我只需要知道最终 A 和 B 的执行结果。

  • 第一种办法
    DispatchGroupleave()enter()方法,
let group = DispatchGroup() 

在开始请求 A 时,group.enter()使信号量+1,在回调结果中group.leave() -1,当最终信号量平衡为0时,会执行group.notify(queue: DispatchQueue.global()) {} 中的 block,但是,请注意,如果 leave 和 enter不守恒,会造成内存泄漏
代码如下

for request in netWorkRequests {
    
    DispatchQueue.global().async(group: group, execute: {
        group.enter() //+1
 //模拟网络请求回调 block,因为网络请求也是会异步请求
        DispatchQueue.global().async(execute: {
          group.leave() //-1
            
        })
        print("\(Date()) --> 结束  %d==%@",image, Thread.current)
    })
}

group.notify(queue: DispatchQueue.global()) {

    print("\(Date()) --> 任务完成通知任务组")
}

这种做法简单,只需要 enter、leave 就可以了,但是这样的弊端就是:

一旦没有执行到 group.leave ,没有-1,那么通知永远也不会执行到,也就会造成内存泄漏
  • 第二种办法
    信号量 DispatchSemaphore
let group = DispatchGroup()
let semaphore = DispatchSemaphore(value: 0)

for request in netWorkRequests {
    
    DispatchQueue.global().async(group: group, execute: {
        group.enter() //+1
 //模拟网络请求回调 block,因为网络请求也是会异步请求
        DispatchQueue.global().async(execute: {
          group.leave() //-1
            
        })
        print("\(Date()) --> 结束  %d==%@",image, Thread.current)
    })
}

group.notify(queue: DispatchQueue.global()) {

    print("\(Date()) --> 任务完成通知任务组")
}
//并发执行之后通知结果
group.notify(queue: DispatchQueue.global()) {
    
    for (i, _) in images.enumerated() where i>0{
        
        semaphore.wait(timeout: DispatchTime.now()+DispatchTimeInterval.seconds(2*(images.count-(i+1))))
    }
    print("\(Date()) --> 任务完成通知任务组")
}
//如果信号量为0,则等待执行 semaphore.signal(),如果在 timeout 时间范围内没有 signal,依然会继续执行接下来的代码
semaphore.wait(timeout: DispatchTime.now()+DispatchTimeInterval.seconds(2*images.count))

相关文章

  • Swift 并发请求 同步通知最终结果

    在开发过程中,都会同服务器进行交互,获取数据上传资源等。在并发请求时,往往都只需要最终的一个结果。比如,reque...

  • 同步和异步、阻塞和非阻塞

    关于同步和异步 同步和异步其实指:请求发起方对消息结果的获取是主动发起的,还是被动通知的。如果请求方对结果的获取是...

  • Day03 tornado的同步与异步

    一、同步与异步 并发:同一个世界,但CPU只执行一个任务 并行:多CPU同时执行不同任务 同步:对请求结果来说,上...

  • dispatch_group_notify、dispatch_g

    最近在编码一个多重网络请求,必须等所有请求结束才能最终返回结果,与此同时,请求涉及多次同步异步来回问题。经过不断的...

  • Java实现本地任务聚合与分布式任务聚合

    场景介绍:在高并发场景,如果调用链是A ->B,A不需要立马获取请求的最终结果(可以理解为异步),而A的请求逻辑是...

  • swift 请求通知权限

    一 首先 import UserNotifications 二 请求权限

  • OkHttp同步请求/异步请求

    同步请求 1、创建一个请求对象 2、获取请求结果 Call 对象exexcute()方法分析 在同步代码中,先通过...

  • IO模型及Java实现

    同步与异步的概念 同步I/O 每个请求必须逐个地被处理,一个请求的处理可能导致整个流程的暂时等待,这些事件无法并发...

  • 2019-05-06——常见概念辨析

    同步 vs 异步 同步I/O每个请求必须逐个地被处理,一个请求的处理会导致整个流程的暂时等待,这些事件无法并发地执...

  • iOS-GCD的基本使用和死锁问题

    1./异步函数加并发队列 打印结果: 2./异步函数 + 串行队列 组合 打印结果: 3./同步函数 + 并发队列...

网友评论

    本文标题:Swift 并发请求 同步通知最终结果

    本文链接:https://www.haomeiwen.com/subject/ylnhkctx.html