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,在你 ...
随机推荐
- js获取height和width总结
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Spring 多数据源事务配置问题
2009-12-22 在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难.最直接的例子就是关于在项目中使用多个数据源的问题,似乎 很难 ...
- sql server @@ROWCOUNT 会被 if 给 清 0
官方说 @@ROWCOUNT 会被以下几种语句清0 原文如下: Statements such as USE, SET <option>, DEALLOCATE CURSOR, CLOS ...
- Solr删除managedschema
一.创建solr核心 solr createcore 二.删除managedschema managedschema是solr自动生成的,里面包含大量无用配置. solr是检查用户定义的schema. ...
- Android开发环境——调试器 DDMS相关内容汇总
Android开发环境将分为SDK相关内容.Eclipse ADT相关内容.模拟器AVD相关内容.调试器DDMS相关内容.日志LogCat相关内容.连接驱动ADB相关内容.内存泄露检测工具MAT ...
- apache kafka系列之Producer处理逻辑
最近研究producer的负载均衡策略,,,,我在librdkafka里边用代码实现了partition 值的轮询方法,,,但是在现场验证时,他的负载均衡不起作用,,,所以来找找原因: 下文是一篇描 ...
- Asynchronous and non-Blocking I/O 翻译[收藏好文]
http://www.tornadoweb.org/en/stable/guide/async.html Real-time web features require a long-lived mos ...
- 原创工具binlog2sql:从MySQL binlog得到你要的SQL
从MySQL binlog得到你要的SQL.根据不同设置,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 用途 数据回滚 主从切换后数据不一致的修复 从binlog生成标准SQL ...
- Tomcat 6 部署工程总结,使用JNDI数据源配置
工程需要用JNDI数据源方式部署到tomcat,参考网上文章后,经过配置测试,摸索出来了. 环境说明: 数据库:Oracle9i Web服务器:tomcat-6.0.33 tomcat启动方式 ...
- 【Visual Studio】Visual C# 中XML注释的使用(含注释在开发时显示换行)
为函数方法注释说明要用到 xml 语句 <summary> 段落说明 </summary> .<para> 新段示例说明 </para>.<par ...