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这么难用怎么办的更多相关文章
- 在Swift中应用Grand Central Dispatch(下)
在第一部分中, 你学到了并发,线程以及GCD的工作原理.通过使用dispatch_barrrier和dispatch_sync,你做到了让 PhotoManager单例在读写照片时是线程安全的.除此之 ...
- Swift中编写单例的正确方式
在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的.一个状态管理的例子大家都很熟悉,那就是单例.使用Swift时,有许多方法实现单例,这是个麻烦事,因为我们不知道哪个最合适.这里我们来回顾一下单例 ...
- Swift中的Weak Strong Dance
亲爱的博客园的关注着博主文章的朋友们告诉你们一个很不幸的消息哦, 这篇文章将会是博主在博客园发表的最后一篇文章咯, 因为之后的文章博主只会发布到这里哦 http://daiweilai.github. ...
- Swift 中枚举
Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [AP ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON
项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- 在Swift中实现单例方法
在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...
- [翻译]理解Swift中的Optional
原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...
随机推荐
- Delphi2010怎样获取程序内部自身版本?
用原来的GetFileVersionInfo仅仅能获取Delpi7的程序版本,用在Delphi2010中就无论用了 //------ 获取文件版本 function F_GetFileVersion( ...
- 【TP3.2+Oracle】数据进行分页
1.写在前面:mysql的分页 通过limit 关键字进行处理, oracle却没有limit,而是用ROWNUM 字段来进行分页 2.参考示例,TP3.2 代码,其实原理看懂了 其他框架和原生都可以 ...
- spring事务——try{...}catch{...}中事务不回滚的几种处理方式
当希望在某个方法中添加事务时,我们常常在方法头上添加@Transactional注解 @ResponseBody @RequestMapping(value = "/payment" ...
- permission denied (publickey)问题的解决 和 向github添加ssh key
使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...
- 【MySQL】MySQL存储过程介绍
目录结构: contents structure [-] 存储过程简介 关于MySQL的存储过程 MySQL存储过程的创建 格式 声明分割符 参数 变量 注释 MySQL存储过程的调用 MySQL存储 ...
- 【java】详解集合
目录结构: contents structure [-] 集合概述 什么是集合 Collection和Map的区别 List和Set的区别 ArrayList和LinkedList的区别 HashSe ...
- Block(一)基础-b
一.概述 Block是C级别的语法和运行时特性.Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存.堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block ...
- class-dump在osx 10.11以后安装方法
当Mac升级了OSX 10.11后,配置class-dump的时候,会发现逆向书上推荐的class-dump存放目录/usr/bin,class-dump存放不进去,尝试过用sudo 还是不被允许 ...
- RemoteDesktopManager 简单使用说明
最近项目需要在多台window系统上,安装应用,没错,是window orz..没有了secureCRT putty等好用的窗体工具,真的挺难受的. 爱折腾的博主,百度了下,发现RemoteDeskt ...
- OPENSSL编程起步
原文链接: http://blog.csdn.net/itmes/article/details/7711076 WINDOWS平台下OPENSSL的编译和安装使用 OPENSSL是开放源代码的,可以 ...