購物車是每個商城類的app必備的實現(xiàn)功能咳促,然而購物車模塊實現(xiàn)起來并不簡單稚新,需要考慮的地方也比較多,當(dāng)初我實現(xiàn)起來也是一頭霧水跪腹,隨便翻了一下網(wǎng)上資料褂删,也沒有一個詳細的實現(xiàn)思路,本著分享的精神冲茸,在此把我當(dāng)初實現(xiàn)購物車模塊的思路和細節(jié)在這里分享交流一下屯阀,另外也希望大家將可以優(yōu)化的地方提出
1.需求分析:
? ? ? ?購物車的模塊其實可以按照用戶行為去將需求拆解,用戶使用購物車可以分解成如下幾個情況
? ? ? ? ? ? ? ? 未登錄狀態(tài)下:
? ? ? ? ? ? ? ? ? 1)添加購物車(本地存儲購物車列表)
? ? ? ? ? ? ? ? ? 2)查看購物車(購物車列表恢復(fù))
? ? ? ? ? ? ? ? ? 3)修改購物車商品的購買數(shù)量(修改購物車列表)
? ? ? ? ? ? ? ? ? 4)刪除購物車商品種類(刪除一條或多條內(nèi)容)
? ? ? ? ? ? ? ? ?登錄狀態(tài)下:
? ? ? ? ? ? ? ? ? 1)登錄瞬間購物車認領(lǐng)(將本地購物車列表與服務(wù)器同步)
? ? ? ? ? ? ? ? ? 2)添加購物車(與服務(wù)器同步)
? ? ? ? ? ? ? ? ? 3)查看購物車(服務(wù)器獲取購物車列表并與本地同步)
? ? ? ? ? ? ? ? ? 4)修改購物車商品的購買數(shù)量(與服務(wù)器同步)
? ? ? ? ? ? ? ? ? 5)刪除購物車(與服務(wù)器同步)
好了轴术,將需求拆解成上述的情況之后难衰,大致的思路也差不多有了,購物車一個最基本的功能就是將數(shù)據(jù)本地持久化逗栽,這必然要涉及到數(shù)據(jù)庫的操作盖袭,既然涉及到數(shù)據(jù)庫,那么就有兩種方法可以選則了彼宠,一個是coredata鳄虱,另一個是fmdb,其實兩種都可以凭峡,本人當(dāng)初選擇了fmdb
? ? ? ? ? 由于當(dāng)時看了一下唐巧大神分享的fmdb封裝的第三方拙已,本著嘗(tou)試(lan)的心態(tài)決定用他的第三方,但是后面才發(fā)現(xiàn)和自己項目需求有點不合適摧冀,在做一些優(yōu)化時候也費了點勁倍踪,因此建議大家系宫,如果用fmdb的話,還是找一個只做了簡單封裝的第三方來用就好了惭适。
2.代碼實現(xiàn)
好了笙瑟,廢話不多說,在實現(xiàn)購物車模塊之前癞志,還要先定好表結(jié)構(gòu)往枷,至于表結(jié)構(gòu)要怎么定,這里沒有一個固定的套路凄杯,主要還是看后臺哥哥的數(shù)據(jù)怎么定错洁,這里就分享一下本人項目中商品model以及思路
第一步,直觀反映商品與要購買的數(shù)量關(guān)系戒突,因此我選擇商品id-數(shù)量 這樣的key-value形式建表屯碴,并且以商品id作為主鍵,方便后續(xù)針對某一件商品單獨修改其數(shù)量
第二步膊存,將商品描述的副屬性打包裝進一個字段中导而,因為在購物車操作中,最核心的內(nèi)容只需要關(guān)注一件商品及其對應(yīng)的正確數(shù)量即可隔崎,至于其他屬性今艺,只是為了顯示作用,故可以全部弄進一個字段中
最終爵卒,表結(jié)構(gòu)就是如下 {100456 : {"num" :1,"description":{img:"www.baidu.com","type" : 1 ......} },100478:......}
v1.0
購物車是貫穿整個app的核心模塊虚缎,必然需要一個單例去維護,在我的項目中钓株,我是在useraccount的單例中增加一個購物車列表屬性去維護实牡,其中需要準備的方法有:
1.初始化購物車(init)
2.添加購物車(add)
3.刷新購物車(refresh)
4.刪除購物車(delete)
5.清空購物車(remove)
初始化購物車
? ? ? ? ? ?初始化購物車又分為登錄狀態(tài)以及未登錄狀態(tài)兩種情況,未登錄狀態(tài)直接讀取本地數(shù)據(jù)庫轴合,然后將商品模型添加到單例的購物車數(shù)組即可创坞, 而登錄狀態(tài)下,則需要先用本地數(shù)據(jù)庫受葛,然后等待網(wǎng)絡(luò)接口數(shù)據(jù)回來后刷新一遍本地數(shù)據(jù)庫摆霉,然后再清空單例的購物車數(shù)組,再把新的購物車列表數(shù)據(jù)加入到購物車數(shù)組中(這么繁瑣實際上也是為了用戶體驗奔坟,當(dāng)用戶網(wǎng)絡(luò)不好的情況下携栋,進入購物車中,還可以看到他上一次關(guān)掉app時候的購物車數(shù)據(jù))
添加購物車
? ? ? ? ? ?添加購物車同樣分為兩種情況咳秉,未登錄狀態(tài)下只需要給本地數(shù)據(jù)庫寫入一條即可婉支,登錄狀態(tài)下,則需要寫入本地之后向服務(wù)器發(fā)送同步數(shù)據(jù)
? ? ? ? ? ?這里有一個判斷澜建,如果添加購物車發(fā)現(xiàn)已經(jīng)有該商品了向挖,則應(yīng)該調(diào)用刷新購物車的方法
刷新購物車
? ? ? ?當(dāng)增加或者減少購物車數(shù)量時蝌以,需要根據(jù)商品id取出數(shù)據(jù),然后將更改后的數(shù)量替換回去何之,如果是登錄狀態(tài)下跟畅,還需要和服務(wù)器同步數(shù)據(jù)
刪除購物車
? ? ? 把數(shù)據(jù)庫對應(yīng)的商品id的數(shù)據(jù)刪除掉,登錄狀態(tài)下需要和服務(wù)器同步數(shù)據(jù)
清空購物車
? ? ? 這個最簡單了溶推,清空整張表徊件,登錄狀態(tài)下需要和服務(wù)器同步數(shù)據(jù)
當(dāng)將以上方法都寫完之后,剩下的就是簡單的調(diào)用方法了蒜危,初始化購物車在啟動的時候會調(diào)用一次(為了顯示購物車的角標)虱痕,然后會在進入購物車的時候再調(diào)用一次
添加購物車會在每次添加購物車的時候都調(diào)用一次
至于刷新購物車和刪除購物車,則會在購物車界面下辐赞,對商品對應(yīng)操作的時候調(diào)用
而清空購物車則會在帳號登出以及結(jié)算成功的時候會調(diào)用
至于購物車認領(lǐng)部翘,這個操作稍微復(fù)雜一點點,實際上就是登錄之后從服務(wù)器獲取的列表响委,然后遍歷列表調(diào)用添加購物車的方法一件一件加入到購物車去
以上就是購物車v1.0版本的思路整理
3.細節(jié)優(yōu)化(購物車2.0)
在實際應(yīng)用中新思,遇到了幾個問題
? ? ? ? ? ? ?一個是購物車中商品數(shù)量太多的情況下,進入購物車以及刪除購物中的商品會造成卡頓赘风,這個原因是因為我在refresh的方法中修改購物車列表是整張表取出來表牢,修改其中一行,然后再整張表存回數(shù)據(jù)庫中贝次,這過程會造成性能消耗,本人也是偷懶彰导,直接使用fmdb的事務(wù)蛔翅,并且將修改的操作放進子線程中進行,這樣一來位谋,用戶就不會感覺到卡頓(實際上性能并沒有優(yōu)化)
? ? ? ? ? ? ? 一個是購物流程優(yōu)化山析,由于一開始的設(shè)計,太多地方是需要等待網(wǎng)絡(luò)回調(diào)才能進行下一步操作掏父,在網(wǎng)絡(luò)不暢順的環(huán)境下笋轨,消費的過程會變得十分長,十分影響用戶的付費沖動赊淑,甚至?xí)幸恍┥唐纷隽思尤氲劫徫镘嚨牟僮骶粽捎诰W(wǎng)絡(luò)延遲,進入到購物車界面獲取的列表還是沒有該商品的情況陶缺,針對這種情況钾挟,也是做了一個優(yōu)化,以本地數(shù)據(jù)為主饱岸,網(wǎng)絡(luò)數(shù)據(jù)回調(diào)只是作為校驗的數(shù)據(jù)掺出,服務(wù)器返回的數(shù)據(jù)只用來校準商品的描述徽千,圖片,期號等等無關(guān)重要的副屬性汤锨,這么一來用戶在支付之前的操作都會變得十分暢順双抽,可以更快的讓用戶進入支付等待的環(huán)節(jié)