GRKArrayDiff 2.2.2

GRKArrayDiff 2.2.2

测试已测试
语言语言 Obj-CObjective C
许可证 NOASSERTION
发布最新发布2020年10月

无人认领维护。



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"];
}];

创建后,实例的四个属性(deletionsinsertionsmovesmodifications)将用 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 中找到。

免责声明和许可协议

关于

白天是一位专业的 iOS 工程师,我的名字是 Levi Brown。我在 grokin.gs 提供博客,可通过以下方式联系我:

Twitter @levigroker
电子邮件 [email protected]

欢迎您的建设性评论和反馈。