需求
如上图所示,我的栏目中可以拖动栏目修改排序,还可以删除频道,需改排序和删除频道需要点击完成之后才生效
而下面的添加栏目是即时生效的,即只要点击添加频道就立即生效
分析
本地有一个数据源 ,对于不即时生效的修改,不能直接修改
数据源,而我们又需要记录修改的具体内容,所以需要新创建一个临时数据源,用来保留 不即时生效的修改,
同时,添加栏目的修改是即时生效的,为了保证修改的同步,即时修改的内容需要修改本地数据源,同时还要修改临时数据源
即:即时生效的修改需要修改本地持久数据源和临时数据源,而不立即生效的只需要修改临时数据源
实现代码
初始化数据源
/// 创建和本地持久属于源相同的临时属于源
self.tmpMyColumnArray = [TPUserDefault instance].defaultNodeList;
self.tmpMoreColumnArray = [TPUserDefault instance].mainPageMoreColumn;
添加频道
- (NSArray *)addColumnWithNodeId:(NSString *)nodeId
{
/// 修改临时数据源
NSMutableArray *array = [[TPUserDefault instance].defaultNodeList mutableCopy];
[TPUserDefault instance].hasChangedMainpageChannelOrder = YES;
[self.tmpMoreColumnArray enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj[@"nodeId"] integerValue] == nodeId.integerValue) {
[self.tmpMyColumnArray addObject:obj];
[self.tmpMoreColumnArray removeObject:obj];
}
}];
/// 添加频道是立即生效的 修改本地持久数据源
[[TPUserDefault instance].channldataList enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString *nodeIdInAarray = obj[@"nodeId"];
if (nodeIdInAarray.integerValue == nodeId.integerValue) {
if ([obj.allKeys containsObject:@"controller"]) {
NSString *className = obj[@"controller"];
if (!isBlankString(className)) {
Class class = NSClassFromString(className);
ChannelContentListController *vc = [[class alloc] init];
vc.nodeId = nodeIdInAarray;
NSMutableArray *tmpViewControllers = [NSMutableArray arrayWithArray:self.viewControllers];
[tmpViewControllers addObject:vc];
self.viewControllers = tmpViewControllers.copy;
[self.pageViewControllers addObject:vc];
[self addChildViewController:vc];
}
}
[array addObject:obj];
NSMutableArray *moreArray = [[TPUserDefault instance].mainPageMoreColumn mutableCopy];
[moreArray removeObject:obj];
[TPUserDefault instance].mainPageMoreColumn = moreArray.copy;
*stop = YES;
}
}];
return array.copy;
}
///调用上面的方法,立即修改本地持久数据源
NSArray *array = [weakSelf addColumnWithNodeId:nodeId];
[weakSelf refreshDataWhenUpdateColumnWithArray:array];
删除
//只修改临时数据源
- (void)deleteColumnWithNodeId:(NSString *)nodeId
{
[self.tmpMyColumnArray enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj[@"nodeId"] integerValue] == nodeId.integerValue) {
[self.tmpMoreColumnArray addObject:obj];
[self.tmpMyColumnArray removeObject:obj];
}
}];
}
保存
//点击完成按钮
- (void)editFinishClick
{
///使用临时数据源替换本地持久数据源
if (![[TPUserDefault instance].defaultNodeList isEqualToArray:self.tmpMyColumnArray] ||
[TPUserDefault instance].hasChangedMainpageChannelOrder) {
[TPUserDefault instance].hasChangedMainpageChannelOrder = YES;
}
NSString *currentNodeId = [self currentNodeId];
[TPUserDefault instance].defaultNodeList = self.tmpMyColumnArray.copy;
[TPUserDefault instance].mainPageMoreColumn = self.tmpMoreColumnArray.copy;
[self refreshWithCurrentNodeId:currentNodeId];
}