粗糙的iOS笔记之线程—GCD

一、多线程以及相关问题

1.进程:一个应用程序配套一个进程

2.线程:线程负责执行代码,一个进程里可以有多个线程,默认情况下,程序开始 的时候只有一个主线程

3.CPU负责执行线程所读取的代码,CPU是以时间片来运行的,每个线程都会被分配一个时间片,

然后轮流执行,执行完继续分配时间片,否则挂起,等到下一次被唤醒继续执行。

并发:多个线程同时执行

多核:CPU有多个可以用于计算的核

二、多线程存在的原因

1.耗时操作、读取文件、读网络文件、计时器等会堵塞主线程。主程序被堵塞程序就会卡死,10秒之内系统就会关闭它

同步:Synchronize   一行一行执行单线程

顺序:单线程 无并发

异步:Asynchronize 多个线程同时执行多线程

乱序:多线程 有并发

三、多线程的用法

1.加锁机制

1)让一段代码只能有一个线程执行,知道这个线程解锁后,其它线程才能进来

self.condition = [[NSConditionalloc]init];

[self.conditionlock];

// 相关代码

[self.condition unlock];

以上代码等于 ==       @synchronized ( self . condition ) { }

2.执行队列

1)执行队列是一个处理并发问题的一个全新的思考模式,用来管理线程

(因为创建线程和为何线程需要大量的资源)

2)线程池 一个专门用于存放创建好的线程的地方

3)执行队列机理

- (void)run
{
<span style="white-space:pre">	</span>// 创建操作
    NSOperation * o1 = [NSBlockOperation blockOperationWithBlock:^{
        [self loop];
    }];
    NSOperation * o2 = [NSBlockOperation blockOperationWithBlock:^{
        [self loop];
    }];
    NSOperation * o3 = [NSBlockOperation blockOperationWithBlock:^{
        [self loop];
    }];
    NSOperation * o4 = [NSBlockOperation blockOperationWithBlock:^{
        [self loop];
    }];
<span style="white-space:pre">	</span>// 创建队列
    NSOperationQueue * operationQueue = [[NSOperationQueue alloc] init];
<span style="white-space:pre">	</span>// 添加操作 进入队列
    [operationQueue addOperation:o1];
    [operationQueue addOperation:o2];
    [operationQueue addOperation:o3];
    [operationQueue addOperation:o4];
    // 同时有多个线程执行,如果赋值1,则只有一个线程来执行
    operationQueue.maxConcurrentOperationCount = 4;
    [NSThread sleepForTimeInterval:10];
}

- (void)loop
{
    for (int i = 0; i < 100; i++) {
        NSLog(@"%d",i);
    }
}
3 .GCD(Grand Center Dispatch)

1)Grand Center Dispatch 中央任务分发

2)以更简单的代码方式去处理OperationQueue 管理队列,可以快速的将一行代码异步执行

3)用法

    // 获取系统默认的队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 把耗时操作放入队列
    dispatch_async(queue, ^{
        NSString * path = self.imagePaths[indexPath.row];
        NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]];
        UIImage * image = [UIImage imageWithData:data];
        // 更新界面的操作由主线程来完成,子线程不能更改界面
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.imageView.image = image;
        });
    });
<span style="font-size:14px;"><strong>// 切记:子线程不能更改界面,更新界面的操作必须由主线程来完成 ;具体原因不明  可能与设计模式有关,有懂得麻烦解释一下  欢迎吐槽 谢谢!</strong></span>

给大家推荐一个swift视频教程,后续会不断更新,下载文件需要验证多次,有点耐心哦!

从OC转移到swift:环境与变量

swift进阶可能值

swift枚举扩展泛型

类初始化属性方法

元组闭包

变量字符串集合循环



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值