最近有個新需求,就是做下電商App基本都有的功能-足跡,簡單的說不就是瀏覽記錄嘛。設(shè)計(jì)圖是下面這樣滴!
我的足跡列表.png
看上去設(shè)計(jì)圖也很正常,該有的都有了,只要數(shù)據(jù)沒問題,基本就是寫下界面就over了,萬萬沒想到,問題就出現(xiàn)在這數(shù)據(jù)上,所有數(shù)據(jù)竟然是客戶端自己存,自己取,完完全全的一個本地瀏覽記錄啊??,既然需求確定是這樣了,那就沒辦法只能開始了。
存數(shù)據(jù)
數(shù)據(jù)怎么存呢?下面幾種數(shù)據(jù)持久化方案都行:
- plist文件
- NSUserDefaults
- NSKeyedArchiver
- 數(shù)據(jù)庫
- CoreData
這里由于趕時間就偷了個懶,選用了NSUserDefaults 來存儲數(shù)據(jù)(應(yīng)該首選數(shù)據(jù)庫和CoreData)。
然后需要存一些什么數(shù)據(jù)呢?業(yè)務(wù)需要,我們每條數(shù)據(jù)都需要有commodityId(商品id),commodityInfoId(商品信息sku),scanTime(商品瀏覽時間)。由于商品id是唯一的,這里我就采用了字典key的唯一性來進(jìn)行去重,只保留最新的瀏覽記錄。
- (NSMutableDictionary *)commodityDic {
if (!_commodityDic) {
_commodityDic = [NSMutableDictionary dictionaryWithDictionary:[self.storageDic objectForKey:@"用戶userId"];
}
return _commodityDic;
}
- (NSMutableArray *)commodityArray {
if (!_commodityArray) {
_commodityArray = [NSMutableArray array];
}
return _commodityArray;
}
NSString *insetStr = [NSString stringWithFormat:@"%@|%@", scanTime,commodityInfoId];
[self.commodityDic setObject:insetStr forKey:commodityId];
[self.storageDic setObject:self.commodityDic forKey:@"用戶userId"];
[[NSUserDefaults standardUserDefaults] setObject:self.storageDic forKey:@"你的key"];
[[NSUserDefaults standardUserDefaults] synchronize];
//兩個字典的結(jié)構(gòu)是這樣的:
self.commodityDic {
ZMCOMD132170419142301330 = "2017-11-14 17:56:49|ZMCOMD132170419142301330170419142301304";
ZMCOMD426170808141848800 = "2017-11-14 15:05:35|ZMCOMD426170808141848800170808141848472";
ZMCOMD881170710143358733 = "2017-11-14 17:48:46|ZMCOMD881170710143358733170710143358515";
ZMCOMD956171018164822665 = "2017-11-14 17:48:39|ZMCOMD956171018164822665171018164822894";
}
self.storageDic
{
16050368695640 = {
ZMCOMD233170802151805643 = "2017-11-14 10:30:02|647060";
ZMCOMD593170208112702710 = "2017-11-14 10:29:57|ZMCOMD593170208112702710170208112702912";
};
17091455092851 = {
ZMCOMD132170419142301330 = "2017-11-14 17:56:49|ZMCOMD132170419142301330170419142301304";
ZMCOMD426170808141848800 = "2017-11-14 15:05:35|ZMCOMD426170808141848800170808141848472";
ZMCOMD881170710143358733 = "2017-11-14 17:48:46|ZMCOMD881170710143358733170710143358515";
ZMCOMD956171018164822665 = "2017-11-14 17:48:39|ZMCOMD956171018164822665171018164822894";
};
}
好了,數(shù)據(jù)這樣就算是存上了??。
取數(shù)據(jù)
//根據(jù)用戶id來取數(shù)據(jù)
NSMutableDictionary *disorderlyDic = [self.storageDic objectForKey@"用戶userId"];
NSArray *keysArray = disorderlyDic.allKeys;
NSArray *valuesArray = disorderlyDic.allValues;
//按時間進(jìn)行排序
NSArray *sortArray = [valuesArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj2 compare:obj1 options:NSNumericSearch];
}];
NSMutableArray *orderlyArray = [NSMutableArray array];
for (NSInteger i = 0; i < sortArray.count; i++) {
NSInteger index = [valuesArray indexOfObject:sortArray[i]];
NSString *key = keysArray[index];
NSString *value = sortArray[i];
[orderlyArray addObject:@{key:value}];
}
//按時間排序后的數(shù)據(jù)是這樣的
sortArray
<__NSArrayI 0x60800024f9f0>(
2017-11-14 17:56:49|ZMCOMD132170419142301330170419142301304,
2017-11-14 17:48:46|ZMCOMD881170710143358733170710143358515,
2017-11-14 17:48:39|ZMCOMD956171018164822665171018164822894,
2017-11-14 15:05:35|ZMCOMD426170808141848800170808141848472
)
orderlyArray
<__NSArrayM 0x60800005b7e0>(
{
ZMCOMD132170419142301330 = "2017-11-14 17:56:49|ZMCOMD132170419142301330170419142301304";
},
{
ZMCOMD881170710143358733 = "2017-11-14 17:48:46|ZMCOMD881170710143358733170710143358515";
},
{
ZMCOMD956171018164822665 = "2017-11-14 17:48:39|ZMCOMD956171018164822665171018164822894";
},
{
ZMCOMD426170808141848800 = "2017-11-14 15:05:35|ZMCOMD426170808141848800170808141848472";
}
)
數(shù)據(jù)合并,排序
//將時間相同的合并在一起
NSDictionary *commodityAllDic = [NSMutableDictionary dictionary];
for (NSInteger i = 0; i < orderlyArray.count; i ++) {
NSDictionary *comDic = self.commodityArray[i];
NSString *comTime = [[comDic.allValues[0] componentsSeparatedByString:@"|"][0] substringWithRange:NSMakeRange(0, 10)];
NSMutableArray *array = [self.commodityAllDic objectForKey:comTime];
if (!array) {
array =[NSMutableArray array];
}
[array addObject:comDic.allKeys[0]];
[commodityAllDic setObject:array forKey:comTime];
}
//按時間排序
NSArray *keyArray = [self.commodityAllDic allKeys];
NSArray *sortArray = [keyArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj2 compare:obj1 options:NSNumericSearch];
}];
//數(shù)據(jù)結(jié)構(gòu)是這樣的
commodityAllDic
{
"2017-11-14" = (
ZMCOMD132170419142301330,
ZMCOMD881170710143358733,
ZMCOMD956171018164822665,
ZMCOMD426170808141848800
);
}
sortArray
<__NSSingleObjectArrayI 0x60800001d7c0>(
2017-11-14
)
做到這一步數(shù)據(jù)處理基本完事了,有sortArray,我們可以取到commodityAllDic對應(yīng)的commodityId,根據(jù)commodityId,我們可以取到存取的數(shù)據(jù)。
刪除數(shù)據(jù)
這個就簡單了
- (void)removeCommodityWithCommodityId:(NSMutableArray *)commodityIdArray {
for (NSString *commodityId in commodityIdArray) {
[self.commodityDic removeObjectForKey:commodityId];
}
[self.storageDic setObject:self.commodityDic forKey:@"用戶userId"];
[[NSUserDefaults standardUserDefaults] setObject:self.storageDic forKey:@"你的key"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
分頁加載數(shù)據(jù)
上面的幾個都搞定了,這個也比較簡單了,確定每一頁需要顯示的個數(shù),從排序后orderlyArray中依次取出相對應(yīng)的個數(shù),然后按照數(shù)據(jù)合并,排序的方法,來進(jìn)行整合數(shù)據(jù)。