转载

解读iOS Notification框架ZRNotify

最近做的一个项目,有些地方准备用通知来处理,但是原生的通知使用方式着实恶心到了我,准备自己写个,结果看到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)    
    }    
}

实现代码可能比这个稍微复杂一点。使用这个框架的时候,你能明显感受到对于以往的代码结构还是有很大的提升,有兴趣的可以去看下源码。

正文到此结束
Loading...