MZRelationalCollectionController 1.2.4

MZRelationalCollectionController 1.2.4

测试已测试
语言语言 Obj-CObjective C
许可协议 MIT
发布最新发布2016 年 3 月

Mat Trudel 维护。



概述

MZRelationalCollectionController 使得编写数据驱动的 iOS 应用变得简单。它管理对象的命名关系中的 KVO,在关系的各个内容变化以及对关系集合中指定对象的指定属性变化时提供代理通知。它旨在简化表格和集合样式视图控制器中的数据管理组件,帮助您保持控制器的体积,并让您专注于应用程序的实际意图,而不必管理数据和保持 UI 的更新。

用法

如下例所示创建 MZRelationalCollectionController 实例

[MZRelationalCollectionController collectionControllerForRelation:@"albums"
                                                         onObject:artist
                                                       filteredBy:[NSPredicate predicateWithFormat:@"liveAlbum == NO"]
                                                         sortedBy:@[[NSSortDescriptor sortDescriptorWithKey:@"releaseDate" ascending:YES]]
                                           observingChildKeyPaths:@[@"title"]
                                                         delegate:self];

初始化后,此控制器的 collection 对象将包含指定艺术家按发布日期排序的所有工作室专辑。此外,控制器的代理(如果指定)将在对象进入、离开或移动到集合内部时收到相关消息(如果指定了过滤谓词)。此外,当集合的任何对象更改其 observingChildKeyPaths 参数中指定的任何值时,代理将收到一条消息。

所有这些加在一起,为编写自动与底层集合更改保持同步的表格和集合视图控制器提供了一种非常简单的方法。通常,每次控制器的主要数据对象更改时,您都会创建一个新的 MZRelationalCollectionController 实例(如示例项目中 -[MZArtistTableViewController setArtist] 所示)。MZRelationalCollectionControllerDelegate 方法直接映射到 UITableViewUICollectionView 上相应的函数,因此保持视图更新的管道非常简单且易于编写(事实上,在大多数情况下几乎都是样板代码)。

MZRelationalCollectionController 用于遍历通过现有模型对象属性访问的集合(例如遍历艺术家的专辑或特定专辑中的曲目)。它不尝试处理应用程序顶级的情况,在这种情况下对象列表通常是全局的(例如,艺术家列表的完整列表)。在实践中,这通常不是问题,因为许多应用程序都有一个隐含的“顶级”对象,如当前用户或全局库。在这些情况下,应用程序的顶级导航列表实际上是现有模型对象的集合(即使用户看不到这个顶级对象)。

从1.2.0版本开始,MZRelationalCollectionController在主线程上发出所有代理调用。早期版本会根据底层KVO变化所在的线程发出调用。由于GCD的main_queue是一个顺序队列,代理调用将按顺序调用,但是因为它们是从底层对建模集合的变化异步发出的,所以无法保证建模集合在代理调用时的状态符合预期(这不会对在主线程上由KVO变化生成的更新造成问题,因为在这种情况下代理调用是同步的)。实际上,这并不是一个大问题,因为大多数典型用例(如表格或集合视图更新)在这个限制内都能正常工作。

在某些方面,MZRelationalCollectionController并不很适用。特别是,它维护了几个内存中的数据结构,其大小是集合大小的O(n)。对于较小的集合(例如,大小不到几百个),这通常不是问题,但是对于较大的集合,可能就不是最佳匹配。

示例应用与测试

示例应用提供了对MZRelationalCollectionController的全面介绍。它管理一个音乐目录,按照艺术家、专辑和曲目进行分层组织。控制器本身是标准的表格视图控制器,使用MZRelationalCollectionController实例来提供数据,并在底层数据发生变化时自动更新表格。还包含了一个完整的测试套件。

要运行示例项目,只需要克隆仓库,打开Example/MZRelationalCollectionController.xcworkspace工作区,然后就可以开始使用了。

已知问题

  • NSArray集合上的替换操作(例如:- replaceObjectAtIndex:withObject:及其相关方法)不支持。替换调用通常比较复杂,虽然有需求时可以添加该支持。在'典型'使用(例如:在Core Data之上)中,这通常不是问题,因为所有关系都是NSSet集合。

  • 对没有明确指定排序描述符的NSArray集合的支持有限。原则上应该可以正常工作,但有一些边缘情况没有得到很好的测试。

  • 不支持过滤、排序或观察嵌套的多对多键路径(例如,对于一个艺术家专辑关系的控制器无法观察集合中每张专辑歌曲的总时长)。这是KVO的限制,详情见此处

要求

MZRelationalCollectionController需要遵守KVO/KVC的模型层(如Core Data)。我们还需要ARC。

安装

MZRelationalCollectionController可以通过CocoaPods获得。要安装,只需在Podfile中添加以下行

pod "MZRelationalCollectionController"

作者

Mat Trudel,[email protected]

许可证

MZRelationalCollectionController在MIT许可证下可用。更多信息请参见LICENSE文件。