KVO简述
KVO,即Key-Value Observing,它提供了一种机制,当指定的对象的属性被修改后(通过setValue:forKey的方式修改),则对象就会接受到通知。简单来说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
比如:用B类观察A类的一个属性,当A类的属性通过setValue:forKey:的方式修改时,B类就会接受到通知,调用
func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)
特别注意:当KVO和多线程用在一起的时候
当setValue:forKey:在子线程被调用时,
func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)
会在子线程中被调用。
之前项目中遇到的坑
之前在项目中引入DouAudioStreamer类用于播放语音,通过KVO的方式监听了status属性,当status属性变成Finished的时候,在回调方法中发送通知,cell接受到通知,停止播放语音动画。
DouAudioStreamer在子线程中修改了status属性,所以回调方法也是在子线程中被调用的,通知是在子线程发出的,接收到通知时调用的方法也是在子线程中被调用的,所以需要在调用的方法中回到主线程来调用停止播放动画的方法才能停止播放动画。
网友评论