日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

iOS中GCD在多線程方面的理解

系統(tǒng) 2615 0

GCD為Grand Central Dispatch的縮寫。  Grand Central Dispatch (GCD)是Apple開發(fā)的一個多核編程的較新的解決方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。  GCD是一個替代諸如NSThread等技術(shù)的很高效和強大的技術(shù)。GCD完全可以處理諸如數(shù)據(jù)鎖定和資源泄漏等復(fù)雜的異步編程問題。 

 GCD可以完成很多事情,但是這里僅關(guān)注在iOS應(yīng)用中實現(xiàn)多線程所需的一些基礎(chǔ)知識。  在開始之前,需要理解是要提供給GCD隊列的是代碼塊,用于在系統(tǒng)或者用戶創(chuàng)建的的隊列上調(diào)度運行。   聲明一個隊列   

如下會返回一個用戶創(chuàng)建的隊列:

  dispatch_queue_t myQueue = dispatch_queue_create("com.iphonedevblog.post", NULL);其中,第一個參數(shù)是標識隊列的,第二個參數(shù)是用來定義隊列的參數(shù)(目前不支持,因此傳入NULL)。 

執(zhí)行一個隊列  

如下會異步執(zhí)行傳入的代碼: 

 dispatch_async(myQueue, ^{ [self doSomething]; });其中,首先傳入之前創(chuàng)建的隊列,然后提供由隊列運行的代碼塊。  

聲明并執(zhí)行一個隊列   

如果不需要保留要運行的隊列的引用,可以通過如下代碼實現(xiàn)之前的功能:  dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{ [self doSomething]; }); 如果需要暫停一個隊列,可以調(diào)用如下代碼。暫停一個隊列會阻止和該隊列相關(guān)的所有代碼運行。  dispatch_suspend(myQueue); 暫停一個隊列?

如果暫停一個隊列不要忘記恢復(fù)。暫停和恢復(fù)的操作和內(nèi)存管理中的retain和release類似。調(diào)用dispatch_suspend會增加暫停計數(shù),而dispatch_resume則會減少。隊列只有在暫停計數(shù)變成零的情況下才開始運行。dispatch_resume(myQueue); 恢復(fù)一個隊列   從隊列中在主線程運行代碼    有些操作無法在異步隊列運行,因此必須在主線程(每個應(yīng)用都有一個)上運行。UI繪圖以及任何對NSNotificationCenter的調(diào)用必須在主線程長進行。在另一個隊列中訪問主線程并運行代碼的示例如下:  dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });注意,dispatch_suspend (以及dispatch_resume)在主線程上不起作用。

使用GCD,可以讓你的程序不會失去響應(yīng). 多線程不容易使用,用了GCD,會讓它變得簡單。你無需專門進行線程管理, 很棒!

讓你的程序保持響應(yīng)的原則:

1. 不要柱塞主線程

2. 把工作一到其他線程中做。

3. 做完后更新主線程的UI.

舉例說明:

沒有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];//放到一個異步隊列里。

????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 正在執(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"];// 當然這里可以用一個方法。

//? ? 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 ];

? ? });







http://www.cnblogs.com/pengyingh/articles/2356825.html
http://www.cnblogs.com/vinceoniphone/archive/2011/04/07/2007968.html //詳解地址。
http://blog.csdn.net/zhuqilin0/article/details/6527113 ? ?//消息推送機制

Push的原理:

Push 的工作機制可以簡單的概括為下圖

圖中,Provider是指某個iPhone軟件的Push服務(wù)器,這篇文章我將使用.net作為Provider。?
APNS 是Apple Push Notification Service(Apple Push服務(wù)器)的縮寫,是蘋果的服務(wù)器。

上圖可以分為三個階段。

第一階段:.net應(yīng)用程序把要發(fā)送的消息、目的iPhone的標識打包,發(fā)給APNS。?
第二階段:APNS在自身的已注冊Push服務(wù)的iPhone列表中,查找有相應(yīng)標識的iPhone,并把消息發(fā)到iPhone。?
第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序, 并且按照設(shè)定彈出Push通知。

http://blog.csdn.net/zhuqilin0/article/details/6527113 ? ?//消息推送機制
看內(nèi)存泄露時候:在搜索中搜索run 找到Run Static Snalyzer .

iOS中GCD在多線程方面的理解


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 油尖旺区| 安宁市| 丰都县| 修水县| 秭归县| 渝中区| 遂平县| 大冶市| 临江市| 繁昌县| 洞头县| 阿巴嘎旗| 曲沃县| 广元市| 鄂温| 宜良县| 汾阳市| 罗定市| 茶陵县| 钦州市| 高碑店市| 新蔡县| 临夏县| 高青县| 麻栗坡县| 太湖县| 淅川县| 巴塘县| 印江| 屏边| 平昌县| 玉屏| 邢台县| 文安县| 温宿县| 洛宁县| 乌兰察布市| 安丘市| 延边| 潍坊市| 元氏县|