Cocoa Operation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上。相关的类有Operation和OperationQueue。其中Operation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的子类:BlockOperation。创建Operation子类的对象,把对象添加到OperationQueue队列里执行。
使用Operation的两种方式
直接用定义好的子类:BlockOperation。
1 | Thread.detachNewThreadSelector(#selector(ViewController.downloadImage), toTarget: self, with: nil) |
1 | let myThread = Thread(target: self, selector: #selector(ViewController.downloadImage), object: nil) |
1 | func downloadImage() { |
线程同步方法通过锁来实现,每个线程都只用一个锁,这个锁与一个特定的线程关联。下面演示两个线程之间的同步。
1 | //定义两个线程 |
1 | thread2 = Thread(target: self, selector: #selector(ViewController.method2), |
1 | //定义两方法,用于两个线程调用 |
基本思路是,首先要创建公用的NSCondition实例。然后:
消费者取得锁,取产品,如果没有,则wait,这时会释放锁,直到有线程唤醒它去消费产品;
生产者制造产品,首先也是要取得锁,然后生产,再发signal,这样可唤醒wait的消费者。