区块链技术博客
www.b2bchain.cn

如何用GCD信号量(Semaphore)来控制弹窗的弹出顺序?求职学习资料

本文介绍了如何用GCD信号量(Semaphore)来控制弹窗的弹出顺序?求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

不知道为什么产品设计一个功能就喜欢用弹窗告诉一下用户,久而久之就会出现一堆弹窗,有提示绑定信息的,有提示有内容更新的,还有一些运营公告。。。
这时候产品只需要考虑弹框的弹出顺序,而我们技术要考虑该如何实现控制弹框顺序。
那么如何实现关了这个再弹下一个呢?
信号量也被称为信号锁:是一个整形值且具有一个初始计数值,支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞,直至计数器大于零,然后线程会减少这个计数。

GCD信号量有三个函数:

dispatch_semaphore_create 创建一个信号量。 dispatch_semaphore_signal 发送一个信号 dispatch_semaphore_wait 等待信号。

那么我们就通过运用这三个函数去实现我们的需求(废话不多说直接贴代码)

typealias alerSignal = (alertView:AlertView,agree:@convention(block) () -> Void,closure: (_ make: ConstraintMaker) -> Void)  //传入自定义的AlerView,回调,布局(SnapKit)  func alerSignalThrottler(alerSignals:[alerSignal]) {    DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async(execute: {        let sema = DispatchSemaphore(value: 0)        alerSignals.forEach { (alertData) in          alerSignal(alertData: alertData, sema: sema)         if sema.wait(timeout: DispatchTime.distantFuture) != .success {           alerSignal(alertData: alertData, sema: sema)         }       }    })  func alerSignal(alertData:alerSignal,sema:DispatchSemaphore) {       DispatchQueue.main.async(execute: {         let alret = UIViewController().initShow(source: alertData.alertView, alertData.closure)         alret.show(animated: true) {         alertData.alertView.alertClick {             switch alertData.alertView.whirlwindState{             case .ignore:                  alret.hide {                     alertData.agree()                      sema.signal()                  }                 break             case .detail(_):                 alret.hide {                    alertData.agree()                     sema.signal()                 }                 break             case .cancel:                 alret.hide {                     alertData.agree()                     sema.signal()                 }                 break             case .agree:                 alret.hide {                     alertData.agree()                     sema.signal()                  }                 break             }           }         }      })    } }

不知道为什么产品设计一个功能就喜欢用弹窗告诉一下用户,久而久之就会出现一堆弹窗,有提示绑定信息的,有提示有内容更新的,还有一些运营公告。。。
这时候产品只需要考虑弹框的弹出顺序,而我们技术要考虑该如何实现控制弹框顺序。
那么如何实现关了这个再弹下一个呢?
信号量也被称为信号锁:是一个整形值且具有一个初始计数值,支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞,直至计数器大于零,然后线程会减少这个计数。

GCD信号量有三个函数:

dispatch_semaphore_create 创建一个信号量。 dispatch_semaphore_signal 发送一个信号 dispatch_semaphore_wait 等待信号。

那么我们就通过运用这三个函数去实现我们的需求(废话不多说直接贴代码)

typealias alerSignal = (alertView:AlertView,agree:@convention(block) () -> Void,closure: (_ make: ConstraintMaker) -> Void)  //传入自定义的AlerView,回调,布局(SnapKit)  func alerSignalThrottler(alerSignals:[alerSignal]) {    DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async(execute: {        let sema = DispatchSemaphore(value: 0)        alerSignals.forEach { (alertData) in          alerSignal(alertData: alertData, sema: sema)         if sema.wait(timeout: DispatchTime.distantFuture) != .success {           alerSignal(alertData: alertData, sema: sema)         }       }    })  func alerSignal(alertData:alerSignal,sema:DispatchSemaphore) {       DispatchQueue.main.async(execute: {         let alret = UIViewController().initShow(source: alertData.alertView, alertData.closure)         alret.show(animated: true) {         alertData.alertView.alertClick {             switch alertData.alertView.whirlwindState{             case .ignore:                  alret.hide {                     alertData.agree()                      sema.signal()                  }                 break             case .detail(_):                 alret.hide {                    alertData.agree()                     sema.signal()                 }                 break             case .cancel:                 alret.hide {                     alertData.agree()                     sema.signal()                 }                 break             case .agree:                 alret.hide {                     alertData.agree()                     sema.signal()                  }                 break             }           }         }      })    } }

不知道为什么产品设计一个功能就喜欢用弹窗告诉一下用户,久而久之就会出现一堆弹窗,有提示绑定信息的,有提示有内容更新的,还有一些运营公告。。。
这时候产品只需要考虑弹框的弹出顺序,而我们技术要考虑该如何实现控制弹框顺序。
那么如何实现关了这个再弹下一个呢?
信号量也被称为信号锁:是一个整形值且具有一个初始计数值,支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞,直至计数器大于零,然后线程会减少这个计数。

GCD信号量有三个函数:

dispatch_semaphore_create 创建一个信号量。 dispatch_semaphore_signal 发送一个信号 dispatch_semaphore_wait 等待信号。

那么我们就通过运用这三个函数去实现我们的需求(废话不多说直接贴代码)

typealias alerSignal = (alertView:AlertView,agree:@convention(block) () -> Void,closure: (_ make: ConstraintMaker) -> Void)  //传入自定义的AlerView,回调,布局(SnapKit)  func alerSignalThrottler(alerSignals:[alerSignal]) {    DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async(execute: {        let sema = DispatchSemaphore(value: 0)        alerSignals.forEach { (alertData) in          alerSignal(alertData: alertData, sema: sema)         if sema.wait(timeout: DispatchTime.distantFuture) != .success {           alerSignal(alertData: alertData, sema: sema)         }       }    })  func alerSignal(alertData:alerSignal,sema:DispatchSemaphore) {       DispatchQueue.main.async(execute: {         let alret = UIViewController().initShow(source: alertData.alertView, alertData.closure)         alret.show(animated: true) {         alertData.alertView.alertClick {             switch alertData.alertView.whirlwindState{             case .ignore:                  alret.hide {                     alertData.agree()                      sema.signal()                  }                 break             case .detail(_):                 alret.hide {                    alertData.agree()                     sema.signal()                 }                 break             case .cancel:                 alret.hide {                     alertData.agree()                     sema.signal()                 }                 break             case .agree:                 alret.hide {                     alertData.agree()                     sema.signal()                  }                 break             }           }         }      })    } }

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 如何用GCD信号量(Semaphore)来控制弹窗的弹出顺序?求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们