【问题标题】:How to subscribe to delegate events globally?如何在全球范围内订阅委托事件?
【发布时间】:2016-04-06 17:49:35
【问题描述】:

我有一个触发某些事件的自定义委托。就上下文而言,它是一个任意触发事件的蓝牙设备。我希望我的视图控制器可以选择订阅这些由设备委托触发的事件。

每个视图控制器都符合自定义委托是没有意义的,因为这意味着设备变量将是本地的,并且只会在该视图控制器中触发。其他视图控制器不会意识到这种变化。另一个具体示例是CLLocationManagerDelegate - 例如,如果我希望所有视图控制器都监听 GPS 坐标变化怎么办?

相反,我更多的是考虑一个所有视图控制器都可以订阅的全局委托。因此,如果一个视图控制器触发了一个请求,该设备将为所有正在监听的订阅视图控制器调用委托函数。

我怎样才能实现这种架构设计?代表不是正确的方法吗?我想也许NotificationCenter 可以在这里提供帮助,但似乎类型过于松散,也许抛出协议有助于使事情更易于管理/优雅?任何帮助将不胜感激!

【问题讨论】:

    标签: ios swift bluetooth delegates swift2


    【解决方案1】:

    您可以拥有一组收到通知的订阅者。

    class CustomNotifier {
    
        private var targets : [AnyObject] = [AnyObject]()
        private var actions : [Selector]  = [Selector]()
    
    
        func addGlobalEventTarget(target: AnyObject, action: Selector) {
    
            targets.append(target)
            actions.append(action)
        }
    
        private func notifyEveryone () {
    
            for index in 0 ..< targets.count {
    
                if targets[index].respondsToSelector(actions[index]) {
    
                    targets[index].performSelector(actions[index])
                }
            }
        }
    }
    

    当然,您必须进一步计划以维护targetsactions 的生命周期,并提供退订等方式。

    注意:目标和操作数组也是weak 对象的理想选择。例如,This SO question 处理主题。

    【讨论】:

      【解决方案2】:

      NotificationCenter 是想到的第一个解决方案。是的,它是松散的类型。但是你可以改进它。比如这样:

      extension NSNotificationCenter {
      
          private let myCustomNotification = "MyCustomNotification"
      
          func postMyCustomNotification() {
              postNotification(myCustomNotification)
          }
      
          func addMyCustomNotificationObserverUsingBlock(block: () -> ()) -> NSObjectProtocol {
              return addObserverForName(myCustomNotification, object: nil, queue: nil) { _ in
                  block()
              }
          }
      
      }
      

      • 第二种解决方案是创建一些共享对象,它将存储所有委托或块/闭包,并在需要时触发它们。这样的对象基本上和使用NotificationCenter一样,但是给了你更多的控制权。

      【讨论】:

        猜你喜欢
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        相关资源
        最近更新 更多