購物車的實現(xiàn)

購物車是每個商城類的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é)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闲礼,隨后出現(xiàn)的幾起案子牍汹,更是在濱河造成了極大的恐慌,老刑警劉巖位仁,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柑贞,死亡現(xiàn)場離奇詭異,居然都是意外死亡聂抢,警方通過查閱死者的電腦和手機钧嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琳疏,“玉大人有决,你說我怎么就攤上這事】张危” “怎么了书幕?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長揽趾。 經(jīng)常有香客問我台汇,道長,這世上最難降的妖魔是什么篱瞎? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任苟呐,我火速辦了婚禮,結(jié)果婚禮上俐筋,老公的妹妹穿的比我還像新娘牵素。我一直安慰自己,他們只是感情好澄者,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布笆呆。 她就那樣靜靜地躺著,像睡著了一般粱挡。 火紅的嫁衣襯著肌膚如雪赠幕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天询筏,我揣著相機與錄音劣坊,去河邊找鬼。 笑死屈留,一個胖子當(dāng)著我的面吹牛局冰,可吹牛的內(nèi)容都是我干的测蘑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼康二,長吁一口氣:“原來是場噩夢啊……” “哼碳胳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沫勿,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤挨约,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后产雹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诫惭,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年蔓挖,在試婚紗的時候發(fā)現(xiàn)自己被綠了夕土。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘟判,死狀恐怖怨绣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拷获,我是刑警寧澤篮撑,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站匆瓜,受9級特大地震影響赢笨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驮吱,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一茧妒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糠馆,春花似錦、人聲如沸怎憋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绊袋。三九已至毕匀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間癌别,已是汗流浹背皂岔。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留展姐,地道東北人躁垛。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓剖毯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親教馆。 傳聞我的和親對象是個殘疾皇子逊谋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容