多线程

多线程

分别尝试了以下几种多线程方式

1、NSThread

2、NSOperation

3、NSOperationQueue

4、GCD

 

一、NSThread

创建:

1、//直接用方法开始:

[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:nil];

2、//先创建对象在开始:

NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(method:) object:nill];

[myThread start];

 

简单使用:[self performSelectorInBackground:@selector(doSomething) withObject:nil];

更新UI须回到主线程中,可以通过:performSelectorOnMainThread来实现,或者用委托函数

 

 

二、NSOperation

[operation start]//开始线程

[operation cancel];//取消线程

 

//监听线程完毕后的操作(可用点语法)

[operation setCompletionBlock = ^(){

NSLog(@“执行完毕”);

}];

 

//是否是同步还是异步执行。默认是 NO,即同步执行

[operation isConcurrent];

 

创建线程

NSOperation主要包括三种:1、NSInvocationOperation 2、NSBlockOperation 3、自定义NSOperation

1、NSInvocationOperation

NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doSomething) object:nil];

 

2、NSBlockOperation

//一个Operation中是并行操作的

//创建Operation

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){

}];

//增加一个并行线程

[operation addExecutionBlock:^(){

}];

 

 

3、自定义NSOperation

定义非并发操作时重载main函数

定义并发操作时重载。

 

main函数中每次要执行操作是都要判断一次isCancelled函数

 

三、NSOperationQueue

NSOperation *queue = [NSOperation alloc]init];

[queue setMaxConcurrentOperationCount:2]//设置最大并发数

 

[queue addOperation:operation1];

[queue addOperation:operation2];

 

//当operation2执行完了才执行operation1

[operation1 addDependency:operation2];

 

//主线程

[NSOperationQueue main] addOperation ^{

};

[[NSOperationQueue main] addOperation:op3];

 

四、GCD(Grand Central Dispatch)

串行:按顺序执行

并行:并发执行,无顺序执行

同步操作:dispatch_sync,不开新线程

异步操作:dispatch_async,开辟新线程。

 

串行+异步:常用,开新线程,顺序执行任务(下载耗时任务)

并行+异步:有用,开新线程,无序执行任务

串行+同步:无用,不开线程,顺序执行任务

并行+同步:无用,不开线程,无序执行任务

 

全局队列:系统自带的一个并行队列

主队列:主线程执行的队列,实际上是一个串行队列

 

1、新建队列

//新建串行队列

//第一个参数是queue标签,用于debug,第二个参数为0

dispatch_queue_t queue = dispatch_queue_create(“ThreadName”,0);

 

//新建并行队列(global全局队列)

dispatch_queue_t queue = dispatch_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

//DISPATCH_QUEUE_PRIORITY_HIGH(高),DISPATCH_QUEUE_PRIORITY_DEFAULT(普通),DISPATCH_QUEUE_PRIORITY_LOW(低),DISPATCH_QUEUE_PRIORITY_BACKGROUND(后台)

 

//新建主线程

dispatch_queue_t queue = dispatch_get_main_queue();

 

2、添加任务

//添加异步任务(第一个参数是要添加的队列名,第二个参数是要添加的代码块)

//该方法添加完队列,不会等待队列完成就开始执行任务

dispatch_async(queue,^{

doSomething;

});

dispatch_async_f();

 

//添加同步任务

//等待队列中的任务完成再继续执行

dispatch_sync(queue,^{

doSomething;

});

dispatch_sync_f();

 

3、组应用

dispatch_group_t = dispatch_group_create();

dispatch_group_async(group,queue,^{

doSomething;

})

 

//在组中等待,组织当前线程继续执行

dispatch_group_wait(group,DISPATCH_TIME_FOREVER);

 

转载于:https://www.cnblogs.com/durwards/p/4574894.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值