iOS 进阶 第十八天(0423)

0423 - GCD( Grand Central Dispatch)

block复习

iOS 进阶 第十八天(0423)

请问,图中输出结果是多少?为什么?

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

iOS 进阶 第十八天(0423)


GCD的队列和任务

iOS 进阶 第十八天(0423)


使用[NSThread currentThread] 可以在开发中跟踪当前线程
GCD创建异步串行队列

iOS 进阶 第十八天(0423)


GCD创建异步并行队列

iOS 进阶 第十八天(0423)


GCD创建全局队列

iOS 进阶 第十八天(0423)

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


GCD创建主线程队列

iOS 进阶 第十八天(0423)


GCD的同步任务都在在哪个线程执行要看此方法是在主线程中调还是在子线程中调,在哪调就再哪个线程上,在开发中极少用.但面试可能会问

注意:在非ARC开发中,即在MRC开发中,一定不要忘记GCD的release.如下图所示:

iOS 进阶 第十八天(0423)


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


NSOperation & NSOperationQueue

iOS 进阶 第十八天(0423)


NSBlockOperation的创建

iOS 进阶 第十八天(0423)


NSInvocationOperation的创建

iOS 进阶 第十八天(0423)


NSBlockOperation线程间的相互依赖达到线程串行队列执行

线程串行执行有两个方法可以达到:

1、使用GCD的串行队列

2、使用NSBlockOperation线程间的相互依赖addDependency

注意:上面两个方法的区别是1中只开启一个子线程去串行执行,而2中可能会开启多个具体几个不确定但不会开太多

NSBlockOperation线程相互依赖代码如下图所示:

iOS 进阶 第十八天(0423)

iOS 进阶 第十八天(0423)

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

iOS 进阶 第十八天(0423)


单例的实现

代码如下:

iOS 进阶 第十八天(0423)

iOS 进阶 第十八天(0423)

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

iOS 进阶 第十八天(0423)

再如:

iOS 进阶 第十八天(0423)


NDObject多线程方法

iOS 进阶 第十八天(0423)

iOS 进阶 第十八天(0423)

例子:

iOS 进阶 第十八天(0423)

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

NSThread的坏处

iOS 进阶 第十八天(0423)

iOS 进阶 第十八天(0423)


下面的代码很巧妙

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

iOS 进阶 第十八天(0423)


上一篇:expect 安装 salt 客户端


下一篇:【NodeJS】http-server.cmd