OC開執行緒的三種方式
阿新 • • 發佈:2018-10-31
第一種NSThread
//NSThread 方法1 需要手動start];
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(threadRun:) object:@"引數"];
thread.name [email protected]"執行緒1";
//優先順序 0.0-1.0 預設0.5 0.0最低1.0最高
thread.threadPriority=0.6;
[thread start];
//NSThread 方法2
[NSThread detachNewThreadSelector:@selector(threadRun:) toTarget:self withObject:@"引數"];
//NSThread 方法3
[self performSelectorInBackground:@selector(threadRun:) withObject:@"引數"];
}
//多個引數可以用陣列或者字典
-(void)threadRun:(NSString *)param{
//回到主執行緒
[self performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:YES];
}
第二種 GCD
-(void)gcdThread{
/**第一種自己建立佇列
第一個引數:C語言的字串,標籤隨便填
第二個引數 佇列的型別。
DISPATCH_QUEUE_CONCURRENT併發 //開多條執行緒
DISPATCH_QUEUE_SERIAL 序列 只開一條執行緒
*/
// dispatch_queue_t queue= dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT);
/**
第二種拿系統的佇列
第一個引數 優先順序
第二個引數 預留給未來使用 隨便填0
*/
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
//執行緒內
dispatch_async(dispatch_get_main_queue(), ^{
//回到主執行緒
});
});
}
/**
gcd柵欄函式
會先執行柵欄函式前面的非同步任務
然後執行柵欄函式
再執行柵欄函式下面的非同步任務
*/
-(void)barrier{
/**這裡的佇列必須用dispatch_queue_create建立的
不能用系統的dispatch_get_global_queue
否則不會生效*/
dispatch_barrier_async(dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT), ^{
});
}
/**gcd佇列組
可以新增完成任務通知功能
用於任務監聽
*/
-(void)group{
//建立佇列
dispatch_queue_t queue=dispatch_get_global_queue(0, 0);
// 建立佇列組
dispatch_group_t group=dispatch_group_create();
//非同步函式
dispatch_group_async(group, queue, ^{
NSLog(@"非同步一");
});
dispatch_group_async(group, queue, ^{
NSLog(@"非同步二");
});
dispatch_group_async(group, queue, ^{
NSLog(@"非同步三");
});
//非同步等
dispatch_group_notify(group, queue, ^{
NSLog(@"全部任務完成通知");
});
//死等 任務不完成 後面程式碼不執行
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}
/**gcd快速迭代*/
-(void)apply{
/**
快速迭代
第一個引數遍歷的引數
第二個引數佇列必須是併發佇列
第三個引數 遍歷的索引*/
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index) {
});
}
/*
第三種 執行緒
NSoperation
*/
-(void)operation{
//第一種方式
// NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(startOperaion) object:nil];
//第二種方式
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
//執行執行緒任務
NSURL *url=[NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1516809008589&di=f037ce52a7884e59ab83f0420e94a3c4&imgtype=0&src=http%3A%2F%2Fmvimg4.meitudata.com%2F5604ee3a30f7e560.jpg
"];
NSData *imageData= [NSData dataWithContentsOfURL:url];
_image= [UIImage imageWithData:imageData];
}];
NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
//執行執行緒任務
}];
NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
//執行執行緒任務
}];
[operation addExecutionBlock:^{
//可以追加任務
}];
operation.completionBlock = ^{
// 完成監聽
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
//主執行緒更新任務
if(_image){
// NSLog(@"主執行緒更新任務");
[_iv setImage:_image];
}
}];
};
//如果2新增依賴1 那麼執行完1才會執行2
[operation2 addDependency:operation1];
//如果operation1新增依賴operation 那麼執行完operation才會執行operation1
[operation1 addDependency:operation];
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
//設定最大併發數
// queue.maxConcurrentOperationCount=3;
[queue addOperation:operation];
[queue addOperation:operation1];
[queue addOperation:operation2];
// [queue setSuspended:YES];//暫停 NO可以恢復 不能暫停正在執行狀態的任務
// [queue cancelAllOperations];//取消 不可以恢復
//
// //簡便方法
// [queue addOperationWithBlock:^{
// //執行緒任務;
// }];
}
//NSThread 方法1 需要手動start];
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(threadRun:) object:@"引數"];
thread.name [email protected]"執行緒1";
//優先順序 0.0-1.0 預設0.5 0.0最低1.0最高
thread.threadPriority=0.6;
[thread start];
//NSThread 方法2
[NSThread detachNewThreadSelector:@selector(threadRun:) toTarget:self withObject:@"引數"];
//NSThread 方法3
[self performSelectorInBackground:@selector(threadRun:) withObject:@"引數"];
}
//多個引數可以用陣列或者字典
-(void)threadRun:(NSString *)param{
//回到主執行緒
[self performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:YES];
}
第二種 GCD
-(void)gcdThread{
/**第一種自己建立佇列
第一個引數:C語言的字串,標籤隨便填
第二個引數 佇列的型別。
DISPATCH_QUEUE_CONCURRENT併發 //開多條執行緒
DISPATCH_QUEUE_SERIAL 序列 只開一條執行緒
*/
// dispatch_queue_t queue= dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT);
/**
第二種拿系統的佇列
第一個引數 優先順序
第二個引數 預留給未來使用 隨便填0
*/
dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
//執行緒內
dispatch_async(dispatch_get_main_queue(), ^{
//回到主執行緒
});
});
}
/**
gcd柵欄函式
會先執行柵欄函式前面的非同步任務
然後執行柵欄函式
再執行柵欄函式下面的非同步任務
*/
-(void)barrier{
/**這裡的佇列必須用dispatch_queue_create建立的
不能用系統的dispatch_get_global_queue
否則不會生效*/
dispatch_barrier_async(dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT), ^{
});
}
/**gcd佇列組
可以新增完成任務通知功能
用於任務監聽
*/
-(void)group{
//建立佇列
dispatch_queue_t queue=dispatch_get_global_queue(0, 0);
// 建立佇列組
dispatch_group_t group=dispatch_group_create();
//非同步函式
dispatch_group_async(group, queue, ^{
NSLog(@"非同步一");
});
dispatch_group_async(group, queue, ^{
NSLog(@"非同步二");
});
dispatch_group_async(group, queue, ^{
NSLog(@"非同步三");
});
//非同步等
dispatch_group_notify(group, queue, ^{
NSLog(@"全部任務完成通知");
});
//死等 任務不完成 後面程式碼不執行
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
}
/**gcd快速迭代*/
-(void)apply{
/**
快速迭代
第一個引數遍歷的引數
第二個引數佇列必須是併發佇列
第三個引數 遍歷的索引*/
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index) {
});
}
/*
第三種 執行緒
NSoperation
*/
-(void)operation{
//第一種方式
// NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(startOperaion) object:nil];
//第二種方式
NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
//執行執行緒任務
NSURL *url=[NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1516809008589&di=f037ce52a7884e59ab83f0420e94a3c4&imgtype=0&src=http%3A%2F%2Fmvimg4.meitudata.com%2F5604ee3a30f7e560.jpg
"];
NSData *imageData= [NSData dataWithContentsOfURL:url];
_image= [UIImage imageWithData:imageData];
}];
NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
//執行執行緒任務
}];
NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
//執行執行緒任務
}];
[operation addExecutionBlock:^{
//可以追加任務
}];
operation.completionBlock = ^{
// 完成監聽
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
//主執行緒更新任務
if(_image){
// NSLog(@"主執行緒更新任務");
[_iv setImage:_image];
}
}];
};
//如果2新增依賴1 那麼執行完1才會執行2
[operation2 addDependency:operation1];
//如果operation1新增依賴operation 那麼執行完operation才會執行operation1
[operation1 addDependency:operation];
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
//設定最大併發數
// queue.maxConcurrentOperationCount=3;
[queue addOperation:operation];
[queue addOperation:operation1];
[queue addOperation:operation2];
// [queue setSuspended:YES];//暫停 NO可以恢復 不能暫停正在執行狀態的任務
// [queue cancelAllOperations];//取消 不可以恢復
//
// //簡便方法
// [queue addOperationWithBlock:^{
// //執行緒任務;
// }];
}