gpt4 book ai didi

ios - 观察者,通知,委托(delegate) swift ios8

转载 作者:行者123 更新时间:2023-11-28 05:29:41 32 4
gpt4 key购买 nike

我正在寻找一些关于如何最好地实现我认为可能是观察者的东西的建议,可能是多播委托(delegate)或者我可能只使用通知输入。

我正在创建一个连接到各种数据源并生成通用数据格式的 DataManager 类。

示例:

我们可以从Internal Core LocationFile PlaybackNetwork Socket provided location生成一个LocationMessage,等等

返回的数据类型是一个具有通用格式的LocationMessage,如果需要也可以转换成一个CLLocation

在我当前的“多委托(delegate)”模型中,如果你想获得位置更新,你必须实现定义的 LocationConsumer 协议(protocol)

func didUpdateLocation(newLocation: LocationMessage) 
{
println("\(__FUNCTION__) \(newLocation)")
}

然后你会

//Instantiate a data manager
let dm : DataManager = DataManager()

//Register yourself as a delegate
dm.addLocationDelegate(self)

在内部,当我们获取新的位置数据时,会调用以下方法:

    let closure = {
(delegate : LocationDataConsumer) -> () in
dispatch_async(self.delegateQueue) {
delegate.didUpdateLocation(parsedLocation)
}
}
locationDelegates.map(closure)

其中 locationDelegates[LocationConsumer] 的数组

讨论

所以,首先这显然不是真正遵循委托(delegate)模式,因为您不应该有多个委托(delegate)。

然而,我真正喜欢当前方法的是,使用协议(protocol)来将类标识为关心特定数据类型似乎非常干净。然而,让我感到不舒服的是“打破”了标准委托(delegate)模式。

通过一些阅读,我认为最合适的方法是使用Notification Pattern,但是,从编码的角度来看,我觉得涉及更多的维护(尽管我可能是错的) .仅使用此委托(delegate)方法实现协议(protocol)并调用 addDelegate 的简单性在 Notifications 中消失了。我想我必须专门注册我关心的每个通知 - 对吗?

我不能做这样的事情:

class notificaitonClass : LocationNotifiee, WeatherNotifiee {

所以我想我的问题是

  • 1:我是否实现了观察者模式
  • 2:我目前的方法有哪些缺点
  • 3: 有没有办法定义一个 swift 协议(protocol),使实现它的类自动订阅一组通知
  • 4:什么是更好的方法?

(希望这不是太含糊)

最佳答案

我同意@JefferyThomas 的观点。您所做的完全有效,但 Swift 和 Objective-C 都没有将多播委托(delegate)的概念作为标准设计模式。

这并不是说它有任何问题。拥有一个符合给定协议(protocol)的对象数组是完全有效的,就像使用 map 函数对该数组中的所有对象调用闭包一样。瞧,即时多播委托(delegate)。

如果您使用该术语,Cocoa/Cocoa Touch 程序员(像我一样)很可能会觉得您好笑,这仅仅是因为术语“委托(delegate)”在 Cocoa 中的含义相当狭窄,而且该含义不包括多播委托(delegate)。

在我看来,您已经为您的多播委托(delegate)设计了相当多的“映射”(双关语意),所以如果它适合您需要做的事情,那就去做吧。您并没有破坏委托(delegate)设计模式 - 您正在实现一种不同的设计模式,该模式并未在平台上广泛使用,但仍然非常有效和有用。

当我第一次开始阅读您的问题时,我认为“委托(delegate)是一对一的。通知更合适。”那是因为,作为一名典型的 Cocoa/Cocoa Touch 开发人员,“委托(delegate)”一词对我来说意义狭窄——不包括多播委托(delegate)。然而,在我用 google 搜索这个术语之前,我已经很确定你的意思了,而且我在考虑符合通用协议(protocol)和 map 函数的对象数组。

通知是解决问题的另一种完全有效的方法。让我印象深刻的是,通知和多播委托(delegate)之间的区别在于谁来做这项工作。在多播委托(delegate)中,发送者必须维护一个目标列表(我不太愿意称它们为委托(delegate))并向每个目标发送所需的消息。

在通知中,发送者不知道也不关心谁在听。发送者只是发射一个信号弹,听众有责任去关心和回应。 KVO 在这方面类似于通知。

编辑:

再考虑一下,我认为 map 函数不是正确的选择。 Map 旨在获取源数组,对每个元素执行一些变异操作,然后在新数组中返回变异的元素。它会创建一个新数组,您可以忽略它。

对于多播委托(delegate)设计模式,您不需要将源数组转换(映射)到目标数组。您需要让数组中的每个元素执行一项任务。

最好使用forEach方法。这条线

locationDelegates.map(closure)

看起来像这样:

locationDelegates.foreach
{
closure()
}

(我认为我的语法是正确的——我最近主要在 Objective-C 中工作,而在 Swift 中变得生疏了。🙍)

关于ios - 观察者,通知,委托(delegate) swift ios8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29269295/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com