iOS多线程几种形式
来源:互联网 发布:梦三国修改数据 编辑:程序博客网 时间:2024/05/22 01:39
iOS有三种多线程编程的技术,分别是NSThread、Cocoa NSOperation和GCD(全称是:Grand Central Dispatch)
一、简单介绍几种多线程
1、NSThread
优点:NSThread比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
2、Cocoa NSOperation
优点:不需要关心线程管理,数据同步的事情,可以把经理放在自己需要执行的操作上。
Cocoa NSOperation相关的类是NSOperation,NSOperationQueue。
NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类:NSInvocationOperation和NSBlockOperation。或者创建NSOperation的子类的对象,把对象添加到NSOperationQueue队列里执行
3、GCD
Grand Central Dispatch(GCD)是Apple开发的一个多核编程的解决方法。
二、几种多线程的使用
1、NSThread有两种直接创建方法:(第一个是实例方法,第二个是类方法)
(1)[NSThreaddetachNewThreadSelector:@selector(doSomething:)toTarget:selfwithObject:nil];
(2)NSThread *thread = [[NSThreadalloc]initWithTarget:selfselector:@selector(doSomething:)object:nil];
[thread start];
其中withObject是传输给target的唯一参数,也可以是nil
第一种方式会直接创建现成并开始运行线程,第二种方式是先创建线程对象,然后再运行现成操作,在运行现成操作前可以设置线程的优先级等线程信息
不显示的创建线程的方法:
用NSObject的类方法:
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullableid)arg//创建一个线程
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullableid)arg waitUntilDone:(BOOL)wait//更新主线程数据的方法
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullableid)arg waitUntilDone:(BOOL)wait//更新其他线程的方法
2、Cocoa NSOperation的使用
使用NSOperation的方式有两种,
一种是用定义好的两个子类:NSInvocationOperation和NSBlockOperation。另一种是继承NSOperation,只需要继承重写NSOperation的一个方法main,然后把NSOperation子类的对象放入NSOperationQueue队列中,该队列就会启动并开始处理它。
我们可以将我们创建好的线程NSOperation放入NSOperationQueue中,NSOperationQueue的setMaxConCurrentOperationCount来设置最大线程数,默认情况下是-1,没有限制。
3、GCD的使用
GCD工作原理:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。一个任务可以是一个函数或者是一个block。GCD的底层依然是用线程实现的。
GCD中得FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行。
dispatch queue分为下面三种:
(1)Serial又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。但是Serial queue与Serial queue之间是并发执行的。
(2)Concurrent又称为global dispatch queue,可以并发的执行多个任务,但是执行顺序是随机的。
(3)Main dispatch queue是全局可用的serial queue,它是在应用程序主线程上执行任务的
常用的GCD方法
(1)dispatch_async
为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另一个线程处理这些操作,然后通知主线程更新界面。例如:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//耗时的操作
dispatch_async(dispatch_get_main_queue(), ^{
//更新界面
});
});
代码比NSThread和NSOperation简洁很多,而且GCD会自动根据任务在多核处理器上分配资源,优化程序。
系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数dispatch_get_global_queue去得到队列,例如
dispatch_queue_t global =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
系统默认的有一个串行队列main_queue;
dispatch_queue_t main =dispatch_get_main_queue();
虽然dispatch queue是引用计数的对象,但是以上两个都是全局的队列,不用retain或者release。
(2)dispatch_group_async的使用
dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。比如执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。例如:
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, ^{
[NSThreadsleepForTimeInterval:1];
});
dispatch_group_async(group, queue, ^{
[NSThreadsleepForTimeInterval:2];
});
dispatch_group_async(group, queue, ^{
[NSThreadsleepForTimeInterval:3];
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
});
dispatch_group_async是异步的操作
(3)dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行,例如:
dispatch_queue_t queue =dispatch_queue_create("queue1",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSThreadsleepForTimeInterval:2];
NSLog(@"2=====before");
});
dispatch_async(queue, ^{
[NSThreadsleepForTimeInterval:4];
NSLog(@"4=====before");
});
dispatch_barrier_async(queue, ^{
[NSThreadsleepForTimeInterval:4];
NSLog(@"4=====barrier");
});
dispatch_async(queue, ^{
[NSThreadsleepForTimeInterval:1];
NSLog(@"1=====after");
});
// dispatch_barrier_async前面的人物执行完成之后,它执行,后再执行它后面的
(4)dispatch_apply执行某个代码片段N次,例如:
dispatch_apply(10,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^(size_t index) {
//执行10次
});
- iOS多线程几种形式
- IOS 圆角的几种形式
- IOS 条件判断的几种形式
- iOS系统下,应用程序运行的几种形式。
- iOS开发中UITableView和UItableViewCell的几种形式
- 缓存几种形式
- 打电话几种形式
- setTime几种形式
- ios中的几种多线程实现
- ios多线程的几种方法
- ios多线程的几种创建方式
- ios多线程的几种创建方式
- ios多线程的几种创建方式
- ios中的几种多线程实现
- ios多线程的几种创建方式
- ios多线程的几种创建方式
- iOS 多线程的几种实现方式
- ios多线程的几种创建方式
- linux静态库的几种链接方式
- Spring-JDK与CGlib代理实现AOP简单实例
- c#+dev-GridControl的简单用法
- Linux下的静态库、动态库和动态加载库
- 文章标题
- iOS多线程几种形式
- Error Domain=NSURLErrorDomain Code=-999 "cancelled"
- 自定义下拉框控件(<select></select>)
- VM VirtualBOX共享文件夹主机Win 虚拟机Unubtu
- 关于自定义Toast
- [Linux]---Add a new user to sudo group
- 断舍离的生活理念
- sublime 常用插件
- 前端必读:浏览器内部工作原理-How Browsers Work: Behind the Scenes of Modern Web Browsers