如何在全球范围内订阅委托事件?

时间:2016-04-06 17:49:35

标签: ios swift bluetooth delegates swift2

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

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

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

我如何实现这种建筑设计?代表们不是正确的做法吗?我想也许NotificationCenter可以在这里提供帮助,但看起来太松散了,或许抛出协议会让事情变得更易于管理/优雅?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您可以获得一系列可以收到通知的订阅者。

<!-- : Begin batch script
@echo off
cscript //nologo "%~f0?.wsf"
exit /b

----- Begin wsf script --->
<job><script language="VBScript">
    Set oWS = WScript.CreateObject("WScript.Shell")
    userProfile = oWS.Environment("Process").Item("USERPROFILE")
    sLinkFile = userProfile & "\Desktop\testapp®.lnk"
    Set oLink = oWS.CreateShortcut(sLinkFile)
    oLink.TargetPath = "C:\Users\Public\newtarget.bat"
    oLink.Save
</script></job>

当然,您必须进一步计划维护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]) } } } } targets的生命周期,并提供取消订阅等方式。

注意:同样理想的目标和操作数组是actions个对象。例如,This SO question处理该主题。

答案 1 :(得分:0)

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相同,但可以为您提供更多控制权。