1. 程式人生 > >基於ReactiveCocoa和MVVM設計的購物車基本操作實現程式碼解析

基於ReactiveCocoa和MVVM設計的購物車基本操作實現程式碼解析

購物車單選全選價格計算數量增刪等等操作…RAC皆統統搞定.就是這麼cool~

開始之前你需要了解的

配置CocoaPods

12 gem install cocoapods##使用RVM安裝的Ruby不需要sudo

配置ReactiveCocoa

然後在你的Podfile新增一下程式碼

1234567 platform:ios,'8.0'use_frameworks!target'你的專案工程名'dopod'ReactiveCocoa'end

最後輸入命令安裝

12 pod install

另外常用的pod 命令

123 pod install--verbose--no-repo-update##安裝不更新的pod update--verbose--no-repo-update##更新需要更新的

開啟 你的專案工程名.xcworkspace 即可~

RAC在此我就不仔細介紹了,先推薦幾遍文章:

瞭解MVVM

Google了看幾篇有關的文章

簡單的介紹一下:

M:model放一些資料模型

V:view檢視

V:viewcontroller控制器

VM:viewmodel主要做處理邏輯和處理資料

開始著手程式碼

專案演示

gig1

專案搭建框架

整體檔案目錄按照模組分一下子檔案

1234567891011121314 ViewController:ViewController##載入檢視事件監聽等等Model:model##基本資料模型View:cell##cellnumbercount##封裝加減控制元件header##店鋪之類footer##小結cartbar##封裝購物車底部viewViewModel:service##抽離tableview的datasource和delegateviewmodel##處理主要的邏輯和資料

viewmodel類方法屬性解析

獲取資料方法

1.迴圈20個從0到5之間隨機取數組裡取值加到最終的cartData數組裡
2.店鋪選擇shopSelectArray預設NO狀態
3.統計總共購物車數量cartGoodsCount

Objective-C
1234567891011121314151617181920212223242526272829 -(void)getData{//資料個數NSIntegerallCount=20;NSIntegerallGoodsCount=0;NSMutableArray*storeArray=[NSMutableArray arrayWithCapacity:allCount];NSMutableArray*shopSelectAarry=[NSMutableArray arrayWithCapacity:allCount];//創造店鋪資料for(inti=0;i<allCount;i++){//創造店鋪下商品資料NSIntegergoodsCount=[_shopGoodsCount[self.random] intValue];NSMutableArray*goodsArray=[NSMutableArray arrayWithCapacity:goodsCount];for(intx=0;x<goodsCount;x++){JSCartModel*cartModel=[[JSCartModelalloc] init];cartModel.p_id=@"122115465400";cartModel.p_price=[_goodsPriceArray[self.random] floatValue];cartModel.p_name=[NSString stringWithFormat:@"%@這是一個很長很長的名字呀呀呀呀呀呀",@(x)];cartModel.p_stock=22;cartModel.p_imageUrl=_goodsPicArray[self.random];cartModel.p_quantity=[_goodsQuantityArray[self.random] integerValue];[goodsArray addObject:cartModel];allGoodsCount++;}[storeArray addObject:goodsArray];[shopSelectAarry addObject:@(NO)];}self.cartData=storeArray;self.shopSelectArray=shopSelectAarry;self.cartGoodsCount=allGoodsCount;}

獲取當前選中價格總和方法

對cartData陣列轉訊號流然後map自定義需求return,期間自定義需求引數value 再次轉訊號流經過filter篩選未選中使isSelectAll為NO,然後經過map自定義需求使model.p_quantity*model.p_price得到的商品總價返回,最終return得到商品總價陣列pricesArray.

快速遍歷pricesArray得出總價allPrices

Objective-C
1234567891011121314151617181920212223242526 -(float)getAllPrices{__block floatallPrices=0;NSIntegershopCount=self.cartData.count;NSIntegershopSelectCount=self.shopSelectArray.count;if(shopSelectCount==shopCount&&shopCount!=0){self.isSelectAll=YES;}NSArray*pricesArray=[[[self.cartData rac_sequence] map:^id(NSMutableArray*value){return[[[value rac_sequence] filter:^BOOL(JSCartModel*model){if(!model.isSelect){self.isSelectAll=NO;}returnmodel.isSelect;}] map:^id(JSCartModel*model){return@(model.p_quantity*model.p_price);}];}] array];for(NSArray*priceAinpricesArray){for(NSNumber*priceinpriceA){allPrices+=price.floatValue;}}returnallPrices;}

全選yes or not

shopSelectArray轉流map定義需求isSelect為YES的物件然後return 成可變陣列.

cartData轉流map定義需求,對其引數value轉流map定義需求KVC使model的isSelect屬性為YES,再次計算記錄總價allPrices.return再return成可變陣列.

Objective-C
12345678910111213141516171819 -(void)selectAll:(BOOL)isSelect{__block floatallPrices=0;self.shopSelectArray=[[[[self.shopSelectArray rac_sequence] map:^id(NSNumber*value){return@(isSelect);}] array] mutableCopy];self.cartData=[[[[self.cartData rac_sequence] map:^id(NSMutableArray*value){return[[[[value rac_sequence] map:^id(JSCartModel*model){[model setValue:@(isSelect) forKey:@"isSelect"];if(model.isSelect){allPrices+=model.p_quantity*model.p_price;}returnmodel;}] array] mutableCopy];}] array] mutableCopy];self.allPrices=allPrices;[self.cartTableView reloadData];}

單行選擇處理方法

KVC設定model的isSelect為YES,做店鋪下商品選中滿判斷

Objective-C
1234567891011121314151617181920212223 -(void)rowSelect:(BOOL)isSelect IndexPath:(NSIndexPath*)indexPath{NSIntegersection=indexPath.section;NSIntegerrow=indexPath.row;NSMutableArray*goodsArray=self.cartData[section];NSIntegershopCount=goodsArray.count;JSCartModel*model=goodsArray[row];[model setValue:@(isSelect) forKey:@"isSelect"];//判斷是都到達足夠數量NSIntegerisSelectShopCount=0;for(JSCartModel*modelingoodsArray){if(model.isSelect){isSelectShopCount++;}}[self.shopSelectArray replaceObjectAtIndex:section withObject:@(isSelectShopCount==shopCount?YES:NO)];[self.cartTableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationNone];/*重新計算價格*/self.allPrices=[selfgetAllPrices];}

單行數量處理方法

KVC處理model.再次呼叫getAllPrices方法計算總價

Objective-C
1

相關推薦

基於ReactiveCocoaMVVM設計購物車基本操作實現程式碼解析

購物車單選全選價格計算數量增刪等等操作…RAC皆統統搞定.就是這麼cool~ 開始之前你需要了解的 配置CocoaPods gem install cocoapods ##使用RVM安裝的Ruby不需要sudo

python中列表元組的基本操作

class 表的基本操作 報錯 數字 最後一個元素 .py 不可 例子 得到 列表的基本操作,例子中使用的python3,python2中用print list# 1. 定義一個含有5個數字的列表 list1 = [5, 6, 7, 8, 9] # 使用type( )可以查

線索二叉樹二叉樹基本操作實現

2018-11-18-18:25:23 一:二叉樹 1.二叉樹的性質   ①:在二叉樹的第i層上至多有pow(2,i-1)個結點(i>=1)。   ②:深度為k的二叉樹至多有pow(2,k)-1個結點(k>=1)。   ③:對任何一顆二叉樹T,如果其終端結點的個數為n0,度為2的結點數為

資料庫資料表的基本操作

一、資料庫的操作 // 登陸mysql資料庫 mysql -u root -p; // 建立資料庫 CREATE DATABASE db_book; // 檢視所有資料庫 SHOW DATABASE; // 選擇資料庫 USE db_book; // 檢視所有資料表 SHOW TAB

《資料結構與演算法設計》實驗報告書之二叉樹的基本操作實現及其應用

《資料結構與演算法設計》實驗報告書之二叉樹的基本操作實現及其應用 實驗專案 二叉樹的基本操作實現及其應用 實驗目的 1.熟悉二叉樹結點的結構和對二叉樹的基本操作。 2.掌握對二叉樹每一種操作的具體實現。 3.學會利用遞迴方法編寫對二叉樹這種遞迴資料結構進行處理的演算法。 4.會用二叉

vue的引入基本操作程式碼

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <ti

佇列的基本操作實現及其應用

實驗2:棧和佇列的基本操作實現及其應用 一、實驗目的 1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2、      學會使用棧和佇列解決實際問題。 二、實驗內容 1

【案例一】移動端購物車基本功能實現,具體操作類似淘寶購車。

還是直接上圖:        這個效果圖很酷炫~  有個坑紀念下,本來想用jquery-weui做的,然後各種倒騰,還是用css+div,媽耶! 關鍵核心的jquery語句控制: //繫結全選的按鈕,讓所有購物車都選中,然後計算總數 $("#checkboxSum

Spark程式設計指南之一:transformationaction等RDD基本操作

文章目錄 基本概念 開發環境 程式設計實戰 初始化SparkContext RDD的生成 RDD基本操作 Key-Value Pairs Transformations f

佇列的基本操作實現

《資料結構》(c語言版)——第三章、棧和佇列 抽象資料型別——棧 順序儲存結構: #include<stdio.h> #include<stdlib.h> #include<string.h> #define ok 1 #defin

【TensorFlow學習筆記】5:variable_scopename_scope,圖的基本操作

學習《深度學習之TensorFlow》時的一些實踐。 variable_scope 一般的巢狀 上節有學到在巢狀scope中的變數,一般是: import tensorflow as tf # with tf.variable_scope("scopeA") as

實驗三 棧佇列的基本操作實現及其應用

#include using namespace std; struct Node{ int data; Node *next; }; class QueueOfCanteen{ private: Node *front,*rear; int total; //計算當前排隊人數,並作為入隊單號的參

MySQL資料庫 || 資料庫資料表的基本操作

第一篇博文,一個小小的紀念儀式^-^ 以下正文 一:資料庫的基本操作 --資料庫的操作 --連線資料庫 mysql -uroot -p密碼 mysql -uroot -pmysql --退出資料庫 exit quit ctrl + d --檢視所有資料庫

實驗三:棧佇列的基本操作實現及其應用——順序棧

一、實驗目的1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。2、      學會使用棧和佇列解決實際問題。二、實驗內容1、自己確定結點的具體資料型別和問題規模:分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。分別建立一個順序佇列和鏈佇列,實

實驗4:棧佇列的基本操作實現及其應用——鏈棧

一、實驗目的 1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2、      學會使用棧和佇列解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模: 分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。 分別建

棧+佇列的基本操作實現(嚴蔚敏版設計思路解讀c++)

大家好,我是集美貌與才華於一身的阿俊吶,咳咳咳…不接受任何反駁,感謝你辣麼好看還來關注我,嘿嘿嘿,讓我們進入正題叭…biu~ biu~… 這篇部落格主要是我學完資料結構(嚴蔚敏版),想記錄下來以後複習用。 從零搭建起棧和佇列的操作 順序動態棧和動

【pandas】[2] DataFrame 基礎,建立DataFrame增刪改查基本操作(1)

作者:lianghc 地址:http://blog.csdn.net/zutsoft         DataFrame 是pandas最常用的資料結構,類似於資料庫中的表,不過DataFrame不僅僅限制於2維,可以建立多維資料表。DataFrame既有行索引,也有列

實驗4:棧佇列的基本操作實現及其應用之《順序佇列》

實驗4:棧和佇列的基本操作實現及其應用之順序佇列 一、實驗目的 1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2、   學會使用棧和佇列解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模: 分別建立一個順

實驗4:棧佇列的基本操作實現及其應用之《鏈佇列》

實驗4:棧和佇列的基本操作實現及其應用之鏈佇列 一、實驗目的 1、   熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2、   學會使用棧和佇列解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模: 分別建立一個

《實用OpenCV》 影象GUI視窗的基本操作(2)

GUI跟蹤條和函式回撥       回撥函式       回撥函式是指當事件發生時自動被呼叫的函式。可以和OpenCV裡面的很多事件相關聯,像滑鼠左右鍵的點選,滑塊的移動等等。 例4-2 顏色空間轉換 // Function to change between co