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

Posted Cocoa开发者社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift中Notification.Name这么难用怎么办相关的知识,希望对你有一定的参考价值。

以前的发送通知的参数就是一个简单的字符串:


NSNotificationCenter.defaultCenter().post("someStringThatShouldBeDeclared")


后来到了swift 3 中,改成了Notification.Name。定义在Notification的命名空间下,是一个结构体,初始化函数接收一个字符串。


extension NSNotification {

    public struct Name : RawRepresentable, Equatable, Hashable, Comparable {


        public init(_ rawValue: String)


        public init(rawValue: String)

    }

}


用起来就麻烦了一点:


NotificationCenter.default.post(Notification.Name(rawValue: "MyNotificationName"))


如果还是按照以前的方式定义一个全局字符串常量就没有好好领会Swift精神了。


至少需要这样,通过extension声明一个静态的常量:


extension Notification.Name {

    static let AccountBalanceUpdated = Notification.Name("accountBalanceUpdated")

}

 

// invocation

NotificationCenter.default.post(.AccountBalanceUpdated)


但是这种方式有一个小缺点,自定义的通知和系统的混在了一起,有时找起来比较尴尬。



这里其实也有另外一个问题,这种方式不能避免通知的名字重复。虽然如果命名规范不会有这样的问题,但是到底是个潜在的风险。


如果把上面两个问题合起来看,就有了另外一种方式:利用Enum。


先声明一个rawValue为字符串的枚举。为了规避命名的冲突,声明一个计算属性,在每个值的rawValue前插入一个字符串。再用这个字符串去生成NSNotification.Name:


enum CPNotification: String {

    case userLogout

    case userLogin

    

    var stringValue: String {

        return "CP" + rawValue

    }

    

    var notificationName: NSNotification.Name {

        return NSNotification.Name(stringValue)

    }  

}


用起来就简单了,自己写一个扩展方法:


extension NotificationCenter {

    static func post(customeNotification name: CPNotification, object: Any? = nil){

        NotificationCenter.default.post(name: name.notificationName, object: object)

    }

}


这样在使用时,直接点出来的就都是自定义的通知了。


当然在通知处理的地方也写个扩展方法用起来就更爽了,比如我用Rx所以这样写:


extension Reactive where Base: NotificationCenter {

    

    func notification(custom name: CPNotification, object: AnyObject? = nil) -> Observable<Notification> {

       return notification(name.notificationName, object: object)

    }

    

}


用起来就是这样:


       // 发送通知

        NotificationCenter.post(customeNotification: .userLogout)

    

      // 接收通知

       let _ = NotificationCenter.default.rx.notification(custom: .userLogout).subscribe(onNext: { (value) in

            CPNetworkConfig.userID = nil

        })


欢迎在社交网络上关注我:


推特:

微博:


以上是关于Swift中Notification.Name这么难用怎么办的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Swift 编译时间这么慢?

swift 2.0中navigationController中nib的AddSubview(为啥这么难?)

蜂鸟Swift 5到底为什么这么轻?

VOGUE专访霉霉Taylor Swift,雅思口语满分就跟着这么学吧!

Swift vs. Kotlin 漫谈系列之枚举

在 Swift 中同步异步内容