GRKArrayDiff
对于两个 NSArrays,一个前一个当前,GRKArrayDiff 将报告所有删除、插入、移动和修改。这专门针对支持 Table Views 和 Collection Views 的基于数组的数据模型,但也可以适用。
安装
如果您使用 CocoPods,只需将其添加到您的 Podfile
:
pod 'GRKArrayDiff'
否则,只需将 GRKArrayDiff
子目录的内容添加到您的项目中。
文档
使用时,请导入 GRKArrayDiff.h
#import "GRKArrayDiff.h"
然后 alloc 和 init 一个新实例,传入前一个数组、新数组以及两个块。负责唯一标识给定对象的 identityBlock
,而 modifiedBlock
负责报告给定的 currentObj
对象是否应被视为已修改。
GRKArrayDiff *diff = [[GRKArrayDiff alloc] initWithPreviousArray:previousArray currentArray:currentArray identityBlock:^NSString *(id obj) {
return [obj identifier];
} modifiedBlock:^BOOL(id _Nonnull previousObj, id _Nonnull currentObj) {
return [[currentObj identifier] isEqualToString:@"five"] ||
[[currentObj identifier] isEqualToString:@"three"] ||
[[currentObj identifier] isEqualToString:@"zero"] ||
[[currentObj identifier] isEqualToString:@"one"];
}];
创建后,实例的四个属性(deletions
、insertions
、moves
和 modifications
)将用 GRKArrayDiffInfo
对象的 NSSet 填充,这些对象描述了前一个数组和当前数组之间元素的变化。
典型的 iOS 表视图更新使用示例如下:
//Save the current data model for comparison
NSArray *oldDataModel = self.dataModel;
//Update our data model with the latest
self.dataModel = [self updateDataModel];
//Get differences in data model
GRKArrayDiff *diff = [[GRKArrayDiff alloc] initWithPreviousArray:oldDataModel currentArray:self.dataModel identityBlock:^NSString *(id obj) {
NSString *identifier = nil;
if ([obj conformsToProtocol:@protocol(MyType)])
{
id <MyType> myObj = (id <MyType>)obj;
identifier = [myObj uuid];
}
return identifier;
} modifiedBlock:^BOOL(id _Nonnull previousObj, id _Nonnull currentObj) {
BOOL modified = currentObj != nil && [modificationSet containsObject:currentObj];
return modified;
}];
//Update the UI with the changes
[diff updateTableView:self.tableView section:0 animation:animated ? UITableViewRowAnimationAutomatic : UITableViewRowAnimationNone completion:nil];
更多文档可查看 GRKArrayDiff.h
,示例用法可在 GRKArrayDiffTest.m
中找到。
免责声明和许可协议
- 我使用来自 https://github.com/levigroker/HashBuilder 的哈希代码。
- 表格视图更新的灵感来源于 TLIndexPathTools。
- 本作品受 Creative Commons Attribution 3.0 Unported License 许可。请查阅附带的 LICENSE.txt 文件以获取详细信息。
关于
白天是一位专业的 iOS 工程师,我的名字是 Levi Brown。我在 grokin.gs 提供博客,可通过以下方式联系我:
Twitter @levigroker
电子邮件 [email protected]
欢迎您的建设性评论和反馈。