GCD对象封装GCDQuene指南

源码地址

源代码Github

custom-ui repo

GCDQuene

dispatch_queue_t为操作对象的类

GCDGroup

dispatch_group_t为操作对象的类

GCDSemaphore

dispatch_semaphore_t为操作对象的类

基本用法

获取一个任意Quene

1
GCDQuene* q = [GCDQuene queneWithName:@"MySpecialQuene"];

获取主线程Quene

1
GCDQuene* m = [GCDQuene mainQueneInstance];

同步操作

1
2
3
4
GCDQuene* q = [GCDQuene queneWithName:@"MySpecialQuene"];
q.sync(^{
});

注意在主线程执行主线程的sync操作会死锁,不要问我为什么

异步操作

1
2
3
q.async(^{
});

混合操作

1
2
3
4
5
6
7
8
9
GCDQuene* q = [GCDQuene queneWithName:@"MySpecialQuene"];
GCDQuene* m = [GCDQuene mainQueneInstance];
q.async(^{
//异步操作
m.async(^{
//主线程操作
});
});

多线程并发等待

这里要用到GCDGroup

1
2
3
4
5
6
7
8
9
10
11
12
GCDQuene* quene1 = [GCDQuene queneWithName:@"MyQuene1"];
GCDQuene* quene2 = [GCDQuene queneWithName:@"MyQuene1"];
GCDGroup * g = [[GCDGroup alloc] init];
g.async(quene1.quene_t, ^{
//并发操作1
})
.async(quene2.quene_t, ^{
//并发操作2
})
.notify(GCDQuene.mainQuene(), ^{
//并发1并发2都结束后调用
});

信号等待

1
2
3
4
5
6
7
8
9
10
GCDSemaphore* s = [GCDSemaphore semaphore:0];
s.run(^(GCDSemaphore *t) {
//网络请求
//
//执行完毕后调用
t.signal(); //这一句执行后线程才会越过wait
})
.wait(^{
//信号量通知以后执行
});

当前线程的信号等待

1
2
3
4
5
GCDQuene* q = [GCDQuene queneWithName:@"MySpecialQuene"];
q.semaphore(^(GCDSemaphore *t) {
t.signal(); //同上,没有执行signal之前,线程会wait在这里;
});