ios怎麼判斷在哪個隊列?GCD有兩個用來執行任務的函數,queue是隊列的意思,block中寫我們要執行的任務,接下來我們就來聊聊關于ios怎麼判斷在哪個隊列?以下内容大家不妨參考一二希望能幫到您!
GCD有兩個用來執行任務的函數,queue是隊列的意思,block中寫我們要執行的任務
一種是同步的方式去執行任務
[objc] view plain copy
dispatch_sync(dispatch_queue_t _Nonnull queue, ^{
});
一種是異步的方式去執行任務
[objc] view plain copy
dispatch_async(dispatch_queue_t _Nonnull queue, ^{
});
GCD中的隊列可以分為兩大類,一個是并發隊列,一個是串行隊列
并發隊列(Concurrent Dispatch Queue)
可以讓多個任務并發的執行,會自動的開啟多個線程去”同時“執行任務
并發功能隻有在異步(dispatch_async)函數下才有效
串行隊列(Serial Dispatch Queue)
讓任務一個接着一個地執行就是一個任務執行完畢後,再執行下一個任務。、
總結一下
同步和異步決定了要不要開啟新的線程
同步:在當前線程中執行任務,不具備開啟新線程的能力
//串行隊列,同步執行,不會開啟新線程,任務是按順序來執行的
dispatch_queue_t queue=dispatch_queue_create("hh", DISPATCH_QUEUE_SERIAL);
for(int i=0;i<10;i )
{
dispatch_sync(queue, ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
串行隊列異步執行
[objc] view plain copy
//串行隊列,異步執行 會開啟一個新線程,任務是有序執行的
dispatch_queue_t queue=dispatch_queue_create("hh", DISPATCH_QUEUE_SERIAL);
for(int i=0;i<10;i )
{
dispatch_async(queue, ^{
NSLog(@"hello %d %@",i,[NSThread currentThread]);
});
}
并行隊列同步執行
[objc] view plain copy
//并行隊列 同步執行 是和串行隊列同步執行效果是一樣的,不開線程,順序執行
dispatch_queue_t queue= dispatch_queue_create("hh", DISPATCH_QUEUE_CONCURRENT);
for(int i=0;i<10;i )
{
dispatch_sync(queue, ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
});
}
并行隊列異步執行
[objc] view plain copy
//并行隊列 異步執行 開啟多個線程 無序的去執行
dispatch_queue_t queue= dispatch_queue_create("hl", DISPATCH_QUEUE_CONCURRENT);
for(int i=0;i<10;i )
{
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
主隊列的異步執行
[objc] view plain copy
//主隊列 異步執行 就是主線程 順序的去執行
//主隊列的特點就是先執行主線程上的代碼,等執行完畢之後,再去執行主隊列中的任務
//主隊列又叫全局串行隊列
for(int i=0;i<10;i )
{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
});
}
主隊列同步執行
[objc] view plain copy
//主隊列 同步執行 同步執行會等着第一個任務執行完成,才會繼續往後執行,主隊列 同步執行在主線程上執行的話會死鎖
//這裡會産生一個死鎖的情況,主線程正在執行代碼等待你同步執行,執行完,而你同步執行在等待你主線程去把第一個任務執行完,再執行下一個任務,相互等待。
for(int i=0;i<10;i )
{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
});
}
解決死鎖
[objc] view plain copy
//解決死鎖,這裡是這樣的,我們添加任務,同步執行的操作在子線程上完成,然後任務在主線程上去完成,這樣主線程就不需要等你同步執行執行完畢,這樣就可以避免相互
等待的情況了。也就是說執行dispatch_sync也就是添加任務是在子線程上執行的
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"%@",[NSThread currentThread]);
for(int i=0;i<10;i )
{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%d %@",i,[NSThread currentThread]);
});
}
});
全局隊列本質就是并發隊列,全局隊列是一直在的,第一個參數就是隊列的優先級的概念,如果寫0就表示是default,并發隊列有名稱,可以跟蹤錯誤,全局隊列沒有名稱
[objc] view plain copy
dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)
有一個需要注意的就是如果我們創建了個并發隊列,先放一個同步任務到隊列中再放兩個異步任務到隊列中的話,那麼就會如果隊列先去調度同步任務然後是要等同步任務執行完成之後才會執行下面的異步任務。代碼如下所示,會先把所有的kkkk輸出完,然後在執行下面的異步任務。
[objc] view plain copy
dispatch_queue_t queue = dispatch_queue_create("哈哈哈",DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
for(int i=0;i<100;i )
{
NSLog(@"kkkkk");
}
});
dispatch_async(queue, ^{
NSLog(@"dandjan");
});
dispatch_async(queue, ^{
NSLog(@"dadasw");
});
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!