發現一個很有意思的方法 dispatch_set_target_queue
他可以改變queue的優先級與目標queue相同
這段代碼是搬過來的
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL);dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);dispatch_set_target_queue(mySerialDispatchQueue, globalDispatchQueueBackground);下邊來看更有意思的,一般都是把一個任務放到一個串行的queue中,如果這個任務被拆分了,被放置到多個串行的queue中,但實際還是需要這個任務同步執行,那么就會有問題,因為多個串行queue之間是并行的。
那該如何是好呢?
這是就可以使用dispatch_set_target_queue了。
如果將多個串行的queue使用dispatch_set_target_queue指定到了同一目標,那么著多個串行queue在目標queue上就是同步執行的,不再是并行執行。
看代碼:
[objc] view plain copy +(void)testTargetQueue { dispatch_queue_t targetQueue = dispatch_queue_create("test.target.queue", DISPATCH_QUEUE_SERIAL); dispatch_queue_t queue1 = dispatch_queue_create("test.1", DISPATCH_QUEUE_SERIAL); dispatch_queue_t queue2 = dispatch_queue_create("test.2", DISPATCH_QUEUE_SERIAL); dispatch_queue_t queue3 = dispatch_queue_create("test.3", DISPATCH_QUEUE_SERIAL); dispatch_set_target_queue(queue1, targetQueue); dispatch_set_target_queue(queue2, targetQueue); dispatch_set_target_queue(queue3, targetQueue); dispatch_async(queue1, ^{ NSLog(@"1 in"); [NSThread sleepForTimeInterval:3.f]; NSLog(@"1 out"); }); dispatch_async(queue2, ^{ NSLog(@"2 in"); [NSThread sleepForTimeInterval:2.f]; NSLog(@"2 out"); }); dispatch_async(queue3, ^{ NSLog(@"3 in"); [NSThread sleepForTimeInterval:1.f]; NSLog(@"3 out"); }); } 猜想下:因為設置了target,按照上邊說的,應該是 1 in 1 out , 2 in 2 out , 3in 3 out猜不準怎么辦?不發表這篇博客
實際輸出:
[objc] view plain copy 2014-11-13 13:18:05.964 TUPIAN[2701:92951] 1 in 2014-11-13 13:18:08.965 TUPIAN[2701:92951] 1 out 2014-11-13 13:18:08.966 TUPIAN[2701:92951] 2 in 2014-11-13 13:18:10.967 TUPIAN[2701:92951] 2 out 2014-11-13 13:18:10.968 TUPIAN[2701:92951] 3 in 2014-11-13 13:18:11.969 TUPIAN[2701:92951] 3 out 總結:dispatch_set_target_queue可以設置queue的優先級,也可以使多個serial queue在目標queue上一次只有一個執行
新聞熱點
疑難解答