GCD為Grand Central Dispatch的縮寫。 Grand Central Dispatch (GCD)是Apple開發(fā)的一個(gè)多核編程的較新的解決方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。 GCD是一個(gè)替代諸如NSThread等技術(shù)的很高效和強(qiáng)大的技術(shù)。GCD完全可以處理諸如數(shù)據(jù)鎖定和資源泄漏等復(fù)雜的異步編程問題。
GCD可以完成很多事情,但是這里僅關(guān)注在iOS應(yīng)用中實(shí)現(xiàn)多線程所需的一些基礎(chǔ)知識(shí)。 在開始之前,需要理解是要提供給GCD隊(duì)列的是代碼塊,用于在系統(tǒng)或者用戶創(chuàng)建的的隊(duì)列上調(diào)度運(yùn)行。 聲明一個(gè)隊(duì)列
如下會(huì)返回一個(gè)用戶創(chuàng)建的隊(duì)列:
dispatch_queue_t myQueue = dispatch_queue_create("com.iphonedevblog.post", NULL);其中,第一個(gè)參數(shù)是標(biāo)識(shí)隊(duì)列的,第二個(gè)參數(shù)是用來(lái)定義隊(duì)列的參數(shù)(目前不支持,因此傳入NULL)。
執(zhí)行一個(gè)隊(duì)列
如下會(huì)異步執(zhí)行傳入的代碼:
dispatch_async(myQueue, ^{ [self doSomething]; });其中,首先傳入之前創(chuàng)建的隊(duì)列,然后提供由隊(duì)列運(yùn)行的代碼塊。
聲明并執(zhí)行一個(gè)隊(duì)列
如果不需要保留要運(yùn)行的隊(duì)列的引用,可以通過如下代碼實(shí)現(xiàn)之前的功能: dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{ [self doSomething]; }); 如果需要暫停一個(gè)隊(duì)列,可以調(diào)用如下代碼。暫停一個(gè)隊(duì)列會(huì)阻止和該隊(duì)列相關(guān)的所有代碼運(yùn)行。 dispatch_suspend(myQueue); 暫停一個(gè)隊(duì)列?
如果暫停一個(gè)隊(duì)列不要忘記恢復(fù)。暫停和恢復(fù)的操作和內(nèi)存管理中的retain和release類似。調(diào)用dispatch_suspend會(huì)增加暫停計(jì)數(shù),而dispatch_resume則會(huì)減少。隊(duì)列只有在暫停計(jì)數(shù)變成零的情況下才開始運(yùn)行。dispatch_resume(myQueue); 恢復(fù)一個(gè)隊(duì)列 從隊(duì)列中在主線程運(yùn)行代碼 有些操作無(wú)法在異步隊(duì)列運(yùn)行,因此必須在主線程(每個(gè)應(yīng)用都有一個(gè))上運(yùn)行。UI繪圖以及任何對(duì)NSNotificationCenter的調(diào)用必須在主線程長(zhǎng)進(jìn)行。在另一個(gè)隊(duì)列中訪問主線程并運(yùn)行代碼的示例如下: dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });注意,dispatch_suspend (以及dispatch_resume)在主線程上不起作用。
使用GCD,可以讓你的程序不會(huì)失去響應(yīng). 多線程不容易使用,用了GCD,會(huì)讓它變得簡(jiǎn)單。你無(wú)需專門進(jìn)行線程管理, 很棒!
讓你的程序保持響應(yīng)的原則:
1. 不要柱塞主線程
2. 把工作一到其他線程中做。
3. 做完后更新主線程的UI.
舉例說(shuō)明:
沒有GCD的代碼:
- (void)addTweetWithMsg:(NSString*)msg url:(NSURL*)url {
??// 在主線程調(diào)用。
??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 {
//在主線程調(diào)用。??DTweet *tw = [[DTweet alloc] initWithMsg:msg];
??[tweets addTweet:tw display:YES];
??dispatch_async(image_queue, ^{
????tw.img = [imageCache getImgFromURL:url];//放到一個(gè)異步隊(duì)列里。
????dispatch_async(main_queue, ^{
??????[tweets updateTweet:tw display:YES];//放到異步的主線程里。
????});
??});
??[tw release];
}
?
2. #include <dispatch/dispatch.h>
- ( 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 正在執(zhí)行 %d" ,i);
? ? }
}
-( void )print2{
? ? for ( int i= 0 ; i< 100 ; i++) {
? ? ? ? NSLog ( @"print2 正在執(zhí)行 %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"];// 當(dāng)然這里可以用一個(gè)方法。
//? ? 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的原理:
Push 的工作機(jī)制可以簡(jiǎn)單的概括為下圖
圖中,Provider是指某個(gè)iPhone軟件的Push服務(wù)器,這篇文章我將使用.net作為Provider。?
APNS 是Apple Push Notification Service(Apple Push服務(wù)器)的縮寫,是蘋果的服務(wù)器。
上圖可以分為三個(gè)階段。
第一階段:.net應(yīng)用程序把要發(fā)送的消息、目的iPhone的標(biāo)識(shí)打包,發(fā)給APNS。?
第二階段:APNS在自身的已注冊(cè)Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識(shí)的iPhone,并把消息發(fā)到iPhone。?
第三階段:iPhone把發(fā)來(lái)的消息傳遞給相應(yīng)的應(yīng)用程序, 并且按照設(shè)定彈出Push通知。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
