我有一个触发某些事件的自定义委托。对于上下文,它是一个任意触发事件的蓝牙设备。我希望我的视图控制器可以选择订阅由设备委托触发的这些事件。
每个视图控制器都符合自定义委托是没有意义的,因为这意味着设备变量将是本地的,并且只会在该视图控制器中触发。其他视图控制器不会意识到这种变化。另一个具体的例子是CLLocationManagerDelegate
- 例如,如果我希望所有视图控制器都能听取GPS坐标的变化呢?
相反,我更多地考虑所有视图控制器都可以订阅的全局委托。因此,如果一个视图控制器触发请求,则设备将为正在侦听的所有预订视图控制器调用委托函数。
我如何实现这种建筑设计?代表们不是正确的做法吗?我想也许NotificationCenter
可以在这里提供帮助,但看起来太松散了,或许抛出协议会让事情变得更易于管理/优雅?任何帮助将不胜感激!
答案 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
相同,但可以为您提供更多控制权。