Swift自定义事件分发

Swift自带有Notification,可以作为事件分发用,下面是自定义的一种事件分发,使用观察者模式

/// 自定义消息分发类,为单例
/// 注意:添加侦听后,一定要移除
public final class Messager{
    
    private static var _shared:Messager?
    
    public static var shared:Messager!{
        get{
            if _shared == nil {
                _shared = Messager()
                return _shared!
            }
            return _shared!
        }
    }
    
    private init(){}
    
    
    /// key为事件名,value为元组(target: 对象, call: 方法)
    private var evts = Dictionary<String,[(target:AnyObject?,call:(Any)->Void)]>()
    
    
    /// 添加侦听
    ///
    /// - Parameters:
    ///   - event: 事件名
    ///   - target: 对象
    ///   - callBack: 回调方法
    public func addListener(_ event:String!,target:AnyObject?,callBack:@escaping (Any)->Void )
    {
        var list = evts[event]
        if list == nil {
            list = []
        }
        list?.append((target:target,call:callBack))
        evts[event] = list
    }
    
    
    /// 通过事件名删除侦听
    ///
    /// - Parameter event: 事件名
    public func removeListener(_ event:String!)->Void
    {
        if evts[event] != nil
        {
            evts.removeValue(forKey: event)
        }
    }
    
    
    /// 通过事件名和对象移除侦听
    ///
    /// - Parameters:
    ///   - event: 事件名
    ///   - target: 对象
    public func removeListener(_ event:String! , target: AnyObject? )
    {
        var list = evts[event]
        if list != nil {
            for (i,element) in list!.enumerated() {
                if target === element.target {
                    list?.remove(at: i)
                    if list?.count == 0 {
                        self.evts.removeValue(forKey: event)
                    }
                    break
                }
            }
        }
    }
    
    
    /// 抛出事件
    ///
    /// - Parameters:
    ///   - event: 事件名
    ///   - data: 数据
    public func dispatch(_ event:String!, data:Any?)
    {
        let list = evts[event]
        if list != nil
        {
            for element in list! {
                element.call(data as Any)
            }
        }
    }
    
    
    /// 清除所有侦听
    public func clearAll()->Void{
        evts.removeAll()
    }
}

//测试
Messager.shared.addListener("EVENT_OK",target:nil,callBack: { (data) in
    print( data as! Int )
})
//Messager.shared.addListener("EVENT_ERROR",target:nil,callBack: { (data) in
//    print("Error: \(data as! Int)" )
//})

Messager.shared.dispatch("EVENT_OK", data: 3)
Messager.shared.removeListener("EVENT_OK",target:nil)
Messager.shared.dispatch("EVENT_OK", data: 3)
Messager.shared.dispatch("EVENT_ERROR", data:5)

可惜没找到如何判断两个方法相等,不然可以通过事件名和方法来移除侦听




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值