SKUFilterManager
SKU 商品规格组合算法
更新日志
2019.03.15 ~ cocoapods version 1.0.2
pod 'KNSKUDataFilter'
正文
SKUDataFilter 使用 NSIndexPath 记录每个属性的坐标。表示为 第 section 种属性类下面的 第 item 个 属性 (从0计数) 条件式下标 (conditionIndexs) 中记录的属性 indexPath 的 item
// 判断属性是否存在于条件式中
conditionIndexs[indexPath.section] == indexPath.row
数据通配
conditionIndexs 和 indexPath 的结合,使得 SKUDataFilter 不仅在算法上取得了优势,同时在 数据通配 上也发挥了巨大作用
不同的后台,不同的需求,返回的数据结构都不一样。
然而 SKUDataFilter 真正关注的是属性的坐标,而不是属性本身的值,那么不管你从后台获取的数据结构是怎样的,也不管你是如何解析的。当然,你也不需要去关心坐标和条件式下标等等乱七八糟的。你需要做的只是把对应的数据放入对应的代理方法里面去就行了,不管数据是 model,属性 ID、字典还是其他的。
使用说明
SKUDataFilter 最终直接反映的是属性的 indexPath,如果你的属性在 UI 显示上使用 UICollectionView 实现,那么 indexPath 是一一对应的,如果使用循环创建,找到对应的行和列即可。
1、初始化 Filter 并设置代理
- (instancetype)initWithDataSource:(id<ORSKUDataFilterDataSource>)dataSource;
//当数据更新的时候 重新加载数据
- (void)reloadData;
2、通过代理方法,将数据传给Filter
以下方法都必须实现,分别告诉Filter,属性种类个数、每个种类的所有属性(数组),条件式个数、每个条件式包含的所有属性、以及每个条件式对应的结果(可以参考本文案例)
//属性种类个数
- (NSInteger)numberOfSectionsForPropertiesInFilter:(ORSKUDataFilter *)filter;
/*
* 每个种类所有的的属性值
* 这里不关心具体的值,可以是属性ID, 属性名,字典、model
*/
- (NSArray *)filter:(ORSKUDataFilter *)filter propertiesInSection:(NSInteger)section;
//满足条件 的 个数
- (NSInteger)numberOfConditionsInFilter:(ORSKUDataFilter *)filter;
/*
* 对应的条件式
* 这里条件式的属性值,需要和filter:propertiesInSection里面的数据 类型保持一致
*/
- (NSArray *)filter:(ORSKUDataFilter *)filter conditionForRow:(NSInteger)row;
//条件式 对应的 结果数据(库存、价格等)
- (id)filter:(ORSKUDataFilter *)filter resultOfConditionForRow:(NSInteger)row;
3、点击某个属性时,把对应属性的indexPath传给Filter
- (void)didSelectedPropertyWithIndexPath:(NSIndexPath *)indexPath;
4、查询结果(与代理方法resultOfConditionForRow对应)-条件不完整会返回nil
@property (nonatomic, strong, readonly) id currentResult;
5、可选属性集合列表、已选属性坐标列表
//当前 选中的属性indexPath
@property (nonatomic, strong, readonly) NSArray <NSIndexPath *> *selectedIndexPaths;
//当前 可选的属性indexPath
@property (nonatomic, strong, readonly) NSArray <NSIndexPath *> *availableIndexPaths;
使用注意
1、虽然SKUDataFilter不关心具体的值,但条件式本质上是由属性组成,因此代理方法filter:propertiesInSection:和方法filter:conditionForRow:数据类型应该保持一致
2、因为SKUDataFilter关心的是属性的坐标,所以在代理方法传值时,代理方法filter:propertiesInSection:和方法filter:conditionForRow:各自的数据顺序应该保持一致,并且两个方法的数据也要对应。
如本文案例条件式是从上往下(M,G,X),传过去的属性值也都是从左到右(F、M)-各自保持一致。同时,条件式为从上到下,那么propertiesInSection:也应该是从上到下,先行(F、M),最后是(L、X、S)
在实际项目中,这两种情况发生的概率都非常小,因为首先数据统一返回统一解析,格式99%都是一样。其次数据是从服务器返回,服务器的数据要进行筛选和过滤,顺序也不能弄错,一旦错误,首先服务器就会出问题
KNSKUDataFilter
pod command
git tag -a 1.0.3 -m "1.0.3"
git push origin --tags
pod lib lint KNSKUDataFilter.podspec --allow-warnings
pod trunk push KNSKUDataFilter.podspec --allow-warnings