最近做的一个项目,有些地方准备用通知来处理,但是原生的通知使用方式着实恶心到了我,准备自己写个,结果看到GitHub上有类似的项目,就对源码研究了下,很简洁,但是把通知的使用方式变的更简洁。
GitHub项目地址: https://github.com/ZeroFengLee/ZRNotify
先说说使用这个框架,对于通知的使用方式会有什么改变
以往的通知使用方式:
// 监测通知
NotificationCenter.default.addObserver(self, selector: #selector(acceptNotify), name: NSNotification.Name(rawValue: "NotifyName"), object: nil)
func acceptNotify(notify: Notification) {
print(notify)
}
// 发送通知
NotificationCenter.default.post(name: Notification.Name(rawValue: "NotifyName"), object: "hello")
使用ZRNotify之后的使用方式:
// 监测通知
ZRNotify().on("NotifyName", notify: { notify in
print(notify.object)
})
// 发送通知
NotificationCenter.default.post(name: Notification.Name(rawValue: "NotifyName"), object: "hello")
从上面的代码可以看出,最大的不同就是在监测通知这部分,而且监测到的通知结果会以block返回,不会让代码太分散。但是这个框架针对多个通知,还有一些高级些的玩法。
一:链式监测,
ZRNotify().on("ScheduleA", notify: { notify in
print(notify.object)
}).on("ScheduleB", notify: { notify in
print(notify.object)
})
二:统一监测处理
notify.ons(["ScheduleA", "ScheduleB"], notify: { notify in
print(notify.object)
})
源码解读:
其实源码主要就是为了解决两个问题:
1, 结果回调
2, 链式调用
他使用了一个notifyPool
去管理所有的通知,当调用接口on 和 ons的时候,将notifyType对象装载进来。
public typealias notifyType = ((Notification) -> Void)
fileprivate var notifyPool: [(String, notifyType?)] = []
当有通知被调用的时候, 根据通知名字,去查找notifyType对象,然后开始回调
func receiveNotify(_ notification: Notification) {
for notify in notifyPool {
guard notify.0 == notification.name.rawValue else {
continue
}
notify.1?(notification)
}
}
实现代码可能比这个稍微复杂一点。使用这个框架的时候,你能明显感受到对于以往的代码结构还是有很大的提升,有兴趣的可以去看下源码。