swift的通知中心Name变成了一个NSNotification下面的一个结构体,一般我们使用时,直接进行操作就行
NotificationCenter.default.post(name: NSNotification.Name("namechenge"), object: <#T##Any?#>, userInfo: <#T##[AnyHashable : Any]?#>)
但是,这种通过字符串去拼写进行多处使用时,容易拼写错误,这种情况我们最好使用枚举或者全局变量来避免这种bug的发生。之前我是直接按照系统的方式来进行拓展的
extension Notification.Name {
static let DidResume = Notification.Name(rawValue: "org.alamofire.notification.name.task.didResume")
}
使用时是这样的
Notification.Name.DidResume
下面是Alamofire的拓展方式
extension Notification.Name {
public struct Task {
public static let DidResume = Notification.Name(rawValue: "org.alamofire.notification.name.task.didResume")
}
}
使用时是这样的
Notification.Name.Task.DidResume
根据对比,使用Alamofire的方式时,我们很清楚Notification.Name是属于哪个类型下的,容易区分
~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~
下面是使用reactivecocoa框架时,我们可以更方便的使用通知中心,而且我们也不需要在deinit里面去remove观察者,因为rac里面已经进行了deinit处理
NotificationCenter.default.reactive.notifications(forName: Notification.Name.UIApplicationDidEnterBackground)
.take(during: reactive.lifetime)
.observeValues { noti in
print(noti)
}
有这种情况下虽然不需要我们在deinit移除对应的观察者,但是有时我们需要在viewWillAppear里面添加观察者,以及在viewDidDisappear里面移除观察者,这种情况就需要用到上面的函数的返回值Disposable.
var disposable: Disposable?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
disposable = NotificationCenter.default.reactive.notifications(forName: Notification.Name.UIApplicationDidEnterBackground)
.observeValues { noti in
print(noti)
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
disposable?.dispose()
disposable = nil
}
使用Disposable可以很方便的按照需求进行观察着的添加移除。
当然,我们可以写个NSObject的extension,可以让上面的这种代码更简洁
extension NSObject {
@discardableResult
func addObserve(for name: Notification.Name?, object sender: AnyObject? = nil, result: ((Notification) -> Void)?) -> Disposable? {
return NotificationCenter.default.reactive.notifications(forName: name, object: sender)
.take(during: reactive.lifetime)
.observeValues({ noti in
result?(noti)
})
}
func post(for name: Notification.Name, info: [AnyHashable : Any]? = nil) {
NotificationCenter.default.post(name: name, object: self, userInfo: info)
}
}