实现UICollectionViewDataSource协议的最佳方法?

时间:2014-02-12 13:49:07

标签: ios iphone objective-c delegates datasource

我有理论上的问题。

目前我的应用使用UICollectionView作为显示对象列表的方式。 UIViewController,包含UICollectionView作为子视图,实现UICollectionViewDelegate协议并充当委托和数据源。数据源使用NSFetchedResultsController来提供数据;

在我看来,这不是实现数据源的最佳方式,而在单独的类中实现它看起来更好。但问题是数据源依赖于UITextField中的搜索参数,以及其他一些按钮选择,所以每当用户在搜索字段中键入文本或按下任何“排序”按钮时,我应该更新数据源(特别是fetchRequest)在NSFetchedResultsController)。

所以,最后,我的问题:是否存在实施依赖于外部参数的数据源的“最佳实践”?我应该为数据源创建单独的类,让它像现在一样离开吗?如果将数据源实现为单独的类 - 我应该创建datasourcedelegate以在更新数据源时调用委托上的自制委托方法,或者还有其他一些解决此问题的方法(我不考虑在数据源更新时使用通知,因为对于我来说通知机制是更全面的解决方案然后我需要在这里)?

我不是在寻找最快捷的方式,我只是想找出最正确的理论实施方式。

提前谢谢大家:)

2 个答案:

答案 0 :(得分:3)

我亲自实现了一个具体的NSObject派生类,它实现了UICollectionViewDataSource以及NSFetchedResultsControllerDelegate,它实际上将获取的结果控制器事件(插入,更新,删除的对象)转换为集合视图事件(插入,更新或删除单元格)。您可以找到有关如何执行此操作的示例,我从here获取了我的,但我将其实现为单独的类而不是集合视图上的类别。我发现我的类具有高度可重用性,实际上我在所有需要在集合视图中可视化托管对象的项目中使用它。对UITableViewDataSource也可以实现类似的类。

如果需要使用搜索谓词更新获取请求,我将为新创建的DataSource类创建子类,并添加逻辑以在那里更新获取请求。比如说,您添加了一个-(void)updateSearchFilterWithText:(NSString*)text方法,您可以在其中添加逻辑以更新获取的结果控制器的获取请求。不要忘记之后再次执行获取并在集合视图上调用reloadData

使用此体系结构,视图控制器拥有此dataSource对象。每次用户更新您的过滤文本字段(或其他窗口小部件)时,视图控制器都会调用您的数据源对象的updateSearchFilterWithText:,其余的工作将在稍后完成。

答案 1 :(得分:2)

您目前拥有的是标准方法。虽然没有明确的“最佳”方法,但您所描述的肯定是一种更好的方法。

您的视图控制器将拥有您的新数据源类的实例,并且本身很可能会处理委托方法(因为这些是要采取的操作而不是数据提供),因此当UI中的任何更改时视图控制器应该将这些更改“推送”到数据源。不需要额外的授权。

您不应该创建数据源,因为文本字段和按钮直接驱动了更改。您的数据源应该呈现一个通用接口,您可以在其中更新要执行的获取请求(涵盖谓词和排序)并更改单元格的配置方式(可能使用块)。这样,您可以将视图控制器中的业务逻辑和可重用数据源代码保存在另一个可重用于其他集合视图/项目的类中。