iOS開發中GCD在多執行緒方面的理解
GCD為Grand Central Dispatch的縮寫。Grand Central Dispatch (GCD)是Apple開發的一個多核程式設計的較新的解決方法。在Mac OS X 10.6雪豹中首次推出,並在最近引入到了iOS4.0。GCD是一個替代諸如NSThread等技術的很高效和強大的技術。GCD完全可以處理諸如 資料鎖定和資源洩漏等複雜的非同步程式設計問題。
GCD可以完成很多事情,但是這裡僅關注在iOS應用中實現多執行緒所需的一些基礎知識。在開始之前,需要理解是要提供給GCD佇列的是程式碼塊,用於在系統或者使用者建立的的佇列上排程執行。
宣告一個佇列
如下會返回一個使用者建立的佇列:dispatch_queue_t myQueue = dispatch_queue_create(“com.iphonedevblog.post”, NULL);其中,第一個引數是標識佇列的,第二個引數是用來定義佇列的引數(目前不支援,因此傳入NULL)。
執行一個佇列
如下會非同步執行傳入的程式碼:
dispatch_async(myQueue, ^{ [self doSomething]; });其中,首先傳入之前建立的佇列,然後提供由佇列執行的程式碼塊。
宣告並執行一個佇列
如果不需要保留要執行的佇列的引用,可以通過如下程式碼實現之前的功能: 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_suspend (以及dispatch_resume)在主執行緒上不起作用。
使用GCD,可以讓你的程式不會失去響應. 多執行緒不容易使用,用了GCD,會讓它變得簡單。你無需專門進行執行緒管理, 很棒!
讓你的程式保持響應的原則:
1. 不要柱塞主執行緒
2. 把工作一到其他執行緒中做。
3. 做完後更新主執行緒的UI.
舉例說明:
沒有GCD的程式碼:
- (void)addTweetWithMsg:(NSString*)msg url:(NSURL*)url { // 在主執行緒呼叫。 DTweet *tw = [[DTweet alloc] initWithMsg:msg]; [tweets addTweet:tw display:YES]; tw.img = [imageCache getImgFromURL:url];//bottle neck [tweets updateTweet:tw display:YES]; [tw release]; }
有GCD的程式碼:
- (void)addTweetWithMsg:(NSString*)msg url:(NSURL*)url { //在主執行緒呼叫。 DTweet *tw = [[DTweet alloc] initWithMsg:msg]; [tweets addTweet:tw display:YES]; dispatch_async(image_queue, ^{ tw.img = [imageCache getImgFromURL:url];//放到一個非同步佇列裡。 dispatch_async(main_queue, ^{ [tweets updateTweet:tw display:YES];//放到非同步的主執行緒裡。 }); }); [tw release]; } 1. GCD is part of libSystem.dylib 2. #include <dispatch/dispatch.h>
NSThread的方法:程式碼如下:
- (void)viewDidLoad { [super viewDidLoad]; NSThread *thread1=[[NSThread alloc]initWithTarget:self selector:@selector(print1) object:nil]; [thread1 start]; NSThread *thread2=[[NSThread alloc]initWithTarget:self selector:@selector(print2) object:nil]; [thread2 start]; } -(void)print1{ for (int i=0; i<100; i++) { NSLog(@"我是print1正在執行%d",i); } } -(void)print2{ for (int i=0; i<100; i++) { NSLog(@"print2正在執行%d",i); } }
NSInvocationOperation 的方法:程式碼如下
// NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print1) object:@"1"]; // NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print2) object:@"2"];//當然這裡可以用一個方法。 // NSOperationQueue *queue=[[NSOperationQueue alloc]init]; // [queue addOperation:operation1]; // [queue addOperation:operation2];
GCD的方法:程式碼如下:
dispatch_queue_t t1=dispatch_queue_create("1", NULL); dispatch_queue_t t2=dispatch_queue_create("2", NULL); dispatch_async(t1, ^{ [self print1]; }); dispatch_async(t2, ^{ [self print2]; });
Push的原理:
圖中,Provider是指某個iPhone軟體的Push伺服器,這篇文章我將使用.net作為Provider。 APNS 是Apple Push Notification Service(Apple Push伺服器)的縮寫,是蘋果的伺服器。
上圖可以分為三個階段。
第一階段:.net應用程式把要傳送的訊息、目的iPhone的標識打包,發給APNS。 第二階段:APNS在自身的已註冊Push服務的iPhone列表中,查詢有相應標識的iPhone,並把訊息發到iPhone。 第三階段:iPhone把發來的訊息傳遞給相應的應用程式, 並且按照設定彈出Push通知。
- GCD1.zip (23.1 KB)
相關文章
- iOS多執行緒開發—GCD (一)iOS執行緒GC
- iOS中多執行緒之GCD應用iOS執行緒GC
- iOS多執行緒GCD篇iOS執行緒GC
- IOS多執行緒之(GCD)iOS執行緒GC
- iOS 多執行緒之GCDiOS執行緒GC
- iOS多執行緒:GCD詳解iOS執行緒GC
- iOS 開發中的多執行緒iOS執行緒
- iOS多執行緒之GCD詳解iOS執行緒GC
- 多執行緒-多執行緒方式3的求和案例執行緒
- iOS 多執行緒:『GCD』詳盡總結iOS執行緒GC
- iOS多執行緒:『GCD』詳盡總結iOS執行緒GC
- 多執行緒——GCD執行緒GC
- iOS 多執行緒--GCD 序列佇列、併發佇列以及同步執行、非同步執行iOS執行緒GC佇列非同步
- 玩轉iOS開發:iOS中的GCD開發(一)iOSGC
- 玩轉iOS開發:iOS中的GCD開發(三)iOSGC
- 玩轉iOS開發:iOS中的GCD開發(二)iOSGC
- iOS開發之多執行緒技術(NSThread、OperationQueue、GCD)iOS執行緒threadGC
- 【iOS開發】多執行緒 - 概述iOS執行緒
- 多執行緒-多執行緒方式1的程式碼實現執行緒
- OC 多執行緒GCD執行緒GC
- iOS多執行緒(Pthread、NSThread、GCD、NSOperation)iOS執行緒threadGC
- iOS開發多執行緒篇-概述iOS執行緒
- iOS開發之GCDiOSGC
- 多執行緒-多執行緒方式2的思路及程式碼實現執行緒
- ios多執行緒程式設計(NSThread)(NSOperation )(GCD)iOS執行緒程式設計threadGC
- 多執行緒安全-iOS開發注意咯!執行緒iOS
- 多執行緒安全-iOS開發注意咯!!!執行緒iOS
- iOS開發-多執行緒程式設計iOS執行緒程式設計
- iOS大中分術歌-神奇的多執行緒GCD技術iOS執行緒GC
- iOS多執行緒程式設計——GCD與NSOperation總結iOS執行緒程式設計GC
- GCD 多執行緒安全 單寫多讀GC執行緒
- iOS底層原理 多執行緒之GCD 看我就夠了 --(10)iOS執行緒GC
- iOS多執行緒之GCD、OperationQueue 對比和實踐記錄iOS執行緒GC
- ios-UI高階多執行緒 GCD實現單例模式iOSUI執行緒GC單例模式
- 理解 python 中多執行緒Python執行緒
- GCD 與多執行緒程式設計GC執行緒程式設計
- 多執行緒(pthread,NSThread,GCD)執行緒threadGC
- Java 終止執行緒方法Java執行緒