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)
}
}

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

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

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

extension Reactive where Base: NotificationCenter {
extension NotificationCenter {
static func post(customeNotification name: CPNotification, object: Any? = nil){
NotificationCenter.default.post(name: name.notificationName, object: object)
}
}
  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这么难用怎么办的更多相关文章

  1. 在Swift中应用Grand Central Dispatch(下)

    在第一部分中, 你学到了并发,线程以及GCD的工作原理.通过使用dispatch_barrrier和dispatch_sync,你做到了让 PhotoManager单例在读写照片时是线程安全的.除此之 ...

  2. Swift中编写单例的正确方式

    在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的.一个状态管理的例子大家都很熟悉,那就是单例.使用Swift时,有许多方法实现单例,这是个麻烦事,因为我们不知道哪个最合适.这里我们来回顾一下单例 ...

  3. Swift中的Weak Strong Dance

    亲爱的博客园的关注着博主文章的朋友们告诉你们一个很不幸的消息哦, 这篇文章将会是博主在博客园发表的最后一篇文章咯, 因为之后的文章博主只会发布到这里哦 http://daiweilai.github. ...

  4. Swift 中枚举

    Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [AP ...

  5. swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明

    关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...

  6. 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON

    项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...

  7. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

  8. 在Swift中实现单例方法

    在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...

  9. [翻译]理解Swift中的Optional

    原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...

随机推荐

  1. Cocos2d-x执行时错误:Cocos2d: Get data from file(xxx.xxx) failed!

    取资源图片时遇到执行时错误: Cocos2d: Get data from file(xxx/xxx.xxx) failed! 原因是我加入资源目录的方式不正确,例如以下图,我选择的是在Resourc ...

  2. Tomcat无法访问中文路径的解决办法

    来源于:http://sccassiel.blog.51cto.com/5398709/1141821/ 修改tomcat下的conf/server.xml文件下的 <Connector por ...

  3. (原)PyTorch中使用指定的GPU

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6836568.html PyTorch默认使用从0开始的GPU,如果GPU0正在运行程序,需要指定其他G ...

  4. iOS 批量打包

    如果你曾经试过做多 target 的项目,到了测试人员要测试包的时候,你就会明白什么叫“生不如死”.虽然 Xcode 打包很方便,但是当你机械重复打 N 次包的时候,就会觉得这纯粹是浪费时间的工作.所 ...

  5. memcached全面剖析--3.memcached的删除机制和发展方向

    下面是<memcached全面剖析>的第三部分. 发表日:2008/7/16 作者:前坂徹(Toru Maesaka) 原文链接:http://gihyo.jp/dev/feature/0 ...

  6. Redis学习之路(007)- Redis学习手册(实例代码)

    在之前的博客中已经非常详细的介绍了Redis的各种操作命令.运行机制和服务器初始化参数配置.本篇博客是该系列博客中的最后一篇,在这里将给出基于Redis客户端组件访问并操作Redis服务器的代码示例. ...

  7. 使用java修改图片DPI

    修改以后可以直接用PS打开看效果 全部使用rt下的类,无需下载其他jar包 import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.imag ...

  8. Oracle 12C -- ADR结构

    ADR路径由参数diagnostic_dest参数决定: SQL> show parameter diagnostic_dest NAME TYPE VALUE ---------------- ...

  9. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated

    启动mysql时,报如下警告信息: [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explic ...

  10. jquery获取radio值

    单选组radio: $("input[@type=radio][@checked]").val(); 单选组 radio: $("input[@type=radio]&q ...