iOS中的多个代理

我正在做一个对象,去下载所有我的视图控制器的东西。 该对象是单例实例,并且一旦下载完成就具有接收数据的callback方法。 它也有一个委托属性,以便它知道下载完成后要回叫哪个对象。

有多个控制器使用这个共享的实例,我的问题是如何callback请求下载的正确的视图控制器。

我的方法是使用委托,但问题是,因为其他视图控制器也是它的委托,下载对象可以回叫每个对象,这将是很难跟踪。

我曾经在人们试图使用多个代表的项目上工作,这基本上是一个坏主意。 委托模式是一个类和它的委托之间的1对1关系。 虽然可以通过切换代表进行一定程度的多重委托,但更可能导致不可预知的行为和错误。

我的build议是改变你对此的看法。 我有两种select:

  1. 切换到Observer模式,您可以在其中注册您的主类可以与之交互的多个观察者。 如果你的观察者都实现了相同的协议,并且你的主类想知道观察者和他们的交互,那么这很有用。

  2. 广播NSNotifications以指示状态更改和事件。 这是一种更加分离的方法,因为主类不需要知道谁在监听,也不需要直接与他们交互。 其他可以开始和停止在闲暇时通知。 它还具有不需要创build或实施单独的协议的优点。 相反,您需要通过NSNotificationCenter注册需要了解更改的类,然后轮stream处理所有通知的路由。

这听起来像代表模式可能不是最好的办法在这里。

我会考虑NSNotificationCenter

基本的想法是,你的单身做networking连接发布通知(像postNotificationName:object:userInfo: ,说新的数据可用。 在这个通知中,你可以传递一个字典对象( userInfo )来保存你获取的数据,或者你的模型的哪些部分包含更新数据的信息。

然后,您的其他视图控制器可以通过调用addObserver:selector:name:object:注册自己以“观察”这些通知。 一般来说,当vc变得可见时,我们调用addObserverremoveObserver当它被隐藏或转换出来的时候。

祝你好运!

代表团似乎不是这个问题的正确解决scheme。 如何要求请求的视图控制器提供一个对象(它的自我)和一个select器让你打电话作为完成通知? 当然,你需要一个地方来存储对象和select器,直到下载完成。 希望你有(或可以创build)这个对象。

我build议使用这些方法之一

观察员:

当使用你想通知其他对象的数据接近原始的时候。例如,当你使用'NSMutableArray'时,你不能通过标准实现的模式通知对象之一的变化,至less你需要为你自己实现一个那是不可重用的

通知

当你与目标对象的交互(需要通知的)是单向的,这意味着你不需要任何确认或其他数据。

代表

每个时间步有一个对象要通知。

注意:阻止使用成功和失败不是一种模式来广播数据,它将要排队的任务,当你不知道什么时候他们正在完成或失败的networking操作

编辑: 如何创build通知 | 多代表问题和实施