成人免费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:39:38

IOS多線程同步

2015-07-22 09:51:51

iOS開發線程

2009-01-20 09:12:16

PHPJava數據庫

2024-03-14 06:51:22

GenAI人工智能

2011-01-19 15:51:41

PHPjavaweb

2018-04-11 10:51:25

多線程進程主線程

2010-07-30 13:06:22

NFS端口

2011-08-18 17:07:23

IOS開發多線程NSInvocatio

2011-07-11 10:43:48

2011-07-12 10:15:05

2010-07-07 18:00:43

SNMP協議

2009-08-20 18:11:08

C#異步委托

2015-07-06 09:46:21

AeroGearAndroid推送

2011-04-25 17:27:38

投影儀

2024-04-24 15:08:17

2013-03-27 10:32:53

iOS多線程原理runloop介紹GCD

2012-05-14 17:09:05

iOS

2013-07-16 10:12:14

iOS多線程多線程概念多線程入門

2016-04-12 09:48:24

nsthread多線程ios

2013-07-15 15:23:03

iOS多線程GCD
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产欧美在线 | 99久久99热这里只有精品 | 天天干狠狠 | 超碰人人人| 亚洲精品成人 | 九九热这里只有精品6 | 激情欧美日韩一区二区 | 天天综合久久 | 成人精品一区二区 | 亚洲一二三区精品 | 成人福利在线 | 亚洲www啪成人一区二区麻豆 | 欧美一区二区三区高清视频 | 欧美亚洲国产日韩 | 久久一区二 | 一区视频 | 第一区在线观看免费国语入口 | 人人澡人人射 | 国产最新精品视频 | 日韩午夜影院 | 欧美一区二区三区在线 | 国产高清精品一区二区三区 | 综合久久网 | 亚洲成人免费 | 91精品国产综合久久久久久丝袜 | 亚洲天堂男人的天堂 | 久久久国 | 国产精品久久久久久久模特 | 国产一区二区在线播放 | 97久久精品午夜一区二区 | 日韩av在线播 | 国产精品久久久久久久久久免费看 | 午夜视频一区二区三区 | 夜夜操av| 精品三级在线观看 | 亚洲一区二区av在线 | 国产婷婷精品av在线 | 91一区| 伊人色综合久久久天天蜜桃 | 99精品久久久久久久 | 久久久久久久综合色一本 |