- block 方式实现通知
- block和方法区别, block没有observe,因此不能使用observe调用performSelector
- block 方式由于传递的是函数(block), 因此添加观察者就会被调用, 不会受dealloc 影响
- post 实际上就开始同步调用响应observer的方法,因此 post所在的线程和接受者是一致的
class YxNotificationCenter {
static let `default` = YxNotificationCenter()
var map: [String: Any] = [:]
func post(name: String , object: Any? ) {
// 同步调用观察者方法, 因此没有指定线程的情况下 是在同一线程
let fc = map[name] as! ()->Void
// 指定线程
// let queue = OperationQueue();
//
// queue.addOperation {
// let fc = map[name] as! ()->Void
// }
fc()
}
func addObserver(name: String, object: Any?, queue: OperationQueue?, finish:@escaping ()->Void) {
map.updateValue(finish, forKey: name)
//进阶
// 1. 多个name, 需要用数组接收, 且数组需要使用弱引用
}
}
使用
YxNotificationCenter.default.addObserver(name: "123", object: nil, queue: OperationQueue.main) {
print("123")
}
YxNotificationCenter.default.post(name: "123", object: nil);