iOS 进阶 第十八天(0423)
0423 - GCD( Grand Central Dispatch)
block复习

请问,图中输出结果是多少?为什么?
答:结果是10.因为在定义block的时候,block会把它前面的要用到的变量做一个内存拷贝,然后block执行的时候就从内存拷贝中去取值来使用.就像下面这样:

GCD的队列和任务

GCD的串行队列和C#的Task的
await或者task.ContinueWith相似GCD的并行队列和C#的Task的
Task task = Task.WhenAll(task1, task2, task3);、Parallel相似.C#的Task并行运算请参考重新想象 Windows 8 Store Apps (43) - 多线程之任务: Task 基础, 多任务并行执行, 并行运算GCD全局队列和并行队列效果一样
主线程队列,运行在主线程上.
使用[NSThread currentThread] 可以在开发中跟踪当前线程
GCD创建异步串行队列

GCD创建异步并行队列

GCD创建全局队列

注意:DISPATCH_QUEUE_PRIORITY_DEFAULT这个是队列线程优先级,不要改用默认的.否则可能会产生优先级的反转,即低优先级的线程会阻塞高优先级的线程
GCD创建主线程队列

GCD的同步任务都在在哪个线程执行要看此方法是在主线程中调还是在子线程中调,在哪调就再哪个线程上,在开发中极少用.但面试可能会问
注意:在非ARC开发中,即在MRC开发中,一定不要忘记GCD的release.如下图所示:

注意:在主线程队列中直接执行同步任务会死锁
NSOperation & NSOperationQueue

NSBlockOperation的创建

NSInvocationOperation的创建

NSBlockOperation线程间的相互依赖达到线程串行队列执行
线程串行执行有两个方法可以达到:
1、使用GCD的串行队列
2、使用NSBlockOperation线程间的相互依赖addDependency
注意:上面两个方法的区别是1中只开启一个子线程去串行执行,而2中可能会开启多个具体几个不确定但不会开太多
NSBlockOperation线程相互依赖代码如下图所示:


当然也可以设定NSOperation同时并发的数目.当设定为1的时候只会有一个.当大于1个的时候开启的线程数目是在设定值的周围浮动.如下图所示:

单例的实现
代码如下:


网上也有另一种写法,但存在问题,如下图:

再如:

NDObject多线程方法


例子:

注意:这里的waitUntilDone类似C#中的task.WaitOne(),阻塞主线程.
NSThread的坏处


下面的代码很巧妙
注意:方法内部的临时变量都是存在栈中,oc对象都是存在堆中.栈的大小只有1M,当栈撑满之后 就不行了,栈溢出.因为要把大量变量的创建放在一个autoreleasepool自动释放池中,防止栈溢出.代码如下:

iOS 进阶 第十八天(0423)的更多相关文章
- iOS进阶_地图上定位的标志——大头针
一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大 ...
- iOS进阶指南试读之UI篇
iOS进阶指南试读之UI篇 UI篇 UI是一个iOS开发工程师的基本功.怎么说?UI本质上就是你调用苹果提供给你的API来完成设计师的设计.所以,想提升UI的功力也很简单,没事就看看UIKit里的各个 ...
- iOS 进阶 第十九天(0423)
0427 深复制/浅复制 浅复制:是址引用 深复制:是值拷贝 下面是解释,如下图: 运行时机制runtime 1.表象的就是MPMoviePlayer 2.深层的是 clang -rewrite-ob ...
- iOS进阶读物
不知不觉作为 iOS 开发也有两年多的时间了,记得当初看到 OC 的语法时,愣是被吓了回去,隔了好久才重新耐下心去啃一啃.啃了一阵,觉得大概有了点概念,看到 Cocoa 那么多的 Class,又懵了, ...
- iOS进阶推荐的书目
<Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法>([英]Matt Galloway) 很多面试题有涉及 <IOS数据库应用高级编 ...
- iOS进阶路线以及进阶书籍
第一,熟悉ARC机制:首先要了解ARC的前世今生.假设了解不清楚会导致两种可能,1,一个对象的引用莫名奇异为空.或失效了.这个一般都能在开发阶段及时发现,由于会导致应用异常.2.导致内存溢出:不了解A ...
- iOS进阶之多线程
多线程 注意:iOS关于UI的刷新和添加必须在主线程中操作! pthread的创建方法: pthread_t pthread; //第一个参数 线程指针 //第二个参数 线程的一些属性 //第三个参数 ...
- iOS进阶_三方使用步骤
一.配置环境(:后为在终端输入的命令) 打开终端 查看自己电脑的Ruby环境:gem sources -l 如果环境已经是淘宝镜像了,此时不需要再进行环境的修改. 如果不是,发送gem sources ...
- iOS进阶面试题----Block部分
1 什么是block 对于闭包 (block),有很多定义,其中闭包就是能够读取其它函数内部变量的函数,这个定义即接近本质又较好理解.对于刚接触Block的同学,会觉得有些绕, 因为我们习惯写这样的程 ...
随机推荐
- iOS 8.3 JB ready
Hi, I've been waiting for a very very long time..Now iOS 8.3 is ready. http://www.taig.com/ You guys ...
- PayPal 开发详解(二):开启【自动返回】和【数据传输】
1.使用我们的商家测试帐号登录 sandbox :http://www.sandbox.paypal.com Business帐号登录 2.登录以后点击:[我的paypal]->[用户信息]-& ...
- Rich控件一
Calendar控件 Calendar控件用来在Web页面中显示日历中的可选日期,并显示与特定日期关联的数据. 控件声明代码如下: <asp: Calendar id=" Calend ...
- UITextView如何关闭键盘
UITextField可以响应键盘上的完成按钮,关闭键盘,而UITextView不一样,它的return按钮或者Done按钮执行的是换行功能,不能达到关闭键盘的目的.解决方法有两个:一个是通过捕捉to ...
- CentOS学习笔记--基本命令--文件与目录管理
Linux基本命令--文件与目录管理 本节节选自鸟哥的 Linux 私房菜 -- 基础学习篇目录 第七章.Linux 文件与目录管理 ls(文件与目录的检视) ls命令就是list的缩写,ls可以 ...
- c#高效比对大量图片
比较图片的方法 以前传统的比较方式是遍历图片中的每一个像素,然后进行比对.这样的比对在少量图片的比对上虽然效率低一点,但是也没有什么不好.但是在大量图片比对的时候,过长的反应时间和对服务器比较高的消耗 ...
- scala学习笔记2
一.算术和操作符重载 a + b 是如下方法的简写: a.+(b) 在scala中你可以使用任何符号来为方法命名.比如BigInt类就定义了一个/%的方法,该方法返回一个对偶,对偶的内容是除法操作得到 ...
- IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决办法
IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrl ...
- Autofac的注入和web.config配合
public static void BuildMvcContainer() { var builder = new ContainerBuilder(); var assemblys = AppDo ...
- python的pip和virtualenv使用心得
pip可以很方便的安装.卸载和管理Python的包.virtualenv则可以建立多个独立的虚拟环境,各个环境中拥有自己的python解释器和各自的package包,互不影响.pip和virtuale ...