IOS 使用GCD改善性能

1.GCD介紹

  GCD:Grand Central Dispathch,核心中央調度,是一種異步技術。可是它是系統級的。網絡

  負責管理隊列,是線程之上的抽象層。隊列能夠並行或串行運行,可以在系統級自動管理和優化線程。把任務放到隊列裏執行,一個任務能夠是一個函數或一個block。多線程

1.1.多線程分類

  如下的抽象度和底層函數級別從低到高。併發

1.1.1. PThread 

  已經拋棄了異步

1.1.2. NSThread

  幾乎不用async

1.1.3. NSOperation

  多用於網絡下載,可是如今都用開源庫,例如:AFNetWorking函數

1.1.4. GCD

  多用於本地解析數據。優化

1.2. GCD概念說明

  GCD中的隊列稱之爲 dispatch queue,分類爲三類:url

1.2.1. main dispatch queue

  • 系統提供
  • 主線程
  • 全局性的
  • serial queue,串行,同一時間只能執行一個任務。
  • 用途:UI操做相關,主線程執行。
  • 用法:宏 dipatch_get_main_queue()

1.2.3. global dispatch queue

  • 系統提供
  • 併發執行
  • 用法:函數 dispatch_get_global_queue(0,0),第一個參數爲優先級,第二個參數如今沒有意義,都是0。

  

1.2.3. 自定義的 dispatch queue

  • 同時只能執行一個任務
  • 用途:用於同步訪問特定的資源
  • 實時性沒有過高要求的
  • 函數:dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL);

2. GCD使用

2.1. 同步提交

  • void dispath_sync(dispatch_queue_t queue, dispatch_block_t block);
  • 阻塞線程
  • Demo
    - (void)syncDownload{
      //同步下載,阻塞主線程
      NSURL *url = [NSURL URLWithString:@""];
      NSData *data = [[[NSData alloc] initWithContentsOfURL:url autorelease];
      UIImage *image = [[[UIImage alloc] initWithData:data] autorelease];
      _imageView.image = image; 
    }    

     

2.2. 異步提交

  • void dispath_async(dispatch_queue_t queue, dispatch_block_t block);
  • 後臺執行
  • Demo
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //耗時的操做
        NSURL *url = [NSURL URLWithString:@""];
        NSData *data = [[[NSData alloc] initWithContentsOfURL:url autorelease];
        UIImage *image = [[[UIImage alloc] initWithData:data] autorelease];
        
        dispatch_async(dispatch_get_main_queue(),^{ 
            //更新界面 
            _imageView.image = image;
        }); 
    });    
相關文章
相關標籤/搜索