成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

移動開發 iOS
GCD為Grand Central Dispatch的縮寫。  Grand Central Dispatch (GCD)是Apple開發的一個多核編程的較新的解決方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。  GCD是一個替代諸如NSThread等技術的很高效和強大的技術。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的代碼:

 

  1. - (void)addTweetWithMsg:(NSString*)msg url:(NSURL*)url { 
  2.  
  3.   // 在主線程調用。 
  4.  
  5.   DTweet *tw = [[DTweet alloc] initWithMsg:msg]; 
  6.  
  7.   [tweets addTweet:tw display:YES]; 
  8.  
  9.   tw.img = [imageCache getImgFromURL:url];//bottle neck 
  10.  
  11.   [tweets updateTweet:tw display:YES]; 
  12.  
  13.   [tw release]; 
  14.  

有GCD的代碼:

 

 

  1. - (void)addTweetWithMsg:(NSString*)msg url:(NSURL*)url { 
  2. //在主線程調用。 
  3.  
  4.   DTweet *tw = [[DTweet alloc] initWithMsg:msg]; 
  5.  
  6.   [tweets addTweet:tw display:YES]; 
  7.  
  8.   dispatch_async(image_queue, ^{ 
  9.  
  10.     tw.img = [imageCache getImgFromURL:url];//放到一個異步隊列里。 
  11.  
  12.     dispatch_async(main_queue, ^{ 
  13.  
  14.       [tweets updateTweet:tw display:YES];//放到異步的主線程里。 
  15.  
  16.     }); 
  17.  
  18.   }); 
  19.  
  20.   [tw release]; 
  21.  
  22.  
  23.   
  24. 1. GCD is part of libSystem.dylib 
  25.  
  26. 2. #include <dispatch/dispatch.h> 

一》NSThread的方法:代碼如下:

 

  1. - (void)viewDidLoad 
  2.  
  3.  
  4.     [super viewDidLoad]; 
  5.  
  6. NSThread *thread1=[[NSThread alloc]initWithTarget:self selector:@selector(print1) object:nil]; 
  7.  
  8.     [thread1 start]; 
  9.  
  10.   
  11.  
  12.     NSThread *thread2=[[NSThread alloc]initWithTarget:self selector:@selector(print2) object:nil]; 
  13.  
  14.     [thread2 start]; 
  15.  
  16.   
  17.  
  18.  
  19. -(void)print1{ 
  20.  
  21.     for (int i=0; i<100; i++) { 
  22.  
  23.         NSLog(@"我是print1正在執行%d",i); 
  24.  
  25.     } 
  26.  
  27.  
  28. -(void)print2{ 
  29.  
  30.     for (int i=0; i<100; i++) { 
  31.  
  32.         NSLog(@"print2正在執行%d",i); 
  33.  
  34.     } 
  35.  
  36. 二》 
  37.  
  38. NSInvocationOperation 
  39. 的方法:代碼如下 
  40.   
  41.  
  42. //    NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print1) object:@"1"]; 
  43.  
  44. //    NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(print2) object:@"2"];//當然這里可以用一個方法。 
  45.  
  46. //    NSOperationQueue *queue=[[NSOperationQueue alloc]init]; 
  47.  
  48. //    [queue addOperation:operation1]; 
  49.  
  50. //    [queue addOperation:operation2]; 
  51.  

GCD的方法:代碼如下:

 

  1. dispatch_queue_t t1=dispatch_queue_create("1", NULL); 
  2.  
  3.    dispatch_queue_t t2=dispatch_queue_create("2", NULL); 
  4.  
  5.    dispatch_async(t1, ^{ 
  6.  
  7.        [self print1]; 
  8.  
  9.    }); 
  10.  
  11.    dispatch_async(t2, ^{ 
  12.  
  13.        [self print2]; 
  14.  
  15.    }); 

Push的原理:

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

上圖可以分為三個階段。

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

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

本文鏈接:http://www.cnblogs.com/lovewx/archive/2014/07/21/3853088.html

責任編輯:chenqingxiang 來源: cnblogs
相關推薦

2015-07-22 09:51:51

iOS開發線程

2015-07-22 09:39:38

IOS多線程同步

2018-04-11 10:51:25

多線程進程主線程

2011-01-19 15:51:41

PHPjavaweb

2009-01-20 09:12:16

PHPJava數據庫

2024-03-14 06:51:22

GenAI人工智能

2010-07-30 13:06:22

NFS端口

2011-08-18 17:07:23

IOS開發多線程NSInvocatio

2009-08-20 18:11:08

C#異步委托

2011-07-11 10:43:48

2011-07-12 10:15:05

2010-07-07 18:00:43

SNMP協議

2013-03-27 10:32:53

iOS多線程原理runloop介紹GCD

2012-05-14 17:09:05

iOS

2015-07-06 09:46:21

AeroGearAndroid推送

2011-04-25 17:27:38

投影儀

2024-04-24 15:08:17

2011-08-02 10:26:59

iOS 多線程 線程

2013-07-15 15:23:03

iOS多線程GCD

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲综合资源 | 青春草91| 日韩一级电影免费观看 | 亚洲精品一区中文字幕乱码 | 日韩另类 | 欧美一区二区三区在线观看 | 久久精品99 | 日本午夜视频 | 国产污视频在线 | 中文字幕 在线观看 | 欧美一区二区三区在线看 | 国产一区二区免费在线 | 国产精品片aa在线观看 | 国产精品久久久久久久久免费软件 | 国产精品久久久久久久久久久久久久 | 国产色视频网站 | 请别相信他免费喜剧电影在线观看 | 91精品久久久久久久久久入口 | 中文字幕免费视频 | 日韩电影在线 | 亚洲一区二区三区四区五区午夜 | 中文字幕亚洲欧美 | 亚洲欧洲综合av | a久久| 在线免费观看一区二区 | 在线播放日韩 | 一级欧美黄色片 | 日本精品一区二区三区在线观看视频 | 蜜桃视频成人 | www四虎com| 网站国产| 国产精品一区二区在线 | 偷拍自拍网址 | 国产精品久久久久久久三级 | 国产一级片免费看 | 欧美日韩中文字幕在线 | 91在线免费视频 | 成人av片在线观看 | 精品久久久久久久久久久久久久 | 视频在线观看亚洲 | 91精品国产一区二区三区 |