最近做的一个项目,有些地方准备用通知来处理,但是原生的通知使用方式着实恶心到了我,准备自己写个,结果看到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) } }
实现代码可能比这个稍微复杂一点。使用这个框架的时候,你能明显感受到对于以往的代码结构还是有很大的提升,有兴趣的可以去看下源码。