精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS-MVVM-框架介紹

移動(dòng)開發(fā) iOS
我于 2011 年在 500px 找到自己的第一份 iOS 開發(fā)工作。雖然我已經(jīng)在大學(xué)里做了好幾年 iOS 外包開發(fā),但這才是我的一個(gè)真正的 iOS 開發(fā)工作。我被作為唯一的 iOS 開發(fā)者被招聘去實(shí)現(xiàn)擁有漂亮設(shè)計(jì)的 iPad 應(yīng)用。在短短七周里,我們就發(fā)布了 1.0 并持續(xù)迭代,添加了更多特性,但從本質(zhì)上,代碼庫也變得更加復(fù)雜了。

我于 2011 年在 500px 找到自己的第一份 iOS 開發(fā)工作。雖然我已經(jīng)在大學(xué)里做了好幾年 iOS 外包開發(fā),但這才是我的一個(gè)真正的 iOS 開發(fā)工作。我被作為唯一的 iOS 開發(fā)者被招聘去實(shí)現(xiàn)擁有漂亮設(shè)計(jì)的 iPad 應(yīng)用。在短短七周里,我們就發(fā)布了 1.0 并持續(xù)迭代,添加了更多特性,但從本質(zhì)上,代碼庫也變得更加復(fù)雜了。

有時(shí)我感覺就像我不知道在做什么。雖然我知道自己的設(shè)計(jì)模式——就像任何好的編程人員那樣 —— 但我太接近我在做的產(chǎn)品以至于不能客觀地衡量我的架構(gòu)決策的有效性。當(dāng)隊(duì)伍中來了另外一位開發(fā)者時(shí),我意識(shí)到我們陷入困境了。

從沒聽過 MVC ?有人稱之為 Massive View Controller(重量級視圖控制器),這就是我們那時(shí)候的感覺。我不打算介紹令人汗顏的細(xì)節(jié),但說實(shí)在的,如果我不得不再次重來一次,我絕對會(huì)做出不同的決策。

我會(huì)修改一個(gè)關(guān)鍵架構(gòu),并將其帶入我從那時(shí)起就在開發(fā)的各種應(yīng)用,即使用一種叫做 Model-View-ViewModel 的架構(gòu)替換 Model-View-Controller。

所以,MVVM 到底是什么?與其專注于說明 MVVM 的來歷,不如讓我們看一個(gè)典型的 iOS 是如何構(gòu)建的,并從那里了解 MVVM:

 

我們看到的是一個(gè)典型的 MVC 設(shè)置。Model 呈現(xiàn)數(shù)據(jù),View 呈現(xiàn)用戶界面,而 View Controller 調(diào)節(jié)它兩者之間的交互。Cool!

稍微考慮一下,雖然 View 和 View Controller 是技術(shù)上不同的組件,但它們幾乎總是手牽手在一起,成對的。你什么時(shí)候看到一個(gè) View 能夠與不同 View Controller 配對?或者反過來?所以,為什么不正規(guī)化它們的連接呢?

這更準(zhǔn)確地描述了你可能已經(jīng)編寫的 MVC 代碼。但它并沒有做太多事情來解決 iOS 應(yīng)用中日益增長的重量級視圖控制器的問題。在典型的 MVC 應(yīng)用里,許多邏輯被放在 View Controller 里。它們中的一些確實(shí)屬于 View Controller,但更多的是所謂的“表示邏輯(presentation logic)”,以 MVVM 屬術(shù)語來說,就是那些將 Model 數(shù)據(jù)轉(zhuǎn)換為 View 可以呈現(xiàn)的東西的事情,例如將一個(gè) NSDate 轉(zhuǎn)換為一個(gè)格式化過的 NSString。

我們的圖解里缺少某些東西,那些使我們可以把所有表示邏輯放進(jìn)去的東西。我們打算將其稱為 “View Model” —— 它位于 View/Controller 與 Model 之間:

看起好多了!這個(gè)圖解準(zhǔn)確地描述了什么是 MVVM:一個(gè) MVC 的增強(qiáng)版,我們正式連接了視圖和控制器,并將表示邏輯從 Controller 移出放到一個(gè)新的對象里,即 View Model。MVVM 聽起來很復(fù)雜,但它本質(zhì)上就是一個(gè)精心優(yōu)化的 MVC 架構(gòu),而 MVC 你早已熟悉。

現(xiàn)在我們知道了什么是 MVVM,但為什么我們會(huì)想要去使用它呢?在 iOS 上使用 MVVM 的動(dòng)機(jī),對我來說,無論如何,就是它能減少 View Controller 的復(fù)雜性并使得表示邏輯更易于測試。通過一些例子,我們將看到它如何達(dá)到這些目標(biāo)。

此處有三個(gè)重點(diǎn)是我希望你看完本文能帶走的:

MVVM 可以兼容你當(dāng)下使用的 MVC 架構(gòu)。
MVVM 增加你的應(yīng)用的可測試性。
MVVM 配合一個(gè)綁定機(jī)制效果最好。
如我們之前所見,MVVM 基本上就是 MVC 的改進(jìn)版,所以很容易就能看到它如何被整合到現(xiàn)有使用典型 MVC 架構(gòu)的應(yīng)用中。讓我們看一個(gè)簡單的 Person Model 以及相應(yīng)的 View Controller:

看起好多了!這個(gè)圖解準(zhǔn)確地描述了什么是 MVVM:一個(gè) MVC 的增強(qiáng)版,我們正式連接了視圖和控制器,并將表示邏輯從 Controller 移出放到一個(gè)新的對象里,即 View Model。MVVM 聽起來很復(fù)雜,但它本質(zhì)上就是一個(gè)精心優(yōu)化的 MVC 架構(gòu),而 MVC 你早已熟悉。

現(xiàn)在我們知道了什么是 MVVM,但為什么我們會(huì)想要去使用它呢?在 iOS 上使用 MVVM 的動(dòng)機(jī),對我來說,無論如何,就是它能減少 View Controller 的復(fù)雜性并使得表示邏輯更易于測試。通過一些例子,我們將看到它如何達(dá)到這些目標(biāo)。

此處有三個(gè)重點(diǎn)是我希望你看完本文能帶走的:

MVVM 可以兼容你當(dāng)下使用的 MVC 架構(gòu)。
MVVM 增加你的應(yīng)用的可測試性。
MVVM 配合一個(gè)綁定機(jī)制效果最好。
如我們之前所見,MVVM 基本上就是 MVC 的改進(jìn)版,所以很容易就能看到它如何被整合到現(xiàn)有使用典型 MVC 架構(gòu)的應(yīng)用中。讓我們看一個(gè)簡單的 Person Model 以及相應(yīng)的 View Controller:

  1. @interface Person : NSObject 
  2.  
  3. - (instancetype)initwithSalutation:(NSString *)salutation firstName:(NSString *)firstName lastName:(NSString *)lastName birthdate:(NSDate *)birthdate; 
  4.  
  5. @property (nonatomic, readonly) NSString *salutation; 
  6. @property (nonatomic, readonly) NSString *firstName; 
  7. @property (nonatomic, readonly) NSString *lastName; 
  8. @property (nonatomic, readonly) NSDate *birthdate; 
  9.  
  10. @end 

Cool!現(xiàn)在我們假設(shè)我們有一個(gè) PersonViewController ,在 viewDidLoad 里,只需要基于它的 model 屬性設(shè)置一些 Label 即可。

  1. - (void)viewDidLoad { 
  2.     [super viewDidLoad]; 
  3.  
  4.     if (self.model.salutation.length > 0) { 
  5.         self.nameLabel.text = [NSString stringWithFormat:@"%@ %@ %@", self.model.salutation, self.model.firstName, self.model.lastName]; 
  6.     } else { 
  7.         self.nameLabel.text = [NSString stringWithFormat:@"%@ %@", self.model.firstName, self.model.lastName]; 
  8.     } 
  9.  
  10.     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
  11.     [dateFormatter setDateFormat:@"EEEE MMMM d, yyyy"]; 
  12.     self.birthdateLabel.text = [dateFormatter stringFromDate:model.birthdate]; 

這全都直截了當(dāng),標(biāo)準(zhǔn)的 MVC。現(xiàn)在來看看我們?nèi)绾斡靡粋€(gè) View Model 來增強(qiáng)它。

  1. @interface PersonViewModel : NSObject 
  2.  
  3. - (instancetype)initWithPerson:(Person *)person; 
  4.  
  5. @property (nonatomic, readonly) Person *person; 
  6.  
  7. @property (nonatomic, readonly) NSString *nameText; 
  8. @property (nonatomic, readonly) NSString *birthdateText; 
  9.  
  10. @end 

我們的 View Model 的實(shí)現(xiàn)大概如下:

  1. @implementation PersonViewModel 
  2.  
  3. - (instancetype)initWithPerson:(Person *)person { 
  4.     self = [super init]; 
  5.     if (!self) return nil; 
  6.  
  7.     _person = person; 
  8.     if (person.salutation.length > 0) { 
  9.         _nameText = [NSString stringWithFormat:@"%@ %@ %@", self.person.salutation, self.person.firstName, self.person.lastName]; 
  10.     } else { 
  11.         _nameText = [NSString stringWithFormat:@"%@ %@", self.person.firstName, self.person.lastName]; 
  12.     } 
  13.  
  14.     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
  15.     [dateFormatter setDateFormat:@"EEEE MMMM d, yyyy"]; 
  16.     _birthdateText = [dateFormatter stringFromDate:person.birthdate]; 
  17.  
  18.     return self; 
  19.  
  20. @end 

Cool!我們已經(jīng)將 viewDidLoad 中的表示邏輯放入我們的 View Model 里了。此時(shí),我們新的 viewDidLoad 就會(huì)非常輕量:

- (void)viewDidLoad {
[super viewDidLoad];

self.nameLabel.text = self.viewModel.nameText;
self.birthdateLabel.text = self.viewModel.birthdateText;
}

所以,如你所見,并沒有對我們的 MVC 架構(gòu)做太多改變。還是同樣的代碼,只不過移動(dòng)了位置。它與 MVC 兼容,帶來更輕量的 View Controllers。

可測試,嗯?是怎樣?好吧,View Controller 是出了名的難以測試,因?yàn)樗鼈冏隽颂嗍虑椤T?MVVM 里,我們試著盡可能多的將代碼移入 View Model 里。測試 View Controller 就變得容易多了,因?yàn)樗鼈儾辉僮鲆淮蠖咽虑椋⑶?View Model 也非常易于測試。讓我們來看看:

  1. SpecBegin(Person) 
  2.     NSString *salutation = @"Dr."; 
  3.     NSString *firstName = @"first"; 
  4.     NSString *lastName = @"last"; 
  5.     NSDate *birthdate = [NSDate dateWithTimeIntervalSince1970:0]; 
  6.  
  7.     it (@"should use the salutation available. ", ^{ 
  8.         Person *person = [[Person alloc] initWithSalutation:salutation firstName:firstName lastName:lastName birthdate:birthdate]; 
  9.         PersonViewModel *viewModel = [[PersonViewModel alloc] initWithPerson:person]; 
  10.         expect(viewModel.nameText).to.equal(@"Dr. first last"); 
  11.     }); 
  12.  
  13.     it (@"should not use an unavailable salutation. ", ^{ 
  14.         Person *person = [[Person alloc] initWithSalutation:nil firstName:firstName lastName:lastName birthdate:birthdate]; 
  15.         PersonViewModel *viewModel = [[PersonViewModel alloc] initWithPerson:person]; 
  16.         expect(viewModel.nameText).to.equal(@"first last"); 
  17.     }); 
  18.  
  19.     it (@"should use the correct date format. ", ^{ 
  20.         Person *person = [[Person alloc] initWithSalutation:nil firstName:firstName lastName:lastName birthdate:birthdate]; 
  21.         PersonViewModel *viewModel = [[PersonViewModel alloc] initWithPerson:person]; 
  22.         expect(viewModel.birthdateText).to.equal(@"Thursday January 1, 1970"); 
  23.     }); 
  24. SpecEnd 

如果我們沒有將這個(gè)邏輯移入 View Model,我們將不得不實(shí)例化一個(gè)完整的 View Controller 以及伴隨的 View,然后去比較我們 View 中 Lable 的值。這樣做不只是會(huì)變成一個(gè)麻煩的間接層,而且它只代表了一個(gè)十分脆弱的測試。現(xiàn)在,我們可以按意愿自由地修改視圖層級而不必?fù)?dān)心破壞我們的單元測試。使用 MVVM 帶來的對于測試的好處非常清晰,甚至從這個(gè)簡單的例子來看也可見一斑,而在有更復(fù)雜的表示邏輯的情況下,這個(gè)好處會(huì)更加明顯。

注意到在這個(gè)簡單的例子中, Model 是不可變的,所以我們可以只在初始化的時(shí)候指定我們 View Model 的屬性。對于可變 Model,我們還需要使用一些綁定機(jī)制,這樣 View Model 就能在背后的 Model 改變時(shí)更新自身的屬性。此外,一旦 View Model 上的 Model 發(fā)生改變,那 View 的屬性也需要更新。Model 的改變應(yīng)該級聯(lián)向下通過 View Model 進(jìn)入 View。

在 OS X 上,我們可以使用 Cocoa 綁定,但在 iOS 上我們并沒有這樣好的配置可用。我們想到了 KVO(Key-Value Observation),而且它確實(shí)做了很偉大的工作。然而,對于一個(gè)簡單的綁定都需要很大的樣板代碼,更不用說有許多屬性需要綁定了。作為替代,我個(gè)人喜歡使用 ReactiveCocoa,但 MVVM 并未強(qiáng)制我們使用 ReactiveCocoa。MVVM 是一個(gè)偉大的典范,它自身獨(dú)立,只是在有一個(gè)良好的綁定框架時(shí)做得更好。

我們覆蓋了不少內(nèi)容:從普通的 MVC 派生出 MVVM,看它們是如何相兼容的范式,從一個(gè)可測試的例子觀察 MVVM,并看到 MVVM 在有一個(gè)配對的綁定機(jī)制時(shí)工作得更好。如果你有興趣學(xué)習(xí)更多關(guān)于 MVVM 的知識(shí),你可以看看這篇博客,它用更多細(xì)節(jié)解釋了 MVVM 的好處,或者這一篇關(guān)于我們?nèi)绾卧谧罱捻?xiàng)目里使用 MVVM 獲得巨大的成功的文章。我同樣還有一個(gè)經(jīng)過完整測試,基于 MVVM 的應(yīng)用,叫做 C-41 ,它是開源的。

責(zé)任編輯:chenqingxiang 來源: 博客園
相關(guān)推薦

2017-02-24 10:02:04

AndroidMVVM應(yīng)用框架

2016-11-30 17:28:02

移動(dòng)開發(fā)iOSAndroid

2013-06-20 10:28:39

MVVM框架avalon架構(gòu)

2017-02-27 09:36:01

AndroidMVVM架構(gòu)

2019-01-29 10:06:31

開源技術(shù) 趨勢

2012-05-11 09:38:00

MVVM Light

2017-07-18 15:13:17

2009-06-19 14:49:43

Spring框架

2022-11-25 07:59:02

SpringJava

2023-05-29 09:18:28

.NET網(wǎng)絡(luò)通信

2009-07-15 10:23:51

Swing SWT集成

2009-08-18 09:17:03

AJAX框架

2016-03-30 09:34:27

2016-03-01 13:48:36

MVVMios快速開發(fā)

2022-02-16 09:01:13

iOSS開發(fā)XCode

2015-01-27 15:25:53

MVVM

2012-06-01 11:10:07

iOS基本框架圖示

2016-03-18 09:36:13

ios基礎(chǔ)框架

2010-03-02 16:09:53

WCF框架

2012-04-19 13:55:19

TitaniumTiMVC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产在线精彩视频| 天堂中文在线观看视频| 中文字幕av亚洲精品一部二部| 9191精品国产综合久久久久久| 7777在线视频| 男女网站在线观看| 国产一区二区三区在线观看免费视频 | www.99在线| 中文字幕有码在线观看| 久久久久久久av麻豆果冻| 国产欧美日韩中文字幕| 久久精品国产亚洲AV无码男同| 国产综合久久久| 精品美女在线播放| 日本黄大片一区二区三区| 成年人国产在线观看| 国产精品灌醉下药二区| 国产精品一区二区三区不卡 | 奇米影视一区二区三区小说| 久久久亚洲国产天美传媒修理工| 最新日韩免费视频| 欧美美女在线| 精品久久久久久久久久久院品网| 亚洲精品久久久久久宅男| а√在线中文在线新版| 亚洲免费观看高清| 亚洲国产精品久久久久婷婷老年| 天堂av在线资源| 国产白丝精品91爽爽久久| 成人激情春色网| 国产精品无码粉嫩小泬| 久久亚洲美女| 欧美在线性视频| 黄色片视频网站| 欧美先锋影音| 久久99精品久久久久久噜噜| 中文字幕手机在线观看| 亚洲精品一区二区妖精| 色婷婷综合成人av| 国产精品av久久久久久无| 国产亚洲一区| 亚洲欧美日韩精品| 亚洲av无码一区二区三区人| 免费av一区二区三区四区| 亚洲精品www久久久久久广东| 无码人妻丰满熟妇区毛片蜜桃精品| 中文成人激情娱乐网| 欧美日韩国产综合久久| 高清一区在线观看| 黑人一区二区三区| 欧美美女一区二区在线观看| 色呦色呦色精品| 欧美黄页免费| 5858s免费视频成人| 日本在线播放一区二区| 欧美一区二区三区婷婷| 国产精品一区二区在线看| 91精品国产综合久久香蕉922| 伊人成人在线观看| 蜜桃视频一区二区| 国产日韩欧美日韩| 国产精品视频第一页| 极品美女销魂一区二区三区| 亚洲free嫩bbb| 亚洲国产剧情在线观看| www.亚洲色图| 日韩欧美亚洲在线| 色影院视频在线| 亚洲精品一卡二卡| 日本免费a视频| 极品av在线| 91成人网在线| 欧美成人手机在线视频| 日本精品一区二区三区在线观看视频| 日韩欧美另类在线| 国产一级免费片| 精品在线手机视频| 久久久国产一区| 久久久久久久久99| 美女久久一区| 91精品啪aⅴ在线观看国产| 国产黄色美女视频| 久久久久久久综合日本| 亚洲午夜精品久久| heyzo高清中文字幕在线| 欧美性猛交视频| 成人黄色一级大片| 欧美美女啪啪| 久久九九国产精品怡红院| 国产大片中文字幕在线观看| 三级亚洲高清视频| 亚洲一区美女视频在线观看免费| 神马久久久久久久久久| 日本一区二区成人| 青青草国产免费| 国产在线|日韩| 精品国产露脸精彩对白| 成人激情五月天| 在线看片日韩| 成人福利在线视频| 日韩有码电影| 亚洲精品欧美专区| 十八禁视频网站在线观看| 久久天堂久久| 最近2019免费中文字幕视频三| 久草视频手机在线观看| 免费成人在线观看| 久久av一区二区三区亚洲| 成人三级网址| 在线日韩av片| 免费的av网站| 欧美日韩mv| 国产精品揄拍一区二区| 外国精品视频在线观看 | 久久久亚洲综合网站| 黄视频网站在线| 在线观看亚洲成人| 欲求不满的岳中文字幕| 欧美精品首页| 91久久久精品| 一级日本在线| 色天天综合色天天久久| 日本japanese极品少妇| 欧美人与禽猛交乱配视频| 国产日韩av在线| eeuss影院www在线播放| 日韩欧美999| 精品国产av色一区二区深夜久久| 欧美一区在线看| 国产免费成人av| 国产福利片在线| 日韩欧美国产黄色| 日本黄色免费观看| 亚洲美女91| 国产伦精品一区二区三区视频黑人 | 日韩av高清不卡| 日本五码在线| 欧美性猛交xxxx免费看漫画 | 日本欧美在线视频| 天堂av电影在线观看| 姬川优奈aav一区二区| 白嫩情侣偷拍呻吟刺激| 亚洲先锋成人| 国产福利不卡| 九九精品调教| 亚洲精品一区二区在线观看| 国产精品50页| 99久久精品免费精品国产| 北条麻妃69av| 少妇精品导航| 国产精品com| 午夜激情在线观看| 欧美福利一区二区| 免费网站看av| 99热精品一区二区| 国产三区在线视频| 日韩成人三级| 成人免费自拍视频| 青春草在线视频| 亚洲国产成人精品电影| 日本免费在线观看视频| 日本一二三不卡| 五月六月丁香婷婷| 亚洲黄色大片| 日本一区二区三区视频在线播放 | 欧美国产一区二区在线| 日韩成人高清| 精品国偷自产在线| 欧美综合视频在线| 色综合天天综合在线视频| 国产精品情侣呻吟对白视频| 国产在线播放一区| www.日韩精品| 日韩在线三区| 粉嫩一区二区三区在线观看| 欧美肥臀大乳一区二区免费视频| 天堂成人在线视频| 在线观看亚洲a| 欧美日韩在线国产| www国产亚洲精品久久麻豆| 手机在线成人免费视频| 国内精品福利| 日韩精品伦理第一区| 经典三级久久| 欧亚精品中文字幕| 搞黄网站在线观看| 亚洲精品小视频| 国产视频一区二区三区四区五区| 亚洲成人动漫一区| 91大神福利视频| 99久久综合国产精品| 嫩草视频免费在线观看| 最新亚洲激情| 五月天av影院| 免费看av成人| 成人av播放| 粉嫩91精品久久久久久久99蜜桃| 欧美激情小视频| 国产69精品久久app免费版| 精品日韩成人av| 一区二区日韩视频| 日韩欧美精品网址| 免费中文字幕视频| 国产精品久久夜| 右手影院亚洲欧美| 丁香婷婷综合五月| 亚洲天堂2018av| 久久久久久夜| 毛片在线播放视频| 欧美1区3d| 尤物国产精品| 国产一区二区三区电影在线观看| 国产精品jizz视频| 国产一区 二区| 国产精品一区二区久久精品| 欧美黑人疯狂性受xxxxx野外| 欧美富婆性猛交| 国产精品扒开做爽爽爽的视频| 亚洲色图第一页| 婷婷色在线视频| 欧美mv日韩mv国产| 国产情侣av在线| 欧美久久久影院| 中文字幕网址在线| 一本到不卡免费一区二区| 伊人久久综合视频| 亚洲成人av一区二区| 麻豆一区产品精品蜜桃的特点| 国产精品高潮呻吟久久| 国产成人免费在线观看视频| 国产亚洲婷婷免费| 六月婷婷七月丁香| 久久久久久久久蜜桃| 国产亚洲无码精品| 久久先锋影音av鲁色资源| 色噜噜在线观看| 99riav一区二区三区| 国产十八熟妇av成人一区| 成人一区二区在线观看| 韩国av中国字幕| 国产成人免费在线视频| 香蕉在线观看视频| 成人av免费观看| 中文字幕无码人妻少妇免费| 97久久精品人人做人人爽50路| 一区二区免费在线观看视频| 99精品视频在线免费观看| 加勒比精品视频| 2020国产精品| 精品人伦一区二区三电影| 欧美国产欧美综合| 992在线观看| 一区二区视频在线| 日韩av一二三区| 色视频一区二区| 亚洲天堂手机版| 日韩一区二区三区四区| 黑人精品一区二区三区| 日韩国产在线播放| 国产高清在线观看| 久久精品国产久精国产一老狼 | 手机在线观看毛片| 亚洲美女在线视频| 9色在线视频网站| 九九综合九九综合| 精精国产xxxx视频在线野外 | 国产又粗又猛又爽又黄的| 日韩午夜三级在线| 天堂а在线中文在线无限看推荐| 在线播放国产一区中文字幕剧情欧美| 免费网站成人| 午夜精品美女自拍福到在线| 日韩av免费| 亚洲一区二区久久久久久| 日韩理论电影中文字幕| 五月天综合网| 亚洲小说欧美另类婷婷| 日本中文字幕高清| 国产不卡高清在线观看视频| 欧美做受xxxxxⅹ性视频| 中文字幕亚洲欧美在线不卡| 中文在线观看免费网站| 欧洲av在线精品| 性中国古装videossex| 亚洲男人的天堂在线播放| 麻豆91在线| 国产99在线|中文| 亚洲精品v亚洲精品v日韩精品| 欧美精品v日韩精品v国产精品| 天天影视综合| 日韩欧美国产免费| 国产麻豆一精品一av一免费| 亚洲AV无码片久久精品| 亚洲综合一二区| 中文字幕有码无码人妻av蜜桃| 亚洲成人av中文字幕| 欧美成年黄网站色视频| 欧美中文在线观看| 在线视频亚洲欧美中文| 亚洲免费视频一区| 亚洲视频福利| 在线观看日本www| 久久精品欧美一区二区三区麻豆| 国产一级中文字幕| 91精品国产综合久久久蜜臀粉嫩| 日本不卡视频一区二区| 久久久久国产精品免费| 自拍偷拍亚洲| 香蕉久久免费影视| 先锋亚洲精品| 妖精视频一区二区| 亚洲精品免费电影| 91av久久久| 亚洲香蕉伊综合在人在线视看| brazzers在线观看| 91精品入口蜜桃| 国产精品成人av| 中文字幕一区二区三区四区在线视频 | 国产精品福利久久久| 日韩av资源网| 欧美又粗又长又爽做受| 国产成人日日夜夜| 黑人巨大精品一区二区在线| 欧美丰满嫩嫩电影| 日日夜夜精品一区| 国产精品久久久久久久久久久新郎 | 给我免费播放日韩视频| 日本道在线视频| 国产精品一区二区三区99| 三级av在线免费观看| 777亚洲妇女| 久久日韩视频| 91亚洲永久免费精品| 亚洲最新色图| 亚洲一区二区图片| 亚洲免费三区一区二区| 国产露脸无套对白在线播放| 久久精品99无色码中文字幕| 久久久久毛片| 中文字幕一区二区三区最新| 激情六月婷婷久久| 久久高清内射无套| 欧美一区二区视频观看视频| 在线heyzo| 成人区精品一区二区| 99在线精品免费视频九九视| 亚洲永久无码7777kkk| 日韩欧美在线观看| 国产黄色在线播放| 国产在线观看一区二区三区| 911久久香蕉国产线看观看| 中文字幕乱码在线人视频| 一区二区三区在线视频免费 | 色阁综合伊人av| 视频91a欧美| 欧美日韩中文字幕在线播放| 粉嫩绯色av一区二区在线观看| 国产稀缺真实呦乱在线| 日韩经典第一页| 成人看片网站| 欧美 日韩 国产 在线观看| 国产成人99久久亚洲综合精品| xxxx 国产| 亚洲欧美日韩天堂| 国产69精品久久久久9999人| 久久久久久久久影视| 成人性视频网站| 国产免费一区二区三区四区五区| 中文字幕亚洲欧美日韩高清| 欧美日本三级| 内射国产内射夫妻免费频道| 中文字幕不卡一区| 亚洲成人一二三区| 日本精品性网站在线观看| 91视频综合| 中文成人无字幕乱码精品区| 在线观看视频一区二区欧美日韩| 超碰人人在线| 久久综合精品一区| 精品一区二区成人精品| 中文字幕亚洲高清| xvideos亚洲人网站| 国产精品nxnn| 污污网站免费观看| 午夜视频一区在线观看| 永久免费在线观看视频| 国产91精品入口17c| 日韩在线一二三区| 久久艹精品视频| 中文字幕日韩综合av| 第一区第二区在线| 粉色视频免费看| 欧美日韩国产一中文字不卡 | 欧美夜福利tv在线| 一区二区三区毛片免费| 日本少妇高潮喷水xxxxxxx| 欧美成人午夜电影| 日韩欧美激情| 日av中文字幕| 亚洲一区av在线|