iOS中多线程编程

来源:互联网 发布:起凡刷通宝软件 编辑:程序博客网 时间:2024/04/18 10:47

      要了解多线程, 必须先知道程序,进程和线程的概念

程序: 由源代码生成的可执行应用, 是静态的

进程: 为了反映程序并发执行的过程, 引入了进程的概念, 进程就是程序运行的过程,它可以申请和拥有系统的资源, 负责资源的调度 

线程: 是程序执行的最小单元, 负责代码的执行, 一个进程由一个或多个线程组成, 每个进程至少包含一个线程,这个线程叫作主线程

多线程:一个程序可以拥有多个线程,iOS中可以根据需要自己开辟新的线程, 相对主线程来说这些线程叫做子线程


多线程的优点: 

1.  在进行大量运算的时候如果用单线程, 则会影响主线程的执行,用多线程技术,则可以解决这个问题,大大加快程序运行的速度

2. 可以把执行时间长的任务放到后台处理

3. 在一些需要等待的任务(如: 用户输入)中可以释放一些内存资源

缺点: 

1. 如果线程特别多的情况下可能会影响性能, 因为操作系统需要来回切换

2. 线程越多占用的内存资源越大


iOS中使用多线程的场景:

1. 需要大量运算的使用,如: 循环次数特大的时候

2. 大量的数据读取  如: 读取本地数据, 查询数据库中的所有数据

3. 网络同步请求


iOS中如何使用多线程: 

常用的类: NSThread    NSOperationQueue    NSBlockOperation    NSObject    GDB


NSThread: 

创建NSThread的两种方法: 

1. 需要手动调用start方法开启线程

NSThread *thread = [[NSThreadalloc] initWithTarget:self selector:@selector(calculator) object:nil];

[threadstart];


2. 自动调用start方法开启线程

[NSThreaddetachNewThreadSelector:@selector(calculator)toTarget:selfwithObject:nil];


NSOperation 和 NSOperationQueue

NSOperation是抽象类,不能直接使用, 只能使用它的子类, 

使用: 1. 在子类中重新父类的main方法,创建子类的对象,调用start方法,会自动调用main方法 (main方法中实现子线程要实现的代码)

     2.  创建NSOperationQueue对象, 将NSOperation子类的对象加入到队列中, 会自动调用start方法启动线程 (此时不能再手动调用start方法)


NSBlockOperation:

NSBlockOperation *blockOper = [NSBlockOperationblockOperationWithBlock:^{

// 此处为多线程要执行的代码 

    }];


NSObject:

self performSelectorInBackground:<#(SEL)#> withObject:<#(id)#>


GDB:本质上就是一个函数,一般是一个block函数  性能更高,功能强大

GDB中有两种队列

1. 同步队列

创建一个同步线程队列

dispatch_queue_t queue = dispatch_queue_create("first", DISPATCH_QUEUE_SERIAL);


异步执行同步线程队列

dispatch_queue_async(queue,^{

// 要执行的多线程代码



// iOS多线程中, 所有会修改UI界面的代码全部要在主线程中执行, 不能在子线程中执行, 要定义或修改控件, 要返回主线程

// 得到主线程

dispatch_async(dispatch_get_main_queue(), ^{

// 这里写主线程要执行的代码

});

});


2. 并发队列


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// 要执行的多线程代码



dispatch_async(dispatch_get_main_queue(), ^{

// 这里写主线程要执行的代码

});



});


需要注意的地方: 

1. 在我们手动创建的子线程中, 执行多线程代码的地方要手动加入自动释放池

2. 不能直接使用NSOperation方法,只能使用它的子类

3. 不能在子线程中写修改UI的代码









0 0
原创粉丝点击