swift 事件传递工具组件的 封装

#一、对于多层逆传

  1. 在开发过程中,避免不了事件、数据的逆传,因为喜欢,所以大多数逆传都至少要串4层,而这些都用block、代理传递?想像一下你要定义多少的block属性、方法,或者代理对象、协议?崩溃!
  2. 多层逆传,如果用通知,那肯定很爽,但是会浪费很多的内存空间,消耗性能。

#二、组件思路

  1. 其实与其说组件不如说是一个工具,因为他确实很小。
  2. 在NSObject分类中,添加一个block属性,这个属性要用懒加载
  3. 对外暴露两个方法,一个是发送信息的方法,另外一个是接受发送的消息的方法。

#三、实际代码 代码不多,但是却是省去了很多代码

1. 定义block类型 block有两个参数: signalKey:区分事件的key messageObj: 传递的数据

  typealias EVENTCALLBACKBLOCK = (_ signalKey: String, _ messageObj: Any)->(Any)?

2. 发送消息函数 发送消息函数参数 signalKey: 区分事件的key message : 传递的数据 return : 返回的数据 ``

 @discardableResult
    public func sendSignalFunc (signalKey SignalKey: String, message Message: Any) -> (Any)? {
        var eventBlock: EVENTCALLBACKBLOCK? = objc_getAssociatedObject(self, NSObectEventTransmitExtension.EVENTCALLBACKBLOCKKEY) as? EVENTCALLBACKBLOCK
        if (eventBlock == nil) {
            eventBlock = {(SignalKey, Message) -> (Any)? in
                print("\(self)暂时没有,注册对赢得block,请检查,你想传传递的信息为: \n\n: SignalKey: \(SignalKey)\n\n,Message: \(Message)")
            }
        }
        print("?\(self):\(SignalKey)")
        return eventBlock!(SignalKey,Message) as (Any)?
    }

**3. 接收消息的函数 参数: eventCallBack 这里写出你要的事件 在外层的类中调用

 func receivedSignalFunc(eventCallBack: @escaping EVENTCALLBACKBLOCK) {
        objc_setAssociatedObject(self, NSObectEventTransmitExtension.EVENTCALLBACKBLOCKKEY, eventCallBack, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }

4. 快速搭建通道

    func stitchChannelFunc(sender Sender: NSObject?) {
        if Sender == nil {
            print("?::sender为你nil\(self)")
            return
        }
        Sender!.receivedSignalFunc { (signalKey, message) -> (Any)? in
            return self.sendSignalFunc(signalKey: signalKey, message: message)
        }
    }

剩下的看代码把

转载于:https://my.oschina.net/LiPengYue/blog/1577497

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值