iOS Developer

电商App项目分类模块重构总结

2017-05-19  本文已影响401人  shawenlx

前言


业务分析

{
    "category": [
        {
            "cat_id": "11241",
            "cat_name": "Earbud Headphones",
            "parent_id": "11994",
            "level": "3",
            "mobile_cat_pic": "http:\/\/uidesign.gearbest.com\/GB\/images\/banner\/others\/ios\/.jpg",
            "cat_url": "\/earphones-c_11241\/"
        },
        {
            "cat_id": "11249",
            "cat_name": "Car DVR",
            "parent_id": "11247",
            "level": "2",
            "mobile_cat_pic": "http:\/\/uidesign.gearbest.com\/GB\/images\/banner\/others\/ios\/.jpg",
            "cat_url": "\/car-dvr-c_11249\/"
        },
        {
            "cat_id": "11578",
            "cat_name": "Gifts",
            "parent_id": "0",          //一级列表默认父目录节点ID 返回 0.
            "level": "1",
            "mobile_cat_pic": "https:\/\/uidesign.gearbest.com\/GB\/app\/2016\/ios_category\/Gift.png",
            "cat_url": "\/gifts-c_11578\/",
        },
        //...
}

JSON数据分析


选择合适的数据结构作为数据查询和存储

    NSString *_categoryRootKey;             //根节点ID
    NSMutableDictionary *_categoryMap;      //图存储Hash表

构图思路

 - (void)dealCategoryData:(NSArray *)categoryArray {
        //防止缓存数据导致显示重复。
        [_categoryMap removeAllObjects];
        [categoryArray enumerateObjectsUsingBlock:^(GBCategoryModel  * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            @autoreleasepool {
                /*
                 * 先扫描获取到的Model 分类数据
                 * 获取到当前 model的父节点, 判断_categoryMap是否存在对应子节点数组
                 * 如果_categoryMap中父节点key值不存在,创建一个父节点,key值为model.parentId, value为子节点数组
                 * 如果父节点存在,那么直接将model的值添加到数组里面。
                 * 最后,将所有第一层的节点连接到 _categoryRootKey 节点对应的数组中,完成此次数据解析。
                 */
                if ([_categoryMap objectForKey:obj.parentId]) {
                    //存在对应的key值
                    NSMutableArray *childArray = [_categoryMap objectForKey:obj.parentId];
                    [childArray addObject:obj];
                    [_categoryMap setObject:childArray forKey:obj.parentId];
                } else {  
                    //不存在对应父节点key值
                    NSMutableArray *newChildArray = [NSMutableArray array];
                    [newChildArray addObject:obj];
                    [_categoryMap setObject:newChildArray forKey:obj.parentId];
                }
            }
        }];
        //最后遍历一次数组,将对应的节点是否存在子节点进行标记
        [categoryArray enumerateObjectsUsingBlock:^(GBCategoryModel  *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if ([_categoryMap objectForKey:obj.catId]) {
                NSMutableArray *childArray = [_categoryMap objectForKey:obj.catId];
                obj.hasNext = (childArray != nil && childArray.count > 0) ? YES : NO;
            }
        }];
        _categoryRootKey = @"0";
    }


UI实现


重构心得

上一篇 下一篇

猜你喜欢

热点阅读