之前发送通知是这样的:
NSNotificationCenter.defaultCenter().post("NSNotificationString")
在swift3中改成了Notification.Name
extension NSNotification {
public struct Name : RawRepresentable, Equatable, Hashable, Comparable {
public init(_ rawValue: String)
public init(rawValue: String)
}
}
使用起来感觉更麻烦了,如下:
NotificationCenter.default.post(Notification.Name(rawValue: "NSNotificationString"))
为了使用方便在很长一段时间我都是通过extension声明一个静态的常量来使用的:
extension Notification.Name {
static let TestNotificationString = Notification.Name("NSNotificationString")
}
// 发送通知
NotificationCenter.default.post(.TestNotificationString)
但是这种方式不能有效的避免命名重复问题,如果命名不规范还是存在潜在的风险。所以感谢网友的点子,通过枚举来实现,规避掉命名的冲突。
enum DHNotification: String {
case userLogout
case userLogin
var stringValue: String {
return "DH" + rawValue
}
var notificationName: NSNotification.Name {
return NSNotification.Name(stringValue)
}
}
使用起来就简单了,实现一个扩展方法:
extension NotificationCenter {
static func post(customeNotification name: DHNotification, object: Any? = nil){
NotificationCenter.default.post(name: name.notificationName, object: object)
}
}
使用方法如下:
NotificationCenter.post(customeNotification: .userLogin)
这样是不是很简单明了。
处理通知就使用RxSwift的方式实现,也需要扩展一下:
extension Reactive where Base: NotificationCenter {
func notification(custom name: DHNotification, object: AnyObject? = nil) -> Observable<Notification> {
return notification(name.notificationName, object: object)
}
}
使用如下:
NotificationCenter.default.rx.notification(custom: .userLogin).subscribe(onNext: { (value) in
print(value)
TipsView.shared.showTips(info: "收到通知")
}).disposed(by: dispose)
NotificationCenter.post(customeNotification: .userLogin)
打印的信息如下:
“name = DHuserLogin, object = nil, userInfo = nil”
网友评论