可以看到 NSOperation 和 NSOperationQueue 分别对应 GCD 的 任务 和 队列 。...操作步骤也很好理解: 1.将要执行的任务封装到一个 NSOperation 对象中。 2.将此任务添加到一个 NSOperationQueue 对列中,线程就会依次启动。...示例代码如下: 相比NSInvocationOperation推荐使用NSBlockOperation,因为它代码简单,同时由于闭包性使它没有传参问题,NSInvocationOperation在Swift...在GCD中串行队列中的任务被安排到一个单一线程执行(不是主线程),可以方便地控制执行顺序;并发队列在多个线程中执行(前提是使用异步方法),顺序控制相对复杂,但是更高效....在GDC中一个操作是多线程执行还是单线程执行取决于当前队列类型和执行方法,只有队列类型为并行队列并且使用异步方法执行时才能在多个线程中执行(如果是并行队列使用同步方法调用则会在主线程中执行).
简介 为何使用GCD GCD提供很多超越传统多线程编程的优势: 易用: GCD比之thread跟简单易用。...效率: GCD被实现得如此轻量和优雅,使得它在很多地方比之专门创建消耗资源的线程更实用且快速。 这关系到易用性:导致GCD易用的原因有一部分在于你可以不用担心太多的效率问题而仅仅使用它就行了。...GCD编程的核心就是dispatch队列,block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用。...我就是换了点代码办到了同一件事儿。” 实际上,使用GCD途径有几个好处: 平行计算: 注意在第二个版本的代码中, -setSomething:是怎么使用dispatch_async的。...安全: 使用GCD,我们就不可能意外写出具有不成对Lock的代码。在常规Lock代码中,我们很可能在解锁之前让代码返回了。使用GCD,队列通常持续运行,你必将归还控制权。
NSOperation 是苹果公司对 GCD 的封装,完全面向对象,所以使用起来更好理解。...里的任务还是有区别的** 。...)而是应该放到NSOperationQueue中启动。...就算是 addExecutionBlock 方法,也会在 当前线程和其他线程 中执行,也就是说还是会占用当前线程。如果你不想这个任务在主线程中执行(代码默认情况下都在主线程中执行。)...的一些特殊使用 设置最大并发数 我们将 NSOperationQueue 与 GCD的队列 相比较就会发现,这里没有串行队列,那如果我想要10个任务在其他线程串行的执行的话,NSOperationQueue
前言 Hi Coder,我是 CoderStar!...(在 OC 中,还有一个是NSInvocationOperation,但在 Swift 中,该子类已经在 Swift4 里去掉,想必去掉的原因大家也很容易理解,因为 Swift 语言本身就不推荐 selector...其实 NSOpertion 是先于GCD引进的,在当时,NSOperationQueue 接收 NSOperation 对象并创建一个线程,然后在该线程上运行 main方法 ,运行完成之后再杀死该线程。...如果大家对 Operation 底层实现比较有兴趣,可以在开源的 Foundtion 框架中查看Operation.swift[1]。...GCD VS Operation 使用 GCD 还是使用 Operation 这个问题其实在社区已经争论了很久,从斯坦福大学的 CS193p 课程推荐使用 GCD,到 WWDC 2012 时演讲者推荐使用
一、NSOperation 抽象类 NSOperation 是一个"抽象类",不能直接使用。抽象类的用处是定义子类共有的属性和方法。 NSOperation 是基于 GCD 做的面向对象的封装。...相比较 GCD 使用更加简单,并且提供了一些用 GCD 不是很好实现的功能。 苹果公司推荐使用的并发技术。...NSOperationQueue 队列 已经学习过的抽象类 UIGestureRecognizer CAAnimation CAPropertyAnimation 二、 NSOperation 和 GCD...可以跨队列设置操作的依赖关系 可以设置队列中每一个操作的优先级 高级功能: 最大操作并发数(GCD不好做) 继续/暂停/全部取消 跨队列设置操作的依赖关系 四、代码实践 1 // 2 // ViewController.m...80 不会取消正在执行中的操作。
转载自:iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用 一、多线程的基本概念 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位...GCD总结:将任务(要在线程中执行的操作block)添加到队列(自己创建或使用全局并发队列),并且指定执行任务的方式(异步dispatch_async,同步dispatch_sync) No.3:队列的创建方法...; }); GCD实现代码只执行一次 使用dispatch_once能保证某段代码在程序运行过程中只被执行1次。可以用来设计单例。...将任务加入到队列中:将NSOperation对象添加到NSOperationQueue中。...这是因为NSOperation多线程的使用需要配合队列NSOperationQueue,后面会讲到NSOperationQueue的使用。
,开发中我们操作线程大多都使用 GCD 和 NSOperation 来实现多线程操作。...下面我就给大家系统的介绍一下 GCD 是如何实现多线程的 GCD 实现多线程 GCD 简介 GCD 全称是Grand Central Dispatch,可译为“超级厉害的中枢调度器”,GCD 是苹果公司为多核的并行运算提出的解决方案...都会加入到主线程的队列中执行) 注意:使用sync函数(同步函数)往当前串行队列中添加任务,会卡住当前的串行队列 解释:使用同步函数添加任务 A 到串行队列,说明要在当前串行队列立即执行任务 A ,任务...你等我,我等你,谁也无法执行。...NSOperationQueue 使用NSOperationQueue创建队列:主队列和全局队列 // 创建一个其他队列(包括串行队列和并发队列) 放到这个队列中的NSOperation对象会自动放到子线程中执行
可以使用它直接操作线程,但需要开发者手动管理其生命周期。 但是相比于 GCD 与 NSOperation / NSOperationQueue 来说更加轻量。...GCD,是 iOS 中多线程编程使用最多也是最方便的解决方案。...1.1 任务 执行的操作,也就是使用 GCD 时 Block 中需要执行的那段代码。 我个人理解,任何一句代码都是一个任务。...遗憾的是,Swift 取消了 dispatch_once 这个操作,毕竟在 Swift 中实现单例实在是太简单了(只需要将初始化方法设置为私有,然后提供一个静态实例变量即可)。...* * * 3.3 对比 GCD 与 NSOperationQueue 最后,借用 大佬的一张图来对比一下 GCD 与 NSOperationQueue: [lxl9s5kv34.png] 简单的任务使用
中可以使用同步实现) 1.3 NSOperation 与 NSOperationQueue NSOperation 需要和 NSOperationQueue 配合使用来实现多线程方案。...NSOperation 的使用步骤 NSOperation 和 NSOperationQueue 实现多线程的步骤: ① 创建操作:先将需要执行的操作封装到一个 NSOperation 对象中; ②...创建队列:创建一个 NSOperationQueue 对象; ③ 添加操作到队列中:然后将 NSOperation 对象添加到 NSOperationQueue 队列中。...系统会自动将 NSOperationQueue 中的 NSOperation 取出来,将取出的 NSOperation 封装的操作放到一条新线程上执行。...如果不想使用 NSOperationQueue,可以通过调用 NSOperation 对象的start方法来自己执行操作。
GCD的使用(重点) GCD的全称是Grand Central Dispatch,是纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的...的使用就2个步骤 定制任务 确定想做的事情 将任务添加到队列中 GCD会自动将队列中的任务取出,放到对应的线程中执行 任务的取出遵循队列的FIFO原则:先进先出,后进后出 3.2 GCD的创建 队列的创建...NSOperation的使用(重点) NSOperation 是苹果公司对 GCD 的封装,完全面向对象,并比GCD多了一些更简单实用的功能,所以使用起来更加方便易于理解。...4.2 NSOperationQueue的使用 NSOperation中的两种队列 主队列:通过mainQueue获得,凡是放到主队列中的任务都将在主线程执行 非主队列:直接alloc init出来的队列...非主队列同时具备了并发和串行的功能,通过设置最大并发数属性来控制任务是并发执行还是串行执行 NSOperationQueue的作用 NSOperation可以调用start方法来执行任务,但默认是同步执行的
本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,...iOS多线程——RunLoop与GCD、AutoreleasePool NSOperation&&NSOperationQueue的使用姿势全解 经过前面的学习,讲解了最基础的NSThread使用方法,...和NSOperationQueue这一面向对象的多线程类,这两个类与GCD提供的功能类似,NSOperation提供任务的封装,NSOperationQueue顾名思义,提供执行队列,可以自动实现多核并行计算...; 可以发现,创建任务真的很简单,就像GCD中创建任务一样简洁,任务创建完成就可以创建队列了。...NSOperationQueue *mainQueue; 上述属性中比较重要的就是maxConcurrentOperationCount,该属性直接决定了队列是串行的还是并发的,接下来看一个栗子: -
文中 Demo 我已放在了 Github 上,Demo 链接:传送门 1....实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。...那么,GCD 中的一些概念同样适用于 NSOperation、NSOperationQueue。...操作(Operation): 执行操作的意思,换句话说就是你在线程中执行的那段代码。 在 GCD 中是放在 block 中的。...不同于 GCD 中的调度队列 FIFO(先进先出)的原则。
其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的,今天就做一个小的demo来详细的了解一下iOS中的多线程的东西。...3、Block操作按钮是用Block创建操作,并在操作队列中执行,下面的是Invocation操作 4、serial是GCD中的串行队列,concurrent是GCD中的并行队列 好啦,上面的咸蛋先到这儿...一、准备阶段 1.不管使用代码写,还是storyboard或者xib等,先把上面所需的控件初始化好以便使用 2.点击测试UI按钮,改变下边label的颜色的代码如下: 1 //改变...GCD的串行队列开始执行的顺序如下,下面是是在一个线程中按FIFO的顺序执行的: ? GCD中的并行队列,是在不同的线程中同时执行的: ? ...今天博客中的内容还是蛮多的,如果之前接触过Java的多线程的东西,或者其他语言中的多线程的话,理解起来应该问题不大。
在项目中,用GCD的时候非常多,但是我最近脑子里一直在问自己一个问题,死锁是什么。惭愧的是这个当初清晰的概念现在愈加模糊,考虑到自己并没有专门整理过死锁的文章,所以写一篇技术文章来帮助自己梳理概念。...GCD提供了功能强大的任务和队列控制功能,相比于NSOperationQueue更加底层,因此如果不注意也会导致死锁。 所谓死锁,通常指有两个线程A和B都卡住了,并等待对方完成某些操作。...串行与并行 在使用GCD的时候,我们会把需要处理的任务放到Block中,然后将任务追加到相应的队列里面,这个队列,叫做Dispatch Queue。...死锁的具体案例 接下来所有的案例代码,我都会用Swift3的语言重写一遍,为了帮助自己加深对Swift3的语言的理解。...总结 在总结完这些GCD死锁的情况的以后,我觉得脑子里关于GCD中死锁的概念也逐渐清晰了。以后在项目中也会运用的时候也会更加注意。
swift static与class关键字的区别 逃逸闭包与普通闭包区别 iOS 多线程GCD async与sync的区别 iOS 3张图片下载完了之后合并一张图 设计一个缓存机制(底层数据结构是什么样子的...区别 在什么时机加载(没答上来) oc与swift语言区别 tableview做了哪些优化 如何实现多个图片下载后合成一张图片 除了gcd group之外 其他方法 信号量与锁的区别 mvc和mvvm的区别...第三题:手写代码 1、使用递归,计算从1加到100的值 2、使用递归,计算从 n 加到 m的值 (n < m) 3、使用递归,计算从 n,n+t, n+2t, .... n+ mt 的值 (m >=1)...二面(4月2日) 问了很多问题,大概记得的就是: 手写LRU、股票算法题 MVVM与MVC的比较 UItableView的性能调优 Auto layout的原理 GCD与NSoperationqueue...hr面(4月7日) hr 一些常规问题,然后这个hr小姐姐好像还懂点技术,就追着我的简历不放,要我复盘项目,还要讲下技术方面的点。 虎牙 三面+hr面 都是电话面试,比较容易然后就忘记写记录了。
在网络请求的开发中,经常会遇到两种情况,一种是我在一个界面需要同时请求多种数据,比如列表数据、广告数据等,全部请求到后再一起刷新界面。...GCD信号量 信号量是一个整数,在创建的时候会有一个初始值,这个初始值往往代表我要控制的同时操作的并发数。在操作中,对信号量会有两种操作:信号通知与等待。...说完概念,我们来看看GCD中的三个信号量操作: dispatch_semaphore_create:创建一个信号量(semaphore) dispatch_semaphore_signal:信号通知,即让信号量...线程依赖用GCD做比较麻烦,建议用NSOperationQueue做,可以更加方便的设置任务之间的依赖。...要解决这个问题,还是用信号量来控制,其实是一个道理,代码也是一样的,在一个任务操作中: dispatch_semaphore_t sema = dispatch_semaphore_create(0);
一、简介 NSOperation 的作用 NSOperation 是对 GCD 的一层封装,更加面向对象。...配合使用 NSOperation 和 NSOperationQueue 也能实现多线程编程。...中 系统会自动将 NSOperationQueue 中的 NSOperation 取出来 将取出的 NSOperation 封装的操作放到一条新线程中执行 二、NSOperation 的子类 NSOperation...的使用 NSOperationQueue的作用 NSOperationQueue 可以调用 start 方法来执行任务,但默认是同步执行 如果将 NSOperation 添加到 NSOperationQueue...(操作队列)中,系统会自动异步执行 NSOperation 中的操作 添加操作到 NSOperationQueue 中 -(void)addOperation:(NSOperation *)op; -(
实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。...那么,GCD 中的一些概念同样适用于 NSOperation、NSOperationQueue。...操作(Operation): 执行操作的意思,换句话说就是你在线程中执行的那段代码。 在 GCD 中是放在 block 中的。...不同于 GCD 中的调度队列 FIFO(先进先出)的原则。...当然,我们经常用到的还是添加依赖操作。现在考虑这样的需求,比如说有 A、B 两个操作,其中 A 执行完操作,B 才能执行操作。 如果使用依赖来处理的话,那么就需要让操作 B 依赖于操作 A。
于是,Modern Objective-C开发者有两个选择:GCD和NSOperation. 由于GCD已经发展的比较主流了,我们稍后再说它,先说说面向对象的NSOperation....相对于GCD非常适用于in-line的异步处理,NSOperation提供了更综合的、面向对象的计算模型,非常适用于封装结构化的数据,重复性的任务。...最上面的图片是来自于WWDC2013中的“Hidden Gems in Cocoa and Cocoa Touch”(228)中Mattt讲NSOperation时的截图,这个视频一共有30个tips,...这是第8个tip,大部分的内容我是第一次知道,非常值得看,而且如果有条件的话,建议下载HD版本的视频来看,效果比SD好太多。...字幕文件在我的这个repo里, :) 如有文中有不准确的地方,欢迎留言指正 :) Enjoy!
1、NSoperation是基于GCD封装的 dispatch_async(_Queue, ^{ //请求数据 NSData *data = [NSData dataWithContentURL...2、NSOperationQueue相对于GCD来说有以下优点: 提供了在 GCD 中不那么容易复制的有用特性。...NSOperationQueue 有两种不同类型的队列:主队列和自定义队列。主队列运行在主线程之上,而自定义队列在后台执行。...在两种类型中,这些队列所处理的任务都使用 NSOperation 的子类来表述。...如果你不使用它们默认的 setter 来进行设置的话,你就需要在合适的时候发送合适的 KVO 消息。
领取专属 10元无门槛券
手把手带您无忧上云