iOS開發之---多線程技術

iOS支持多個層次的多線程編程,層次越高抽象程度越高,使用起來也越方便,也是蘋果推薦的方式。編程

  • Thread:最低抽象層次的,線程的管理、線程鎖的設置與釋放等都須要開發人員本身來負責,使用NSThread類來建立和管理線程。
  • Cocoa Operations:經過NSOperation類來管理線程。NSOperation是一個抽象基類,iOS提供了兩個默認實現:NSInvocationOperation和NSBlockOperation。
  • Grand Central Dispatch(GCD):iOS 4開始支持GCD,它提供了一個全新的API,能夠將應用程序須要執行的工做拆分爲能夠分散在多個線程多個cpu上更小的塊。這個新API大部分使用程序塊(Block)來訪問。使用GCD,開發者須要作的惟一一件事就是定義須要執行的任務,並 把任務添加到合適的派遣隊列(Dispatch Queue)中。GCD將負責建立線程,並將任務調度到合適的線程中。GCD技術使得線程管理已經成爲系統的一部分,提供一個友好的任務管理和執行的方法,和傳統的NSThread管理相比效率更高。

本節重點介紹GCD的使用:多線程

  • GCD派遣隊列:是一個基於C語言的技術,隊列能夠按照順序執行任務也能夠同步執行任務,可是全部在隊列裏面的任務均按照「先進先出」的順序。提交給派遣隊列的任務必須封裝成一個函數或者程序塊(Block)。

 

  1. 順序隊列:
  2. 併發隊列:也稱全局派遣隊列
  3. 主隊列:是一個在應用程序的主隊列,這個隊列和應用程序的運行循環交錯執行

幾個例子:併發

一、順序隊列異步執行iphone

異步不阻塞異步

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"隊列開始執行....");
    dispatch_queue_t queue ;
    queue = dispatch_queue_create("iphone.book.queue", NULL);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"隊列之中運行...");
    });
    NSLog(@"隊列以後運行....");
}

二、順序隊列同步執行:async

同步阻塞函數

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"隊列開始執行....");
    dispatch_queue_t queue ;
    queue = dispatch_queue_create("iphone.book.queue", NULL);
    dispatch_sync(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"隊列之中運行...");
    });
    NSLog(@"隊列以後運行....");
}

三、併發隊列異步執行oop

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"隊列開始執行....");
    dispatch_queue_t queue ;
    queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"隊列之中第一個任務運行...");
    });
    
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"隊列之中第二個任務運行...");
    });
    
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"隊列之中第三個任務運行...");
    });
    
    NSLog(@"隊列以後運行....");
}

四、主線程隊列spa

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"隊列開始執行....");
    dispatch_queue_t queue ;
    queue = dispatch_get_main_queue();
    dispatch_async(queue, ^{
        lblInfo.text = 計算結果
    });
    
    NSLog(@"隊列以後運行....");
}

 

【注】:異步執行代碼的其它方法:線程

除了經過多線程的方式進行異步代碼執行外,還有其它方式來進行異步操做

一、performSelector: withObject: afterDelay:

該方法是NSRunLoop對象針對NSObject類添加的類別(extension),所以基本全部的類都能執行該方法。

二、performSelectorOnMainThread: withObject: waitUntilDone:

該方法是NSThread類爲NSObject類添加的方法。

三、scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:

經過NSTimer類的類方法,在必定的時間異步執行selector指定的方法。

相關文章
相關標籤/搜索