最佳的实现UICollectionViewDataSource协议的方法是什么?

3

我有一个理论性的问题。

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

在我看来,这不是实现数据源的最佳方法,将其实现为单独的类看起来更好。但问题在于数据源取决于UITextField中的搜索参数和其他按钮选择,因此每次用户在搜索字段中输入文本或按下“排序”按钮之一时,都应更新数据源(特别是在NSFetchedResultsController中的fetchRequest)。

所以,最终,我的问题是:是否有任何实现依赖外部参数的数据源的“最佳实践”?我应该为数据源创建单独的类还是保留现有的方式?如果将数据源实现为单独的类-是否应创建datasourcedelegate来在数据源更新时调用自定义委托方法,或者是否有其他解决此问题的方法(我不考虑在数据源更新时使用通知,因为对我来说通知机制是一个更全局的解决方案)?

我不是在寻找最快的方法,我只想找到最正确的理论实现方式。

非常感谢大家的帮助 :)

2个回答

3
我个人实现了一个具体的NSObject派生类,它实现了UICollectionViewDataSourceNSFetchedResultsControllerDelegate,可以将获取结果控制器事件(插入、更新、删除对象)转换为集合视图事件(插入、更新或删除单元格)。你可以找到如何实现这一点的示例,我从这里学习到的,但我将其实现为一个独立的类,而不是一个类别。在实践中,我发现我的类非常重用,在所有需要在集合视图中可视化托管对象的项目中都使用它。也可以为UITableViewDataSource实现类似的类。
如果您需要使用搜索谓词更新提取请求,我建议您继承您新创建的DataSource类,并在那里添加更新提取请求的逻辑。比如,您可以添加一个-(void)updateSearchFilterWithText:(NSString*)text方法,在其中添加更新获取结果控制器的提取请求的逻辑。不要忘记执行提取操作并在集合视图上调用reloadData
使用这种架构,视图控制器拥有此数据源对象。每当用户更新您的筛选文本字段(或其他小部件)之一时,视图控制器会调用您的数据源对象的updateSearchFilterWithText:方法,其余工作由后者完成。

2
你目前拥有的是标准方法。虽然没有定义“最佳”方法,但你所描述的方法肯定是更好的方法。
你的视图控制器将拥有一个新数据源类的实例,并且很可能会处理委托方法(因为这些是要执行的操作而不是要提供的数据),因此当 UI 中有任何变化时,视图控制器应该将这些变化“推送”到数据源中。不需要额外的委托。
你不应该创建数据源并直接在其中更改文本字段和按钮。你的数据源应该呈现通用界面,您可以更新提取请求以执行(其中包括谓词和排序),并更改如何配置单元格(例如使用块)。这样,您就可以将业务逻辑保留在视图控制器中,将可重用的数据源代码放在另一个可重用于其他集合视图/项目的类中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接