Swift3 的gcd變化很大碟联,這里列舉一下芥驳,大家可以有個(gè)對(duì)照:
1码撰、Create a serial queue 創(chuàng)建一個(gè)serial queue
OC
dispatch_queue_t queue = dispatch_queue_create("com.leacode.gcd.serialqueue", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{
// 在queue線程執(zhí)行
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主線程
});
});
Swift3
let queue = DispatchQueue(label: "com.leacode.gcd.serialqueue")
queue.async {
// 在queue線程執(zhí)行
DispatchQueue.main.async {
// 回到主線程
}
}
2、Create a concurrent queue 創(chuàng)建一個(gè)concurrent queue
OC
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.leacode.gcd.concurrentqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(concurrentQueue, ^{
// 在queue線程執(zhí)行
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主線程
});
});
Swift3
let queue = DispatchQueue(label: "com.leacode.gcd.concurrentqueue", attributes: [.concurrent])
queue.async {
// 在queue線程執(zhí)行
DispatchQueue.main.async {
// 回到主線程
}
}
3.系統(tǒng)提供的Concurrent Dispatch Queue:
從ios8開(kāi)始蘋(píng)果引入了一個(gè)新的概念 QoS(quality of service)饱亮,有了更貼近使用場(chǎng)景的描述以及更細(xì)致的劃分矾芙,代碼如下
OC
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
dispatch_queue_attr_t globalDispatchQueueBackground = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_BACKGROUND, 0);
dispatch_queue_attr_t globalDispatchQueueUtility = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_UTILITY, 0);
dispatch_queue_attr_t globalDispatchQueueDefault = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_DEFAULT, 0);
dispatch_queue_attr_t globalDispatchQueueUserInitiated = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_USER_INITIATED, 0);
dispatch_queue_attr_t globalDispatchQueueUserInteractive = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_USER_INTERACTIVE, 0);
dispatch_queue_attr_t globalDispatchQueueUnspecified = dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_UNSPECIFIED, 0);
} else {
dispatch_queue_t globalDispatchQueueHigh = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t globalDispatchQueueDefault = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t globalDispatchQueueLow = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
}
Swift3
if #available(iOS 8.0, *) {
let globalDispatchQueueBackground = DispatchQueue.global(qos: DispatchQoS.QoSClass.background)
let globalDispatchQueueUtility = DispatchQueue.global(qos: DispatchQoS.QoSClass.utility)
let globalDispatchQueueDefault = DispatchQueue.global(qos: DispatchQoS.QoSClass.default)
let globalDispatchQueueUserInitiated = DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive)
let globalDispatchQueueUserInteractive = DispatchQueue.global(qos: DispatchQoS.QoSClass.userInteractive)
let globalDispatchQueueUnspecified = DispatchQueue.global(qos: DispatchQoS.QoSClass.unspecified)
} else {
let globalDispatchQueueBackground = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.background)
let globalDispatchQueueLow = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.low)
let globalDispatchQueueDefault = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default)
let globalDispatchQueueHigh = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.high)
}
4.dispatch_after
這部分Swift3的變化較大
OC
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^{
NSLog(@"%@", @"3秒后執(zhí)行");
});
Swift3
let time = DispatchTime.now() + 3
DispatchQueue.main.asyncAfter(deadline: time) {
// 3秒后執(zhí)行
print("3秒后執(zhí)行")
}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 6) {
// 6秒后執(zhí)行2
print("6秒后執(zhí)行")
}
5.掛起和恢復(fù)
OC
dispatch_suspend(queue);
dispatch_resume(queue);
Swift3
queue.suspend()
queue.resume()
6.判斷間隔一段時(shí)間group是否執(zhí)行結(jié)束
OC
dispatch_queue_t queue1 = dispatch_queue_create("com.leacode.gcd.queue1", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue2 = dispatch_queue_create("com.leacode.gcd.queue2", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue3 = dispatch_queue_create("com.leacode.gcd.queue3", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue4 = dispatch_queue_create("com.leacode.gcd.queue4", DISPATCH_QUEUE_SERIAL);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue1, ^{
});
dispatch_group_async(group, queue2, ^{
});
dispatch_group_async(group, queue3, ^{
});
dispatch_group_async(group, queue4, ^{
});
dispatch_time_t group_time = dispatch_time(DISPATCH_TIME_NOW, 1ull*NSEC_PER_SEC);
long result = dispatch_group_wait(group, group_time);
if (result == 0) {
/*
* 屬于Dispatch Group的全部處理執(zhí)行結(jié)束
*/
} else {
/*
* 屬于Dispatch Group的某一個(gè)處理還在進(jìn)行中
*/
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
});
Swift3
let queue1 = DispatchQueue(label: "com.leacode.group.queue1")
let queue2 = DispatchQueue(label: "com.leacode.group.queue2")
let queue3 = DispatchQueue(label: "com.leacode.group.queue3")
let group = DispatchGroup()
queue1.async(group: group) {
}
queue2.async(group: group) {
}
queue3.async(group: group) {
}
/*
* 以下代碼可以判斷間隔時(shí)間為1秒后group是否執(zhí)行完畢,并執(zhí)行相應(yīng)的處理
*/
let afterTime = DispatchTime.now() + 1
let result = group.wait(timeout: afterTime)
if result == .success {
/*
* 屬于Dispatch Group的全部處理執(zhí)行結(jié)束
*/
} else {
/*
* 屬于Dispatch Group的某一個(gè)處理還在進(jìn)行中
*/
}
group.notify(queue: DispatchQueue.main) {
}
7.dispatch_once
這里我們用單例來(lái)舉例近上,oc和swift中都是通過(guò)創(chuàng)建一個(gè)static對(duì)象來(lái)創(chuàng)建單例子剔宪,在swift3中只需要寫(xiě)一個(gè)static變量就可以了:
OC
+ (id)sharedInstance
{
static MyClass *myclass = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
myclass = [[self alloc] init];
});
return myclass;
}
Swift
class MyClass {
static let singleton = MyClass()
private init() {
print("foo")
}
}
在swift中已經(jīng)取消掉dispatch_once了,可以看蘋(píng)果的說(shuō)明鏈接
The free function dispatch_once
is no longer available in Swift. In Swift, you can use lazily initialized globals or static properties and get the same thread-safety and called-once guarantees as dispatch_once
provided
可以通過(guò)設(shè)置懶加載的全局屬性或者靜態(tài)屬性來(lái)達(dá)到線程安全且執(zhí)行一次的效果壹无。