我可以更改对象的委托吗?

时间:2012-02-22 13:47:11

标签: iphone objective-c uitableview delegates protocols

我有一个RequestHandler类,它接受一些ViewController的请求并异步地在Web上获取数据。为了通知ViewController,它实现了一个协议,并将ViewController设置为它的委托。

现在,这个ViewController是一个TableViewController,当选择一行时,它会在NavigationStack上推送第二个ViewController。第二个(子)ViewController也需要使用RequestHandler。如何使它成为同一Re​​questHandler实例的委托?我怎样才能确保一旦我回到它就不会弄乱父TableViewController?

2 个答案:

答案 0 :(得分:1)

两个视图控制器都需要相同的请求这一事实表明存在设计错误。视图控制器应显示模型的当前状态。它们不应直接处理活动的网络请求。

您应该拥有一组代表您数据的类。这些被称为模型。视图在屏幕上时,视图控制器应该只关心模型。所以一个合理的模式看起来像这样:

  • ViewController注册模型
  • 中的更改通知
  • ViewController使用Model中的当前数据更新视图。
  • ViewController请求更新。
  • RequestManager(singleton)创建一个新的RequestHandler来处理它。
  • 当RequestHandler完成时,它告诉RequestManager并被释放。
  • RequestManager使用新数据更新模型
  • 模型警告已注册的观察者已更改。
  • ViewController使用Model中的当前数据更新视图。

现在,如果用户在此视图上,或者已移至另一个视图,或移至另一个视图并返回,则无关紧要。在呼叫情况下,只要模型发生变化,当前视图就会更新。

答案 1 :(得分:0)

如果我理解正确,RequestHandler是您编写的类,那么您可以允许它为实现的协议接受多个委托(只需将委托存储在NSMutableArray中,这样您就可以添加代表。删除它们如你所愿)

现在,在创建新视图时,您可以将其“注册”到RequestHandler。如果视图将被关闭,您可以/应该从RequestHandler中取消注册。