iOS中多线程与GCD的使用

来源:互联网 发布:x20第四代人工智能 编辑:程序博客网 时间:2024/05/31 19:41

今天总算是把自己的blog安了个家 欢迎大家来采!

之前总是把学习的内容放到印象笔记里,今天也拿出来晒晒,希望对有需求的童鞋有个帮助吧!

“网络”---------这个词在当今这个社会中,并不会让大家感到陌生,在移动端开发的网络开发更是必不可少的。


我们今天首先来聊一聊iOS中的多线程的CGD的使用


在面试过程中网络也算是出现机率比较高的一部份了。因此我们现在看看几个基本概念目让大家有个整体的印象

1、线程与进程的区别和联系? 

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进 程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健 壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

2、iOS中的队列、主线程、子线程?

队列:是一种先进先出的数据结构,如果一个任务不能出对,则会堵塞整个程序的运行。总体来说,队列
就是负责调度的,谁空闲就会把任务分配给谁。

主线程、子线程:一个进程中,至少会有一个线程,就是主线程,当我们要执行一些复杂操作时,则会开启一个子线程来让它执行,从而保证主线程中的操作有序执行。注意:因为子线程也是消耗系统资源的,因此并不是开的子线程越多越好,iPhone 中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第子线程开始都是512KB。在iOS开发中,更新UI的操作一定要在主线程中进行。

接下来我们看看iOS中的多线程技术

无论使用哪种多线程技术都可以使用
[NSThread currentThread]跟踪查看当前执行所在的线程情况。 num = 1表示在主线程上执行的任务
[NSThread sleepForTimeInterval:1.0f];让当前线程休眠,通常在程序开发中,用于模拟耗时操作,以便跟踪不同的并发执行情况!

0、NSObject:因为多线程技术在开发十分重要,因此苹果在NSObject类中封装好了一些多线程方法来让我们简化操作。
1> 使用performSelectorInBackground可以开启后台线程,执行selector选择器选择的方法
2> 使用performSelectorOnMainThread可以重新回到主线程执行任务,通常用于后台线程更新界面UI时使用

提示:使用performSelectorInBackground也可以直接修改UI,但是强烈不建议使用。
注意:在使用NSThread或者NSObject的线程方法时,一定要使用自动释放池,否则容易出现内存泄露。

1、NSThread:每一个NSThread对象对应一个线程,但是要求程序员自己来管理线程的生命周期、同步、加锁、睡眠以及唤醒等线程操作,使用相对复杂。
NSThread的常用多线程方法:在iOS中此方法弱暴了,不知道是不是因为别的方法太强大了!

- (id)init;

- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

这种方法创建后,需要自己手动启动,启动的方法是:
- (void)start;

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

这个方法可以直接生成一个线程并启动它,而且无需为线程的清理负责。

2、NSOperation:是苹果公司为我们封装的一套面向对象的多线程技术,使用简单。但是因为此类是抽象类,我们在开发中一般会使用它的两子类来进行多线程操作,a) NSInvocationOperation  b) NSBlockOperation,一般在使用NSOperation时一定给伴随着NSOperationQueue,因为只有将线程操作添加到NSOperationQueue队列中,操作才能被执行,但是在主线程上执行还是子线程中执行,这就要看该操作被添加到什么队列上了。在使用NSOpertaionQueue时,如果我们将操作添加到我们自已定义的队列中时,就意味着该操作就会被放到子线程中执行,如果我们将操作添加到我们主线程队列中时,就意味着该操作就会被放到主线程中执行。

实例:
NSOperationQueue *_queue = [[NSOperationQueue alloc] init];//自定义队列
[NSOperationQueue mainQueue]//获取主线程队列。

注意:利用NSOperation还可以控制线程的并发数量和执行依赖
 [_queue setMaxConcurrentOperationCount:2];设置线程的最大并发数量为2.
下面我们用一个实例来模仿一下:

- (IBAction)operationDemo
{
    // 1. 下载
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载 %@" , [NSThread currentThread]);
    }];
    // 2. 滤镜
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"滤镜 %@" , [NSThread currentThread]);
    }];
    // 3. 显示
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"更新UI %@" , [NSThread currentThread]);
    }];
    // 添加操作之间的依赖关系,所谓“依赖”关系,就是等待前一个任务完成后,后一个任务才能启动
    // 依赖关系可以跨线程队列实现
    // 提示:在指定依赖关系时,注意不要循环依赖,否则不工作。
    [op2 addDependency:op1];
    [op3 addDependency:op2];
//  [op1 addDependency:op3];//如果将操作1再依赖操作3时,程序则无法运行。
    
    //将操作添加到队列中。
    [_queue addOperation:op1];
    [_queue addOperation:op2];
    [[NSOperationQueue mainQueue] addOperation:op3];//将更新UI的操作加到主队列中
}

3、GCD------------>因为GCD中的使用和概念很容易混淆,我决定用单独的一个篇幅来说明它的使用。

小弟第一次写博客,希望对有需求的人有帮助,如果有什么错误希望大家指正!

0 0
原创粉丝点击