iOS多线程编程之NSOperation
2016-04-12 16:57
483 查看
多线程编程之NSOperation类
一、 基本了解
1、 NSOperation类是一个抽象类(不能直接使用),其子类有NSBlockOperation和NSInvocationOperation,(swift中取消,因为不安全)及自定义NSOperation的子类(继承是需要实现其Main方法)
2、 NSOperation 和NSOperationQueue 分别对应 GCD 的任务 和 队列
二、 操作步骤
1、 创建NSOperation同时将要执行的任务封装到一个 NSOperation 对象中。
2、 将此任务添加到一个 NSOperationQueue 对象中(开始时需要创建一个队列)。
3、 NSOperationQueue自动取出队列中任务对象,放在线程中执行
注意:
a、当Operation有多个任务时回自动分配对个线程并发执行,只有一个任务则会在主线程同步执行。
b、添加到队列中任务将自动异步执行
扩展:
a、通过使用Operation的addExcutionBlock方法可以添加多个任务
b、可以使用OperationQueue的addOperationWithBlock{block}直接将Block添加到队列
c、OperationQueue对象中有一个参数:MaxConcurrentOperationCount可以设置最大并发数(如果需要串行,设置为1即可)
三、 NSOperation操作依赖
依赖:当前一个操作执行之后,后一个操作才能执行。如获打开文件与读写文件。
实现:在创建好的Operation对象中使用addDependency(后一个操作)方法即可。
示例代码:
//创建队列
let queue =NSOperationQueue()
let operationA =NSBlockOperation { () -> Void in
print("printA")
}
let operationB =NSBlockOperation { () -> Void in
print("printB")
}
let operationC =NSBlockOperation { () -> Void in
print("print C")
}
///先完成依赖
//B等A执行完才执行
operationB.addDependency(operationA)
//C等B执行完才执行
operationC.addDependency(operationB)
//在将任务添加到队列中
queue.addOperation(operationA)
queue.addOperation(operationB)
queue.addOperation(operationC)
注意:不要设置循环依赖或者死等依赖
四、 NSOperation操作调用(函数)
可以在一个任务操作中调用另一个操作,使用ConpletionBlock
示例代码如下:
//创建队列
let queue =NSOperationQueue()
let operation =NSBlockOperation { () -> Void in
print("printA")
}
operation.completionBlock = doSomething
queue.addOperation(operation)
}
func doSomething(){
print("doSomething")
}
五、 线程通信
在子线程中嵌套主线程()即可
示例代码:
/创建队列
let queue =NSOperationQueue()
queue.addOperationWithBlock { () -> Void in
print("子线程 \(NSThread.currentThread())")
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
print("主线程 \(NSThread.currentThread())")
})
}
问题:swift中有抽象类吗?NSOperation在swift中是抽象类吗?
详细内容参考:swift多线程NSOperation使用
简书-关于IOS多线程,你看我就够了
实例:推酷-在Swift中使用NSOperation和NSOperationQueue
一、 基本了解
1、 NSOperation类是一个抽象类(不能直接使用),其子类有NSBlockOperation和NSInvocationOperation,(swift中取消,因为不安全)及自定义NSOperation的子类(继承是需要实现其Main方法)
2、 NSOperation 和NSOperationQueue 分别对应 GCD 的任务 和 队列
二、 操作步骤
1、 创建NSOperation同时将要执行的任务封装到一个 NSOperation 对象中。
2、 将此任务添加到一个 NSOperationQueue 对象中(开始时需要创建一个队列)。
3、 NSOperationQueue自动取出队列中任务对象,放在线程中执行
注意:
a、当Operation有多个任务时回自动分配对个线程并发执行,只有一个任务则会在主线程同步执行。
b、添加到队列中任务将自动异步执行
扩展:
a、通过使用Operation的addExcutionBlock方法可以添加多个任务
b、可以使用OperationQueue的addOperationWithBlock{block}直接将Block添加到队列
c、OperationQueue对象中有一个参数:MaxConcurrentOperationCount可以设置最大并发数(如果需要串行,设置为1即可)
三、 NSOperation操作依赖
依赖:当前一个操作执行之后,后一个操作才能执行。如获打开文件与读写文件。
实现:在创建好的Operation对象中使用addDependency(后一个操作)方法即可。
示例代码:
//创建队列
let queue =NSOperationQueue()
let operationA =NSBlockOperation { () -> Void in
print("printA")
}
let operationB =NSBlockOperation { () -> Void in
print("printB")
}
let operationC =NSBlockOperation { () -> Void in
print("print C")
}
///先完成依赖
//B等A执行完才执行
operationB.addDependency(operationA)
//C等B执行完才执行
operationC.addDependency(operationB)
//在将任务添加到队列中
queue.addOperation(operationA)
queue.addOperation(operationB)
queue.addOperation(operationC)
注意:不要设置循环依赖或者死等依赖
四、 NSOperation操作调用(函数)
可以在一个任务操作中调用另一个操作,使用ConpletionBlock
示例代码如下:
//创建队列
let queue =NSOperationQueue()
let operation =NSBlockOperation { () -> Void in
print("printA")
}
operation.completionBlock = doSomething
queue.addOperation(operation)
}
func doSomething(){
print("doSomething")
}
五、 线程通信
在子线程中嵌套主线程()即可
示例代码:
/创建队列
let queue =NSOperationQueue()
queue.addOperationWithBlock { () -> Void in
print("子线程 \(NSThread.currentThread())")
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
print("主线程 \(NSThread.currentThread())")
})
}
问题:swift中有抽象类吗?NSOperation在swift中是抽象类吗?
详细内容参考:swift多线程NSOperation使用
简书-关于IOS多线程,你看我就够了
实例:推酷-在Swift中使用NSOperation和NSOperationQueue
相关文章推荐
- iOS开发之百度地图大头针的自定义解决方法
- iOS中的initialize与load两个类方法简单理解
- ios开发常用的技巧
- IOS-日期处理
- iOS之轻松上手block(下)
- iOS之轻松上手block(上)
- iOS开发:coredata的简单使用
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- ios视频保存Error Domain未知错误
- iOS自动生成对应大小的icon图片代码
- iOS设计模式-适配器
- iOS设计模式-适配器
- CAGradientLayer颜色渐变
- iOS设计模式-适配器
- iOS 图片剪切和压缩的几个方法
- ios键盘在popViewControllerAnimated 时又弹起
- iOS tableView刷新选中cell数据
- 2016年最新苹果开发者账号注册申请流程最强详解!
- iOS学习笔记20-地图(二)MapKit框架
- iOS学习笔记20-地图(二)MapKit框架