Swift之GCD(一)

GCD市IOS多任务的核心,广泛的应用在系统层的几乎各个方便,应用也很广泛,以前我们也许用过

performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay:<(NSTimeInterval)#>这个来延迟一段时间来执行某个方法,但在swift中这个方法好像不存在了,这时候我们就可以用GCD提供的dispatch_after来代替,他的用法是这样的

        var mainQ = dispatch_get_main_queue()//这一句是获得主队列

        var time = dispatch_time(DISPATCH_TIME_NOW, (Int64)(5 * NSEC_PER_SEC)).

        //这是获得一个dispatch_time_t的变量,第一个参数dispatch_time_t是这个类型也就是UInt64类型的参数,第二个参数是延迟的时间,单位是纳秒,但是我们一般都是用的秒,所以乘以这个常量NSEC_PER_SEC之后就把秒转换成了纳秒

        dispatch_after(time, mainQ) { () -> Void in

            //在这里调用延迟后需要执行的方法或者写你需要执行的代码

        }

       但是有时候我们不想用主队列,我们应该怎么获得队列呢,有两种方式获取dispatch_queue_t

      第一种是dispatch_get_global_queue

      第二种是dispatch_queue_create

      首先我们看第一种方式 var globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)

     首先我们来看第二个参数,为什么是0呢,Reserved for future use. Passing any value other than zero may result in a NULL return value.苹果是这样说的保留以供将来使用。       通过零以外的任何值可能会导致空返回值。

DISPATCH_QUEUE_PRIORITY_HIGH

DISPATCH_QUEUE_PRIORITY_DEFAULT

DISPATCH_QUEUE_PRIORITY_LOW

DISPATCH_QUEUE_PRIORITY_BACKGROUND

    第一个参数是一个常量有以上四种值表示的时优先级,GCD会根据可用线程尽可能从高优先级队列调度,等高优先级队列空了以后以后,会继续调用默认优先级队列,以此类推,但要记住是尽可能,并不是一定

   接下来我们来看第二种方式 var queue = dispatch_queue_create("low", DISPATCH_QUEUE_SERIAL)

   我们来看一下第二个参数dispatch_queue_attr_t typealias dispatch_queue_attr_t = NSObject也就是任何对象都可以,我不知道用其他对象时,运行时会不会出错,但声明时不会出错

  但是我一般都用系统定义的常量DISPATCH_QUEUE_SERIAL(调用队列时先进先出)或者DISPATCH_QUEUE_CONCURRENT(并发调用队列)

  有人可能会问,我为什么创建这么多队列呢,因为GCD不仅仅就这么一个功能,还有其他的功能我们接下来就接着看吧

  下面我在介绍GCD常用的2个方法dispatch_async,dispatch_sync还是直接上代码吧,

  

        var globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)

        dispatch_async(globalQ, { () -> Void in

            NSThread.sleepForTimeInterval(4)//这句话的作用是休眠4秒,4秒之后在往下执行

            println("globalQ1")

        })

        dispatch_async(globalQ, { () -> Void in

            NSThread.sleepForTimeInterval(3)

             println("globalQ2")

        })

        dispatch_async(globalQ, { () -> Void in

            NSThread.sleepForTimeInterval(2)

            println("globalQ3")

        })

        dispatch_async(globalQ, { () -> Void in

            NSThread.sleepForTimeInterval(1)

            println("globalQ4")

        })

    这里的输出结果是globalQ4  globalQ3  globalQ2  globalQ1 因为dispatch_async会直接返回,而代码block里的代码要等待全局队列调用,所以会出现这种情况

   

    var globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)

        dispatch_sync(globalQ, { () -> Void in

            NSThread.sleepForTimeInterval(4)

            println("globalQ1")

        })

        dispatch_sync(globalQ, { () -> Void in

            NSThread.sleepForTimeInterval(3)

            println("globalQ2")

        })

        dispatch_sync(globalQ, { () -> Void in

            NSThread.sleepForTimeInterval(2)

            println("globalQ3")

        })

        dispatch_sync(globalQ, { () -> Void in

            NSThread.sleepForTimeInterval(1)

            println("globalQ4")

        })

     这里的输出结果是globalQ1  globalQ2  globalQ3  globalQ4因为dispatch_sync会等block里面的代码执行完才会接着往下执行,我对于GCD也是一知半解,还希望大家不吝赐教,接下来还会接着分享我所了解的GCD,希望大家关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值