前言:
enmmmmm......
之前写了iOS 购物车本地缓存基于FMDB的实现&Demo,但是当真正结合使用到项目中时,发现问题并不是这么简单。
惭愧呀惭愧,顺着之前的思路,历经好几天都没能想出个所以然,后来灵光一闪,发现自己思路应该可以换一换。
1、最开始的构建:
1047 — 用户端:购物车新增缓存功能
需求代码追踪:
ShopViewController—>purchaseAction点击响应弹出购物车—>ShopPurchaseSelectView—>cellForRowAtIndexPath—>ShopPurchaseSelectCell—>找到店铺首页商品模型MerchantsGoods
至此,找到商品信息model,开始构建数据库
数据库基于FMDB实现:
建表时机:
每个商品展示cell中的add按钮回调时
建表代码:
[JHFMDB createTableWithSQLName:@"create table if not exists goods ('goodsId' text not null, 'goodsName' text not null, 'goodsPrice' text not null, 'goodsWeight' text, 'goodsMainPic' text, 'goodsStore' text, 'goodsAddNum' integer not null)" andResultBlock:^(NSString *result) {
NSLog(@"此处建表:%@",result);
}];
表内对应:
[goodsDict setObject:[set stringForColumn:@"goodsId"] forKey:@"goodsId"];//商品Id
[goodsDict setObject:[set stringForColumn:@"goodsName"] forKey:@"goodsName"];//商品名称
[goodsDict setObject:[set stringForColumn:@"goodsPrice"] forKey:@"goodsPrice"];//商品价格(单位:分)
[goodsDict setObject:[set stringForColumn:@"goodsWeight"] forKey:@"goodsWeight"];//商品重量(单位:克)
[goodsDict setObject:[set stringForColumn:@"goodsMainPic"] forKey:@"goodsMainPic"];//商品主图
[goodsDict setObject:[set stringForColumn:@"goodsStore"] forKey:@"goodsStore"];//
[goodsDict setObject:@([set intForColumn:@"goodsAddNum"]) forKey:@"goodsAddNum"];//添加商品数量
功能代码追踪:
ShopViewController—>purchaseArray购物车商品信息数据源
ShopPurchaseSelectCell—>clickPuls添加商品—>clickMin移除商品(吐槽:这是什么鬼命名……你们是魔鬼嘛)
ShopPurchaseSelectCell—>ShopPurchaseSelectCellBlock进行回调
———————————————————————————
业务逻辑:
进入ShopViewController,购物车先进行一次查询,有则显示、无则隐藏
ShopViewController中的商品信息列表,cell中,点击“+”,调用addBlock,点击“-”,调用subBlock,在block中,对数据库进行相应的insert、delete操作
每对cell操作一次,则刷新一次购物车信息
购物车里的cell,“+”、“-”逻辑与上相同,每操作一次cell,则刷新一次购物车信息
关键点:
购物车数量的number与新添加的number需要进行整合(此处根据项目逻辑和需求具体分析)
2、之前的核心思路是:
每sub、add一次,则对应数据库里的数据操作一次
数据库数据为0时,隐藏sub按钮,并且通过商品ID的查找,删除该商品信息
每次add时,先读取数据库,如存在,则number+1,如不存在,则新增该条商品信息
选购界面add/sub商品一次,联动购物车查询一次
购物车 的数据源 则 完全读取于数据库
以此为核心,结合项目实际进行融入
这些看似没毛病,可是真的这样做了,会发现有问题,有个大问题!
选购界面既然能够操作数据库,那么它与购物车里的信息应该是对应着的(这么说,好像有点抽象...)
,上述的思路,是可以实现购物车的缓存,可是,却损失了部分用户体验感(我可以在选购时,操作商品加减;我也可以点击购物车,弹出一个小视图,在里面进行商品的加减操作;我还可以点击商品详情,在详情页进行单独的商品加减)
3、存在的bug:
这样写,不但会损失部分用户体验感,还会导致一个bug出现。假如此时,我对商品A进行
加2
的操作,离开
此页面,再进入
,此时,只有购物车有两条
商品A,我再选购操作对商品A+1
,注意了,此时购物车有商品A*3
,而此时的选购却只有商品A*1
,我现在就无法在选购操作中,将商品A清除干净,这无疑是一个bug了。
那么该怎么解决呢?
4、新的思路:
两个字 —— 替换
之前的核心思路,其实并没有改变,只不过,变得是选购操作界面的数据源,数据获取成功后,拿到商品ID,与数据库中的商品ID进行查找对比,发现相同,则将数据库中的整条商品信息替换掉选购操作页面数据源中的该条商品信息,如此一来,才是完完整整的购物车(我估计真的看的人,都被我说晕了)
选购操作界面的数据源,数据获取成功后,拿到商品ID
与数据库中的商品ID进行查找对比
发现相同,则将数据库中的整条商品信息替换掉选购操作页面数据源中的该条商品信息
保证购物车与选购界面的同步性
每sub、add一次,则对应数据库里的数据操作一次
数据库数据为0时,隐藏sub按钮,并且通过商品ID的查找,删除该商品信息
每次add时,先读取数据库,如存在,则number+1,如不存在,则新增该条商品信息
选购界面add/sub商品一次,联动购物车查询一次
购物车 的数据源 则 完全读取于数据库
5、最终效果图:

结束语:
具体的代码实现,就需要结合项目实际了,我之上的解法思路,也是结合我们项目的实际为出发点的,并不一定适合所有的购物车功能,基础篇就是iOS 购物车本地缓存基于FMDB的实现&Demo,还是那句话,共勉之
网友评论