OC 中非同步順序載入用法
實際開發過程中,有可能會用到順序載入非同步的需求,比如先掉A介面,直到A介面呼叫完成,在呼叫B介面,以此類推C介面...
當然一兩個介面這樣寫沒問題,如果這樣的介面多了,或者其他情況就不多說了。
解決辦法:dispatch_semaphore
dispatch_semaphore是GCD用來同步的一種方式,與他相關的共有三個函式,分別是dispatch_semaphore_create,dispatch_semaphore_signal,dispatch_semaphore_wait。
例項:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);dispatch_async(dispatch_get_global_queue(0, 0), ^{
[self logWithBlock:^(NSString *name) {
NSLog(@"1%@",name);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
dispatch_semaphore_signal(semaphore);
});
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self logWithBlock:^(NSString *name) {
NSLog(@"2%@",name);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
dispatch_semaphore_signal(semaphore);
});
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self logWithBlock:^(NSString *name) {
NSLog(@"3%@",name);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
dispatch_semaphore_signal(semaphore);
});
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self logWithBlock:^(NSString *name) {
NSLog(@"4%@",name);
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"完畢");
});
輸出
解釋:
(1)dispatch_semaphore_create的宣告為:
dispatch_semaphore_t dispatch_semaphore_create(long value);
傳入的引數為long,輸出一個dispatch_semaphore_t型別且值為value的訊號量。
值得注意的是,這裡的傳入的引數value必須大於或等於0,否則dispatch_semaphore_create會返回NULL。
(關於訊號量,我就不在這裡累述了,網上很多介紹這個的。我們這裡主要講一下dispatch_semaphore這三個函式的用法)。
(2)dispatch_semaphore_signal的宣告為:
long dispatch_semaphore_signal(dispatch_semaphore_t dsema)
這個函式會使傳入的訊號量dsema的值加1;(至於返回值,待會兒再講)
(3) dispatch_semaphore_wait的宣告為:
long dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
這個函式會使傳入的訊號量dsema的值減1;
這個函式的作用是這樣的,如果dsema訊號量的值大於0,該函式所處執行緒就繼續執行下面的語句,並且將訊號量的值減1;
如果desema的值為0,那麼這個函式就阻塞當前執行緒等待timeout(注意timeout的型別為dispatch_time_t,
不能直接傳入整形或float型數),如果等待的期間desema的值被dispatch_semaphore_signal函式加1了,
且該函式(即dispatch_semaphore_wait)所處執行緒獲得了訊號量,那麼就繼續向下執行並將訊號量減1。
如果等待期間沒有獲取到訊號量或者訊號量的值一直為0,那麼等到timeout時,其所處執行緒自動執行其後語句。
相關文章
- javascript載入順序JavaScript
- 類script標籤,非同步載入,順序執行非同步
- java類載入順序Java
- [Web]HTML載入順序WebHTML
- Java父子類載入順序Java
- 頁面載入順序jQueryjQuery
- windows驅動載入順序Windows
- 影像延遲載入 && 列表圖順序載入
- SpringBoot配置檔案優先順序載入順序Spring Boot
- Python 模組的載入順序Python
- js——<script>標籤的載入順序JS
- web.xml 檔案 配置載入順序WebXML
- [springboot]配置檔案載入順序Spring Boot
- Spring如何控制Bean的載入順序SpringBean
- vue中非同步函式async和await的用法Vue非同步函式AI
- 使用者登入時的環境載入順序
- Script載入順序 & 外部樣式表的阻塞
- 關於jvm載入類的實現順序JVM
- ListView 之非同步載入圖片亂序View非同步
- 簡單的演算法-解決頁面指令碼非同步載入順序問題演算法指令碼非同步
- UITableView停止載入中的動畫的順序問題UIView動畫
- 詳解web.xml中元素的載入順序WebXML
- Javascript在頁面載入時的執行順序JavaScript
- 同步任務與非同步任務執行順序非同步
- JVM類載入機制與類初始化順序JVM
- iOS,UIViewController和nib方法的載入順序iOSUIViewController
- Tomcat的class載入的優先順序一覽Tomcat
- 載入資料順序對HASH SORT CLUSTER效能影響
- js中非同步處理JS非同步
- Python中非同步模式Python非同步模式
- tomcat啟動或,struts2需要載入哪些配置檔案,載入順序Tomcat
- Node中非同步和同步的實現非同步
- 按照順序動態載入js檔案簡單介紹JS
- 效能優化之html、css、js三者的載入順序優化HTMLCSSJS
- java 啟動檢視jar包載入順序並設定classpathJavaJAR
- web.xml 中的listener、 filter、servlet 載入順序及其詳解WebXMLFilterServlet
- 演算法題———————輸入棧的入棧順序和出棧順序判斷是否合理演算法
- promise、async、await非同步原理與執行順序PromiseAI非同步