Notification

简介:

关于Swift的Notification网上已经很很多资料了,下面要介绍的方式是基于枚举和命名空间的方式实现的。

实现:

enum ZYNotification: String {
    case userLogin
    case userLogout
}
extension ZYNotification {
    var stringValue: String {
        return "ZY" + rawValue
    }
    var notificationName: NSNotification.Name {
        return NSNotification.Name(stringValue)
    }
}

首先定义了一个枚举,接着在extension中定义了一个类型是NSNotification.Name的计算属性,后续我们会在通知中用到这个属性。

extension NotificationCenter: ZYCompatible{}

extension ZY where Base: NotificationCenter {
    func post(name aName: ZYNotification, object anObject: Any? = nil, userInfo aUserInfo: [AnyHashable : Any]? = nil) {
        base.post(name: aName.notificationName, object: anObject, userInfo: aUserInfo)
    }
    
    func addObserver(_ observer: Any, selector aSelector: Selector, name aName: ZYNotification, object anObject: Any? = nil) {
        base.addObserver(observer, selector: aSelector, name: aName.notificationName, object: anObject)
    }
    
func removeObserver(_ observer: Any, name aName: ZYNotification, object anObject: Any? = nil) {
        base.removeObserver(observer, name: aName.notificationName, object: anObject)
    }
}

首先给NotificationCenter添加命名空间,关于命名空间介绍可以看我这里的文章,接着“重写”NotificationCenter的实例方法,就可以像调用系统原生的方法那样调用我们自己实现的方式了。

示例:

 NotificationCenter.default.zy.addObserver(self, selector: #selector(userLogin), name: .userLogin)

查考资料:

Kingfisher
Swift中Notification.Name这么难用怎么办

你可能感兴趣的:(Notification)