GCD和NSOperation多线程技术

第一讲  GCD

GCD会管理多线程的生命周期

GCD底层线程池,队列跟底层线程池之间的交互,底层线程池对线程进行了复用,使用效率要高

GCD跟NSThread对比

  1. 开不开线程,和执行任务的函数有关

- 同步不开

- 异步开

  1. (异步)开几条线程,和队列有关

- 串行队列最多开一条

- 并发队列开N条,具体条数由GCD决定!

主队列:

主队列同步会死锁:

注意主队列同步也可以不死锁,具体情况具体对待

主队列异步: 不会开启线程,在主线程中执行,但是主队列中的任务需要等待主线程中任务执行完毕之后才能执行

barrier阻塞:

会先循环执行完下载完成(所有异步执行完之后再执行barrier的block中代码),同一线程中顺序执行

注意:dispatch_barrier_async 必须使用自定义队列,否则执行效果和全局队列一致

dispatch_once 只执行一次的代码,注意单例中的static能够保证在block中局部变量可以记录保存在静态区,不会被销毁

dispatch_once是同步的,是线程安全的, dispatch_once内部也有一把锁,这把锁的性能很高

dispatch_group  调度组  dispatch_group_notify 异步的

dispatch_after 延迟操作- 异步执行的   因此在dispatch_after的block中执行的任务是在子线程中执行

第二讲  NSOperation

iOS8之后,GCD底层的线程池特别慷慨,只要要就给,可以开很多条线程

NSOperation是iOS2.0推出的,GCD是iOS4.0推出的

ARC是Xcode4.2推出的

NSInvocationOperation和NSBlockOperation的使用(都是异步并发执行的)

线程间通讯:

NSOperation和GCD的对比:

NSOperation设置最大并发数  setMaxConcurrentOperationCount

暂停继续(队列的挂起状态),挂起的是队列,不会影响正在执行的操作

取消,暂停和继续

依赖关系

异步下载图片

在异步下载图片的时候的问题及解决:

当异步下载图片之后,由于blockOperation是异步下载的,当返回cell的时候image还未下载下来,所以由于cell的imageView懒加载,并未显示图片,当点击或者上下滚动才显示

解决办法:占位图片提前设置imageView,固定imageView的大小

但是此时又有问题,占位图片太大,下载图片小,所以一开始显示占位图片大点击cell之后显示小的下载图片

解决办法:自定义cell,设置好imageView的大小,可以完整显示占位图片和下载图片

然而还有问题,此时图片每次滚动都会下载,并且当网速不同会导致图片错位,原因:比如第一个cell的图片下载很快,第九个之后就很慢,当第一个cell进入缓存池之后,第十个cell会进行cell复用,此时cell的图片下载很慢,图片还未下载完,当在往上滚动的时候,第一个cell会复用第十个 cell,由于第一个cell图片下载快,所以显示之后过几秒会再下载显示第十个cell未下载完的图片,从而发生图片错位的现象。

解决办法:利用MVC模式,在模型中定义图片属性,将图像异步保存在模型中,并刷新当前行调用数据源方法,在cell中判断模型是否有图片,显示模型中存储的图像。这样同时解决了不断从网络下载的问题

操作缓冲池:

为什么需要操作缓冲池?因为在下载网络图片的时候,当网络很慢,而用户快速滑动,比如第一个cell的图片没有下载完,于是会在创建一个操作添加到队列中,这样会造成资源的浪费

下载结束,清除操作缓冲

图像缓冲池的引入

由于模型内保存图片跟模型绑定的很紧,当接收到内存警告的时候不好释放,所以需要引入图像缓冲池,类似于操作缓冲池,用url作为key用字典缓冲

layoutsubviews方法的调用

内存警告清理缓冲池

实现沙盒缓存见SDWebImage

时间: 2024-10-12 20:56:51

GCD和NSOperation多线程技术的相关文章

iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现 -- 转

1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØNSOperation/NSOperationQueue 面向对象的线程技术 ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Ap

【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结

OC中的多线程 OC中多线程根据封装程度可以分为三个层次:NSThread.GCD和NSOperation,另外由于OC兼容C语言,因此仍然可以使用C语言的POSIX接口来实现多线程,只需引入相应的头文件:#include <pthread.h>. NSThread NSThread是封装程度最小最轻量级的,使用更灵活,但要手动管理线程的生命周期.线程同步和线程加锁等,开销较大: NSThread的基本使用比较简单,可以动态创建初始化NSThread对象,对其进行设置然后启动:也可以通过NST

多线程——NSThread、GCD、NSOperation

1.前言: 一个应用程序就是一个进程,一个进程至少包含一个线程,程序启动会自动创建一个主线程,负责UI界面的现实和控件事件的监控.多线程可以更充分的利用系统CPU资源,一定程度上提升程序的性能.1个进程可以开启多条线程,每条线程可以并行(同时)执行不同的任务.在一个线程内可以包含多个事物(要干的活),在线程内依据先进先出的特性串行执行…… 2.NSThread - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"main thread is %@

OA01-一个Demo展示iOS多线程技术的基本应用场景

最近在看iOS关于GCD.NSOperation多线程编程技术编程指南的时候写了个 小Demo,以7个小场景基本涵盖多线程技术的主流用法:其实多线程技术早在大学 读书的时候,基本思路就已经清晰了,不同操作系统的多线程实现也大同小异,iOS 平台下原理也是一样,关键就在与,能否熟练的.很顺畅的根据应用场景来选用相应 的多线程技术.阅读苹果官方文档和一些别人写的博客的时候也依然有种隔靴捞痒的 感觉:书读百边,不如实践一遍啊,SO,尽管网上相关的博客一大堆(首推这篇: http://www.cocoa

iOS的三种多线程技术NSThread/NSOperation/GCD

1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心线程的具体使用问题 NSOperation/NSOperationQueue 面向对象的线程技术 GCD -- Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术. 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,

iOS多线程——GCD与NSOperation总结

很长时间以来,我个人(可能还有很多同学),对多线程编程都存在一些误解.一个很明显的表现是,很多人有这样的看法: 新开一个线程,能提高速度,避免阻塞主线程 毕竟多线程嘛,几个线程一起跑任务,速度快,还不阻塞主线程,简直完美. 在某些场合,我们还见过另一个“高深”的名词——“异步”.这东西好像和多线程挺类似,经过一番百度(阅读了很多质量层次不齐的文章)之后,很多人也没能真正搞懂何为“异步”. 于是,带着对“多线程”和“异步”的懵懂,很多人又开开心心踏上了多线程编程之旅,比如文章待会儿会提到的GCD.

ios多线程(NSThread、GCD、NSOperation)

ios中得多线程技术主要使用3种:NSThread.NSOperation和GCD 一.NSThread: 最轻量级方法,但是不安全需要手动加锁,需要自己管理生命周期 NSThread的使用方法有2种: // 第一种,需要start 1 NSThread *th1 = [[NSThread alloc] initWithTarget:self selector:@selector(btnClick) object:nil]; 2     [th1 setName:@"线程1"]; 3 

iOS多线程技术—自定义NSOperation

iOS多线程技术—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. // // YYViewController.h // 01-自定义Operation // // Created by apple on 14-6-26. // Copyright (c) 2014年 itcase. All rights reserved.

iOS多线程技术—GCD介绍

iOS多线程技术—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中,