美文网首页
RxSwift方式实现通知功能

RxSwift方式实现通知功能

作者: 海到尽头天为岸 | 来源:发表于2017-11-01 12:27 被阅读838次

之前发送通知是这样的:

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”

相关文章

网友评论

      本文标题:RxSwift方式实现通知功能

      本文链接:https://www.haomeiwen.com/subject/uqiwpxtx.html