iOS线程开发小结
在iOS開發(fā)線程操作時,一般方法名決定是否開啟新線程(async,sync),隊(duì)列類型(全局隊(duì)列,串行隊(duì)列)決定開啟多少條線程
?
?1.快速線程調(diào)用
?*開啟后臺線程執(zhí)行任務(wù)
?[self performSelectorInBackground:@selector(test) withObject:nil];
?
?*回到主線程執(zhí)行任務(wù)
?[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
?
?2.GCD : 依賴隊(duì)列執(zhí)行
?1> 隊(duì)列類型
?* 全局隊(duì)列
?* 所有添加到全局隊(duì)列中的任務(wù)都是并發(fā)執(zhí)行(同時執(zhí)行,可能會開啟多個線程)
?* dispatch_get_global_queue
?
?* 串行隊(duì)列
?* 所有添加到串行隊(duì)列中的任務(wù)都是按順序執(zhí)行(開一條線程)
?* dispatch_queue_create("myqueue", 0);
?
?* 主隊(duì)列
?* 所有添加到主隊(duì)列中的任務(wù)都是在主線程中執(zhí)行的(跟方法名沒有關(guān)系)
?* dispatch_get_main_queue
?
?2> 同步還是異步,取決于方法名(不影響主隊(duì)列,影響全局隊(duì)列、串行隊(duì)列)
?* 同步:dispatch_sync,在當(dāng)前線程執(zhí)行任務(wù),不會開啟新的線程
?* 異步:dispatch_async,在其他線程執(zhí)行任務(wù),會開啟新的線程
?
?3.NSOperation\NSOperationQueue
?1> 使用步驟
?* 創(chuàng)建NSOperation
?* 添加NSOperation到NSOperationQueue
?
?2> 優(yōu)點(diǎn)
?* 更加面向?qū)ο?/p>
?* 可以控制最大并發(fā)數(shù)? maxConcurrentOperationCount
?* 添加任務(wù)(Operation)之間的依賴 addDependency
?*/
#import "XMQViewController.h"
?
@interface XMQViewController ()
{
? ? NSOperationQueue *_queue;
}
@end
?
@implementation XMQViewController
?
- (void)viewDidLoad
{
? ? [super viewDidLoad];
?? ?
? ? _queue = [[NSOperationQueue alloc] init];
? ? // 控制最大并發(fā)數(shù),最多同時執(zhí)行3條線程
? ? _queue.maxConcurrentOperationCount = 3;
?? ?
? ? // 回到主線程
//? ? [self test];
?? ?
? ? // 線程監(jiān)聽
//? ? [self gcd_group];
?? ?
? ? // GCD線程依賴
//? ? [self gcd_barrier];
?? ?
? ? // 循環(huán)執(zhí)行
? ? [self gcd_apply];
?
? ? // 全局隊(duì)列
? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
? ? // 串行隊(duì)列
//? ? 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]);
? ? }];
?? ?
? ? // 該方法默認(rèn)在主線程執(zhí)行
//? ? [operation start];
?? ?
? ? // 加入隊(duì)列會在異步線程執(zhí)行
? ? [_queue addOperation:operation];
? ? [_queue addOperation:operation2];
?? ?
? ? // 設(shè)置線程依賴 (operation2依賴于operation,operation執(zhí)行完以后,才能執(zhí)行operation2)
? ? [operation addDependency:operation2];
}
?
// 延時執(zhí)行某條線程
- (IBAction)click2
{
? ? // 全局隊(duì)列
//? ? dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
? ? // 串行隊(duì)列
? ? 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(@"延遲執(zhí)行");
? ? });
}
?
// dispatch_group_async(異步方法)可以實(shí)現(xiàn)監(jiān)聽一組任務(wù)是否完成,完成后得到通知執(zhí)行其他的操作(比如通知用戶下載完成,顯示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 是在前面的任務(wù)執(zhí)行結(jié)束后才執(zhí)行,而且后面的任務(wù)必須等它執(zhí)行完成之后才會執(zhí)行
- (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 執(zhí)行某個代碼片段N次
- (void)gcd_apply
{
? ? dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_PRIORITY_DEFAULT);
? ? dispatch_apply(10, queue, ^(size_t index) {
? ? ? ? NSLog(@"循環(huán)執(zhí)行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
轉(zhuǎn)載于:https://www.cnblogs.com/feife/p/4630380.html
總結(jié)
- 上一篇: java开发的岗位职责,写给正在求职的J
- 下一篇: 光学字符识别的 5 个最佳免费数据集