gcd学习
補課GrandCentralDispatch
好吧,我看完51CTO的一篇文章,我徹底懂了.這貨,就是為了解決NSThread解決不了的問題的;
是啊,多線程,就是多倍任務;經典的案例就是,UI不卡死,后臺處理網絡數據;
而用Queue來任務排隊處理,經典的應用就是,請求有各種各樣的類別,A類請求在A queue里排隊; B類請求在B queue排隊;這里A, B不一定是網絡與本地的區分,更重要的是事務的區分,有人為的概念在其中;
dispatch_queue_t 真沒啥可怕的,就當做ASIHttpRequestQueue一樣,創建一個隊列,然后你所有的操作,都是圍繞這個隊列里;
你可以添加任務,終止任務,執行任務;
連執行任務函數都非常類似
startSynchronous
dispatch_async
dispatch_sync
下面我抄襲一下
聲明一個隊列
如下會返回一個用戶創建的隊列:
dispatch_queue_t myQueue =dispatch_queue_create("com.iphonedevblog.post", NULL);
其中,第一個參數是標識隊列的,第二個參數是用來定義隊列的參數(目前不支持,因此傳入NULL)。
執行一個隊列
如下會異步執行傳入的代碼:
dispatch_async(myQueue, ^{ [selfdoSomething]; });
其中,首先傳入之前創建的隊列,然后提供由隊列運行的代碼塊。
聲明并執行一個隊列
如果不需要保留要運行的隊列的引用,可以通過如下代碼實現之前的功能:
dispatch_async(dispatch_queue_create("com.iphonedevblog.post", NULL), ^{ [self doSomething]; });
暫停一個隊列
如果需要暫停一個隊列,可以調用如下代碼。暫停一個隊列會阻止和該隊列相關的所有代碼運行。
dispatch_suspend(myQueue);
恢復一個隊列
如果暫停一個隊列不要忘記恢復。暫停和恢復的操作和內存管理中的retain和release類似。調用dispatch_suspend會增加暫停計數,而dispatch_resume則會減少。隊列只有在暫停計數變成零的情況下才開始運行。dispatch_resume(myQueue);
從隊列中在主線程運行代碼
有些操作無法在異步隊列運行,因此必須在主線程(每個應用都有一個)上運行。UI繪圖以及任何對NSNotificationCenter的調用必須在主線程長進行。在另一個隊列中訪問主線程并運行代碼的示例如下:
dispatch_sync(dispatch_get_main_queue(), ^{[self dismissLoginWindow]; });
dispatch_get_global_queue
dispatch_get_main_queue
dispatch_get_current_queue
誰能告訴我以上3個queue的區別?
轉載于:https://blog.51cto.com/derkin2jessie/1192300
總結
- 上一篇: JS高效关键字搜索---转
- 下一篇: 【转载】进程间的通信之剪贴板方法实现源码