数据源和委托何时应该是不同的对象?

时间:2014-08-21 03:59:50

标签: ios cocoa-touch delegates

在什么条件下需要为数据源和委托分别设置对象?我遇到的大多数应用程序都指出self.currentView.delegate = self。它仅仅是为了可读性和切断代码吗?

5 个答案:

答案 0 :(得分:4)

数据源只是一种具有不同名称和不同职责集的委托。文档中的Apple explains this nicely

  

数据源就像委托,但不是   委托控制用户界面,它是委托控制的   数据

分隔两个角色允许开发人员在适合每个角色时为每个角色指定不同的对象,而不是强迫他们将单个对象用于两个相关但不同的任务。对于这两个角色,使用不同的对象绝不是必要,但它有时可以很方便。

考虑一个包含一个表的视图控制器,该表可以在多个“模式”之间切换,其中每个模式显示具有不同细节的相同项目。实现这样一个表的一种方法是在视图控制器中执行所有操作,但最终得到的代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *theCell = nil;
    switch (self.selectedMode) {
        case kFirstMode: {
            // set up the kind of cell required for mode 1
            break;
        }
        case kSecondMode: {
            // set up the kind of cell required for mode 2
            break;
        }
        //...and so on...
    }
    return theCell;
}

你可以闻到负面评论,对吗?

另一种可以说更好的方法是为每种模式创建单独的数据源对象。当用户切换模式时,您只需交换一个知道如何显示所选模式数据的新数据源。当不同模式显示完全不同的数据项而不是相同项的不同方面时,此方案更有效。

答案 1 :(得分:2)

指向自我(作为"视图控制器")当然很受欢迎,我相信这是因为它只是更容易"将所有代码写在一个地方。

如果您遵循任何架构设计模式,大多数人都希望您创建具有单一责任的对象。这意味着你的班级只对一件事和一件事负责。

您可以在此处详细了解此模式: http://en.wikipedia.org/wiki/Single_responsibility_principle

将其付诸实践,您将拥有一个视图控制器,它仅负责视图的布局以及仅负责加载数据的其他数据源类。

遵循这些设计模式通常意味着您拥有更简洁,更易维护的代码并减少cyclomatic complexity

符合任何类型的"数据源"的类。协议(委托)也是可重用的。这意味着您可以跨多个视图控制器使用相同的数据逻辑,而无需重复代码。

答案 2 :(得分:1)

我认为您可能不了解数据源和代理。

您的数据源只是您想要的项目数据,即UIITableView,UICollectionView,UIPicker等。

上面提到的这些元素包含您可以回复的代表。大多数情况下,数据源和委托的代码都存在于您的实现文件中,通常是某种UIViewController实现。

您可以创建另一个处理控件委托的对象,但我的意见是在大多数情况下只添加另一个不需要的层。

我希望有所帮助。

答案 3 :(得分:0)

委派:将对象的职责委托给另一个对象。 例如:我们使用UITableView,UITextField和UITextView进行委托,以便它告知有关某些事件的更改和更新。

数据源:数据源的职责是在请求时向另一个对象提供数据。 例如:数据源模式与表视图和集合视图一起使用。告诉他们要显示的行和单元格数。

答案 4 :(得分:-1)

根据文件:

  

协调控制器提供以下服务:

     
      
  • 响应委派讯息和观察通知
  •   
  • 回应行动讯息
  •   
  • 管理自有对象的生命周期(例如,在适当的时间释放它们)......
  •   

然而,重要的是要意识到,鉴于这种情况,你可以打破这种模式。但最终结果应证明手段的合理性。那么什么时候需要呢?每当你作为程序员认为它比在一个地方拥有所有回调更清洁时。

来源:Apple DocsWiki - MVC