91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GCD(低級隊列)-多線程

發布時間:2020-06-28 18:43:15 來源:網絡 閱讀:424 作者:sanminx 欄目:開發技術

 

GCD (Grand Central Dispatch) 

 

  GCD: 將應用程序需要執行的工作拆分為可分散在多個線程和多個CPU 上更小的塊

demo 效果圖:

GCD(低級隊列)-多線程

1—— .h 文件

  1.  #import <UIKit/UIKit.h> 
  2. @interface ViewController : UIViewController 
  3. - (IBAction)doWork:(id)sender; 
  4. @property (retain, nonatomic) IBOutlet UIButton *StartBtn; 
  5. @property (retain, nonatomic) IBOutlet UITextView *resultTextView; 
  6. @property (retain, nonatomic) IBOutlet UIActivityIndicatorView *spinner; 
  7.  
  8. @end 

 2— .m 文件

 

  1. #import "ViewController.h" 
  2.  
  3. @implementation ViewController 
  4. @synthesize StartBtn; 
  5. @synthesize resultTextView; 
  6. @synthesize spinner; 
  7.  
  8.  
  9. - (NSString *)fetchSomethingFromServer 
  10.     //將應用程序鎖定  1 秒  
  11.     [NSThread sleepForTimeInterval:1]; 
  12.     return @"hi there"; 
  13.  
  14. - (NSString *)processData:(NSString *)data 
  15.     [NSThread sleepForTimeInterval:2]; 
  16.     return [data uppercaseString]; 
  17.  
  18. - (NSString *)calculateFirstResult:(NSString *)data 
  19.     [NSThread sleepForTimeInterval:3]; 
  20.     return [NSString stringWithFormat:@"number of chars :%d",[data length]]; 
  21.      
  22.  
  23. - (NSString *)calculateSecondResult:(NSString *)data 
  24.     [NSThread sleepForTimeInterval:4]; 
  25.     return [data stringByReplacingOccurrencesOfString:@"E" withString:@"e"]; 
  26.  
  27.  
  28.  
  29. - (IBAction)doWork:(id)sender{ 
  30.      
  31.     StartBtn.enabled = NO
  32.     StartBtn.alpha = 0.5; 
  33.     [spinner startAnimating]; 
  34.      
  35.     NSDate *startTime = [NSDate date]; 
  36.     // dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags) 
  37.     // dispatch_get_global_queue() 抓取一個已經存在并且始終可用的全局隊列 該函數接收倆個參數:
  38. //  1_用于指定優先級(傳入0表示使用默認的優先級) ,2_目前未使用并且始終為0() 
  39.      
  40.     dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
  41.         NSString *fetchedData = [self fetchSomethingFromServer]; 
  42.         NSString *processedData = [self processData:fetchedData]; 
  43. //        NSString *firstResult = [self calculateFirstResult:processedData]; 
  44. //        NSString *secondResult = [self calculateSecondResult:processedData]; 
  45.        
  46.         //calculateFirstResult && calculateSecondResult 不需要順序執行 ,并發的執行他們可以更顯著的提高速度。 
  47.         // GCD 提供一種途徑來完成此任務,使用所謂的“分派組”,將一個組上 的 上下文中通過 dispatch_group_async() 函數異步分派的所有程序塊設置為松散的,以盡可能快的執行,如果可能,將它們分發給多個線程來執行。 
  48.         // 也可以使用dispathch_group_notify() 指定一個 額外的程序塊,該程序塊將在組中的所有程序塊即將運行完成時執行。 
  49.         __block NSString *firstResult; 
  50.         __block NSString *secondResult; 
  51.         dispatch_group_t group = dispatch_group_create(); 
  52.         dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ 
  53.             firstResult = [[self calculateFirstResult:processedData]retain]; 
  54.         }); 
  55.          
  56.         dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ 
  57.             secondResult = [[self calculateSecondResult:processedData]retain]; 
  58.         }); 
  59.          
  60.         // 使用dispathch_group_notify() 指定一個 額外的程序塊,該程序塊將在組中的所有程序塊即將運行完成時執行。 
  61.        dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{ 
  62.                NSString *resultsSummary = [NSString stringWithFormat:@"first :[%@] \n second: [%@] \n",firstResult,secondResult]; 
  63.                //        resultTextView.text = resultsSummary
  64.                 
  65.                //在后臺線程聯系任何GUI對象是不可能的,必須將工作傳回到主線程!可再次調用dispatch_async 這次傳入dispatch_get_main_queue() 函數返回的隊列,該函數總是 提供存在于主線程上的特殊隊列,并準備執行需要使用主線程的程序塊 
  66.                dispatch_async(dispatch_get_main_queue(), ^{ 
  67.                    // 回到主線程才可以出發按鈕事件 
  68.                    StartBtn.enabled = YES
  69.                    StartBtn.alpha = 1.0; 
  70.                    [spinner stopAnimating]; 
  71.                     
  72.                    resultTextView.text = resultsSummary
  73.                }); 
  74.                NSDate *endTime = [NSDate date]; 
  75.                NSLog(@"complete in %f seconds",[endTime timeIntervalSinceDate:startTime]); 
  76.             
  77.            // 在最后一個程序塊中釋放 它們, 
  78.            [firstResult release]; 
  79.            [secondResult release]; 
  80.              
  81.             }); 
  82.         }) ; 
  83.         
  84.  
  85. #pragma mark - View lifecycle 
  86.  
  87. - (void)viewDidLoad 
  88.     [super viewDidLoad]; 
  89.     // Do any additional setup after loading the view, typically from a nib. 
  90.  
  91. - (void)viewDidUnload 
  92.     [self setStartBtn:nil]; 
  93.     [self setResultTextView:nil]; 
  94.     [self setSpinner:nil]; 
  95.     [super viewDidUnload]; 
  96.     // Release any retained subviews of the main view. 
  97.     // e.g. self.myOutlet = nil
  98.  
  99.  
  100. - (void)dealloc { 
  101.     [StartBtn release]; 
  102.     [resultTextView release]; 
  103.     [spinner release]; 
  104.     [super dealloc]; 
  105. @end 

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桃源县| 竹山县| 甘德县| 利川市| 育儿| 花莲市| 赤城县| 平陆县| 新宾| 石屏县| 安徽省| 秦皇岛市| 海原县| 米泉市| 汤原县| 手机| 开封县| 扎赉特旗| 耿马| 石首市| 东平县| 潼南县| 卢龙县| 乐山市| 高碑店市| 荔波县| 五河县| 黄梅县| 黎平县| 岑溪市| 甘孜县| 保靖县| 栾川县| 黑河市| 平陆县| 金昌市| 台北市| 巫溪县| 海伦市| 江达县| 宿迁市|