完整详解swift GCD系列(二)dispatch_after;dispatch_apply;dispatch_once

前端之家收集整理的这篇文章主要介绍了完整详解swift GCD系列(二)dispatch_after;dispatch_apply;dispatch_once前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原创Blog,转载请注明出处

本文阅读的过程中,如有概念不懂,请参照前专栏中之前的文章,如果还有疑惑,请留言。

这是我关于GCD专栏的地址

http://blog.csdn.net/column/details/swift-gcd.html

本教涵盖的内容
一、dispatch_after
二、dispatch_apply
三、dispatch_once


一、dispatch_after
功能:延迟一段时间把一项任务提交到队列中执行,返回之后就不能取消
常用来在在主队列上延迟执行一项任务
函数原型
[plain] view plain copy
  1. funcdispatch_after(_when:dispatch_time_t,
  2. _queue:dispatch_queue_t!,
  3. _block:dispatch_block_t!)
参数
copy
@H_404_70@ when过了多久执行的时间间隔
  • queue提交到的队列
  • block执行的任务

  • 例如:可以利用dispatch_after写一个自己用的Delay函数,delay一段时间在主线程上执行一段代码
    copy
    @H_404_70@ funchwcDelay(delay:Double,closure:()->()){
  • dispatch_after(
  • dispatch_time(
  • DISPATCH_TIME_NOW,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> Int64(delay*Double(NSEC_PER_SEC))
  • ),108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> dispatch_get_main_queue(),closure)
  • }

  • 只需要这样使用
    hwcDelay(0.5){
    //Do everything you want
    }
    比如,当用户的应用不满足某些我们App需要的条件时候(例如,我们的App需要蓝牙打开),然后在APP启动的时候测到蓝牙Off后,应当给用户一个提示。在view载入完成后,延迟给用户一个提示,也可以给这个提示添加一些动画,要比view在载入完成直接显示提示要有好的多。
    举例
    在viewLoad后,延迟1s,提示一个alertview
    copy
    @H_404_70@ classViewController:UIViewController{
  • funchwcDelay(delay:Double,closure:()->()){
  • dispatch_after(
  • dispatch_time(
  • DISPATCH_TIME_NOW,
  • Int64(delay*Double(NSEC_PER_SEC))
  • ),248); margin:0px!important; padding:0px 3px 0px 10px!important"> dispatch_get_main_queue(),closure)
  • }
  • overridefuncviewDidLoad(){
  • super.viewDidLoad()
  • hwcDelay(1.0){
  • varalertview=UIAlertView(title:"Dispatch_after",message:"Message",delegate:self,cancelButtonTitle:"OK")
  • alertview.show()
  • }
  • overridefuncdidReceiveMemoryWarning(){
  • super.didReceiveMemoryWarning()
  • 二、dispatch_apply
    功能:把一项任务提交到队列中多次执行,具体是并行执行还是串行执行由队列本身决定.注意,dispatch_apply不会立刻返回,在执行完毕后才会返回,是同步的调用
    copy
    @H_404_70@ funcdispatch_apply(_iterations:UInt,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> _block:((UInt)->Void)!)
  • 参数
    copy
    @H_404_70@ iterations执行的次数
  • 那么,何时使用这个函数呢?从它的功能不难看出,如果我们可以把不相关的循环提交到后台线程并行执行,并且循环任务调度到后台执行的效率提高,能抵消掉队列调度本身的开销,那么效率会显著提高。
    比如我有一个数组,存储了一系列对象,初始化的时候,这些对象都要调用一次某函数来进行相关的计算。这些计算相互没有影响。这时,我们就可以用dispatch_apply来使用异步队列来初始化.这里把这种情况进行简化
    copy
      varhwcarray=["hello","hwc","hellohwc"]
    1. overridefuncviewDidLoad(){
    2. super.viewDidLoad()
    3. dispatch_apply(3,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)){
    4. (index:UInt)->()in
    5. varexpObject=self.hwcarray[Int(index)]asNSString
    6. NSLog("%d",expObject.length)
    7. NSLog("Dispatch_afterisover")
    8. overridefuncdidReceiveMemoryWarning(){
    9. super.didReceiveMemoryWarning()
    10. }
    可以看到,输出
    copy
    @H_404_70@ 3
  • 5
  • 8
  • dispatch_afterisover
  • 由于这样会阻塞主线程,而下文又与dispatch_apply的执行结果无关,所以可以在异步队列中掉dispatch_apply,然后执行完成后进行通知
    copy
    @H_404_70@ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,248); margin:0px!important; padding:0px 3px 0px 10px!important"> dispatch_apply(3,0)){
  • (index:UInt)->()in
  • varexpObject=self.hwcarray[Int(index)]asNSString
  • NSLog("%d",expObject.length)
  • NSLog("Dispatch_afteringlobalqueueisover")
  • NSLog("Dispatch_afterinmainqueueisover")
  • 这样输出

    copy
    @H_404_70@ 8
  • Dispatch_afterinmainqueueisover
  • 3
  • Dispatch_afteringlobalqueueisover
  • 可以看到,相对主队列(主线程)是异步的,在global队列中是并行执行的


    三、dispatch_once

    功能保证在APP运行期间,block中的代码只执行一次
    func dispatch_once(_ predicate: UnsafeMutablePointer<dispatch_once_t>,
    _ block: dispatch_block_t!)
    predicate 用来判断提交的block是否执行完成
    block 执行一次的任务
    dispatch_once的经典实用场景是单例
    单例代码
    copy
    @H_404_70@ classhwcSingleton{
  • vartestVariable:Int!
  • funcprint(){
  • testVariable=testVariable+1
  • println(testVariable)
  • classvarsharedObject:hwcSingleton{
  • structStaticStruct{
  • staticvarpredicate:dispatch_once_t=0
  • staticvarinstance:hwcSingleton?=nil
  • dispatch_once(&StaticStruct.predicate){
  • StaticStruct.instance=hwcSingleton()
  • StaticStruct.instance?.testVariable=10
  • returnStaticStruct.instance!
  • 当然也可以在多线程环境下,保证一段代码只执行一次。

    猜你在找的Swift相关文章