dispatch_queue_set_specific、disp
2018-12-17 本文已影响7人
海文_L
dispatch_queue_set_specific在文档中的解释是“使用此方法将自定义的上下文与队列关联,运行中的队列可用dispatch_get_specific检索。”
dispatch_queue_get_specific 是获取指定调度队列的上下文键/值数据。
dispatch_get_specific是获取当前调度队列的上下文键/值数据。
举个例说明下:
const void * queueKey = "queueKey";
const void * queueKey2 = "queueKey2";
dispatch_queue_t queue = dispatch_queue_create(queueKey, NULL);
dispatch_queue_t queue2 = dispatch_queue_create(queueKey2, NULL);
//调用此方法会触发queueFunction函数,留个疑问queueFunction是在什么时候触发?
dispatch_queue_set_specific(queue, queueKey, &queueKey, queueFunction);
dispatch_queue_set_specific(queue2, queueKey2, &queueKey2, NULL);
dispatch_sync(queue, ^{
go();
});
dispatch_sync(queue2, ^{
go();
});
if (dispatch_queue_get_specific(queue, queueKey)) {
NSLog(@"__run in queue");
}
//main queue中找不到queueKey,所以这段Log不会触发,使用dispatch_get_specific(queueKey)的原理也一样
if (dispatch_queue_get_specific(dispatch_get_main_queue(), queueKey)) {
NSLog(@"__run in main queue");
}
if (dispatch_get_specific(queueKey)) {
NSLog(@"__run in main queue");
}
void go() {
//使用dispatch_sync改变了当前的执行队列,所以这里可以检索到queueKey
if(dispatch_get_specific("queueKey")) {
NSLog(@"queue");
} else if(dispatch_get_specific("queueKey2")) {
NSLog(@"queue2");
} else {
NSLog(@"main queue");
}
}
void queueFunction() {
NSLog(@"__queueFunction");
}