(GeekBand)iOS实战进阶开发第三周

NSOperation

NSOperation是一个抽象基类 也就是说不能直接alloc int一个实例

NSOperation中的任务定义中最重要的一件事就是 覆盖main方法 提供实际执行的代码 同时 并不需要担心main方法的内存释放问题 因为main方法会在NSoperation提供的AutoreleasePool中运行

NSOperation创建的方法
1

.-initWithTarget:selector:object:
-initWithInvocation:(NSInvocation)

第二种创建适用于反复调用Operation的情况

2.NSBlockOperation创建

+blockOperationWithBlock

Block创建以后 Operation可以追加 也就是说可以执行多个Block

-(void)addExecutionBlock

NSOperation依赖关系
Operation可以通过依赖关系来执行

-(void)addDependency:(NSOperation *)dep
也就是说需要当dep执行完毕以后Operation才可以执行 需要注意的是 不能写出A依赖B B依赖A的环形依赖

NSOperation各种状态

.name
.ready
.executing .finished .cancelled
.asynchronous(默认是no)
-setCompletionBlock:(^(void))/copy/

GCD

首先需要知道是GCD是一个C语言的API 但是返回的是Obj-c的对象 同时也支持ARC

GCD中三种不同的Queue
1.Serial(串行队列)
任务可以一个个依次执行
2.ConCurrent(并行队列)
任务同时执行
3.Main Queue(主队列)
在Main Queue中更新界面之类

获取Queue
1.获取系统预定义的Queue
->Global Concurrent Queue(获取一个全局的并行队列)

dispatch_get_global_queue(id,0);
其中id表示identifier 0表示flags 一般flags为0
id用来决定Queue所在的线程的优先级

USER_INTERACTIVE(和用户交互 优先级较高)
USER_INITIATED(由用户发起例如下载 优先级高)
USER_UTILITY(程序内部执行 优先级低)
USER_BACKGROUND(数据清理之类 优先级较低)

->Main Queue(串行队列)有且只有一个
dispatch_get_main_queue();用来处理界面响应之类的操作
2.自己创建一个Queue
注意:自己创建queue只能创建串行队列

->dispatch_queue_create(“myQueue”,null);
“myQueue”为queue的名字 自己可以创建 同时是一个C语言的字符串

自己创建的Queue中常见操作
1.dispatch_suspend() 暂停
2.dispatch_resume()继续
3.dispatch_set_finalizer_f(fund/block)清理

Queue分发任务
->dispatch_sync(q,block)
->dispatch_async(q,block)
两者区别在于会不会阻塞当前线程 知道block中的任务执行完毕 如果是同步sync操作 会阻塞当前线程并等待block的任务执行完毕然后再运行当前线程 如果是异步async操作 当前想成会直接往下执行 它不会阻塞当前线程

粗略的理解成生活常见模型的话 sync相当于储蓄卡 存了钱才能用刷卡 async理解成 信用卡 虽然没有钱了 但是还能刷卡

dispatch_queue_sync容易造成死锁 所谓的死锁就是线程卡死 来看个例子

NSLog(“开始 - %@", NSThread.currentThread())
dispatch_sync(dispatch_get_main_queue(), { () -> Void in 
        NSLog("sync - %@", NSThread.currentThread())
})
NSLog(“结束- %@", NSThread.currentThread())

这段代码 只会打印一句 开始 后面的啥也不会有了 原因就是sync造成了死锁现象
同步任务会阻塞当前线程 然后将block里的代码放到指定的队列中执行 只有等待block里的代码执行完毕了 才会继续往下执行该线程 上述代码中 打印完第一句开始之后sync立即阻塞主线程 然后block中的NSLog放到main_queue中 但是main_queue中的任务会被取出来放到主线程里执行 但是主线程已经被阻塞了 所以block中的代码不会执行 dispatch_sync就会一直阻塞线程 就造成了死锁现象

用生活中的模型来说的话就是 男女朋友因为了一点事吵架了 但是男生不愿意和女生道歉 女生再等男生道歉 两个人怄气了。。就 差不多是这样吧 。。稍微有点举例不当 各位看官勿喷。。

你可能感兴趣的:((GeekBand)iOS实战进阶开发第三周)