標籤:使用 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