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,希望大家关注