//Cocoa 中封装了 NSThread, NSOperation, GCD 三种多线程编程方式,他们各有所长。
//
//NSThread
//
//NSThread 是一个控制线程执行的对象,通过它我们可以方便的得到一个线程并控制它。NSThread 的线程之间的并发控制,是需要我们自己来控制的,可以通过 NSCondition 实现。
//它的缺点是需要自己维护线程的生命周期和线程的同步和互斥等,优点是轻量,灵活。
//
//NSOperation
//
//相比于gcd,它更好地控制和处理大量的并发操作
//
//NSOperation 封装了需要的代码,NSOperation是抽象基类,一般我们使用系统提供的子类或者自定义子类来继承它
//
//
////1、创建一个系统提供的nsoperation
//let myoperation = BlockOperation { () ->Void in
// //操作
// print("操作")
//}
////2、创建一个nsoperationqueue,并添加nsoperation,这样nsoperation对象就会执行
////OperationQueue().addOperation(myoperation)
//
////3、不使用nsoperationqueue执行,,也可这样执行,不过这个操作时同步的,一般不推荐这种方法,一般用与nsoperationqueue相结合使用的方法
//myoperation.start()
//
//myoperation.cancel()//取消操作
//
////4、nsoperation回调
//
//myoperation.completionBlock = {
// print("完成")
//
//}
//第1步:将一个操作封装到NSOperation对象中
//第2步:将NSOperation对象放入NSOperationQueue队列
//第3步:NSOperationQueue自动取出队列中的NSOperation对象放到一条线程中执行
//创建队列
let queue = OperationQueue()
//设置最大并发数
queue.maxConcurrentOperationCount=2
//创建operation
let operation = BlockOperation.init {
print("doSomething1 (Thread.current)")
}
let operation2=BlockOperation.init {
print("doSomething4 (Thread.current)")
}
//添加到队列中的operation将自动异步执行
queue.addOperation(operation)
queue.addOperation(operation2)
////当operation有多个任务的时候会自动分配多个线程并发执行,
////如果只有一个任务,会自动在主线程同步执行
//**************//还有一种方式,直接将operation的blcok直接加入到>队列
queue.addOperation{
print("doSomething5 (Thread.current)")
}
queue.addOperation{
print("doSomething6 (Thread.current)")
}
queue.addOperation{
print("doSomething7 (Thread.current)")
}
queue.addOperation{
print("doSomething8 (Thread.current)")
}
//========== 2.NSOperation操作依赖,可设置一个操作在另一个操作完成后在执行
//创建队列
let queue1 = OperationQueue.init()
let operationA = BlockOperation.init
{
print("print A")
}
let operationB = BlockOperation.init
{
print("print B")
}
let operationC = BlockOperation.init
{
print("print C")
}
//A等B执行完才执行
operationA.addDependency(operationB)
//C等B执行完才执行
operationC.addDependency(operationB)
queue1.addOperation(operationA)
queue1.addOperation(operationB)
queue1.addOperation(operationC)
//=========== // 3.NSOperation操作监听,一个操作完成后调用另一个操作:==========
func operationCompletion(){
//创建队列
let queue2 = OperationQueue()
let operation = BlockOperation.init {
print("liugaohui (Thread.current)")
}
operation.completionBlock = doSomething
queue.addOperation(operation)
}
func doSomething(){
print("doSomething")
}
operationCompletion()
// ========= 4.NSOperation线程通信
NSOperationQueue.mainQueue。
let queue4 = OperationQueue.init()
queue4.addOperation { () -> Void in
print("子线程 (Thread.current)")
OperationQueue.main.addOperation({
print("主线程 (Thread.current)")
})
}