iOS線程開發小結

來源:互聯網
上載者:User

標籤:使用   os   art   for   cti   io   

/*

 方法名決定是否開啟新線程(async,sync),隊列類型(全域隊列,串列隊列)決定開啟多少條線程

 

 1.快速線程調用

 *開啟後台線程執行任務

 [self performSelectorInBackground:@selector(test) withObject:nil];

 

 *回到主線程執行任務

 [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

 

 2.GCD : 依賴隊列執行

 1> 隊列類型

 * 全域隊列

 * 所有添加到全域隊列中的任務都是並發執行(同時執行,可能會開啟多個線程)

 * dispatch_get_global_queue

 

 * 串列隊列

 * 所有添加到串列隊列中的任務都是按順序執行(開一條線程)

 * dispatch_queue_create("myqueue", 0);

 

 * 主隊列

 * 所有添加到主隊列中的任務都是在主線程中執行的(跟方法名沒有關係)

 * dispatch_get_main_queue

 

 2> 同步還是非同步,取決於方法名(不影響主隊列,影響全域隊列、串列隊列)

 * 同步:dispatch_sync,在當前線程執行任務,不會開啟新的線程

 * 非同步:dispatch_async,在其他線程執行任務,會開啟新的線程

 

 3.NSOperation\NSOperationQueue

 1> 使用步驟

 * 建立NSOperation

 * 添加NSOperation到NSOperationQueue

 

 2> 優點

 * 更加物件導向

 * 可以控制最大並發數  maxConcurrentOperationCount

 * 新增工作(Operation)之間的依賴 addDependency

 */

#import "XMQViewController.h"

 

@interface XMQViewController ()

{

    NSOperationQueue *_queue;

}

@end

 

@implementation XMQViewController

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    

    _queue = [[NSOperationQueue alloc] init];

    // 控制最大並發數,最多同時執行3條線程

    _queue.maxConcurrentOperationCount = 3;

    

    // 回到主線程

//    [self test];

    

    // 線程監聽

//    [self gcd_group];

    

    // GCD線程依賴

//    [self gcd_barrier];

    

    // 迴圈執行

    [self gcd_apply];

 

    // 全域隊列

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    // 串列隊列

//    dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

    

    dispatch_async(queue, ^{ // 耗時操作

        NSLog(@"這是一個非同步線程---%@", [NSThread currentThread]);

    });

}

 

- (IBAction)click

{

    NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"operation---%@", [NSThread currentThread]);

    }];

    

    NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"operation2---%@", [NSThread currentThread]);

    }];

    

    // 該方法預設在主線程執行

//    [operation start];

    

    // 排入佇列會在非同步線程執行

    [_queue addOperation:operation];

    [_queue addOperation:operation2];

    

    // 設定線程依賴 (operation2依賴於operation,operation執行完以後,才能執行operation2)

    [operation addDependency:operation2];

}

 

// 延時執行某條線程

- (IBAction)click2

{

    // 全域隊列

//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    // 串列隊列

    dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

    double delayInSeconds = 5.0;

    dispatch_time_t delayInNanoSeconds =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

    dispatch_after(delayInNanoSeconds, queue2, ^{

        NSLog(@"順延強制");

    });

}

 

// dispatch_group_async(非同步方法呼叫)可以實現監聽一組任務是否完成,完成後得到通知執行其他的操作(比如通知使用者下載完成,顯示UI等)

- (void)gcd_group

{

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();

    

    dispatch_group_async(group, queue, ^{

        [NSThread sleepForTimeInterval:1];

        NSLog(@"group1");

    });

    dispatch_group_async(group, queue, ^{

        [NSThread sleepForTimeInterval:2];

        NSLog(@"group2");

    });

    dispatch_group_async(group, queue, ^{

        [NSThread sleepForTimeInterval:3];

        NSLog(@"group3");

    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        NSLog(@"updateUI");

    });

}

 

// dispatch_barrier_async 是在前面的任務執行結束後才執行,而且後面的任務必須等它執行完成之後才會執行

- (void)gcd_barrier

{

    dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:2];

        NSLog(@"dispatch_async1");

    });

    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:4];

        NSLog(@"dispatch_async2");

    });

    dispatch_barrier_async(queue, ^{

        NSLog(@"dispatch_barrier_async");

        [NSThread sleepForTimeInterval:4];

    });

    dispatch_async(queue, ^{

        [NSThread sleepForTimeInterval:2];

        NSLog(@"dispatch_async3");

    });

}

 

// dispatch_apply 執行某個程式碼片段N次

- (void)gcd_apply

{

    dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_PRIORITY_DEFAULT);

    dispatch_apply(10, queue, ^(size_t index) {

        NSLog(@"迴圈執行10次");

    });

}

 

// 回到主線程

- (void)test

{

    UIImage *image = nil;

    [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"更新UI介面---%@", [NSThread currentThread]);

    });

}

@end

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.