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

iOS中團隊協作和MVVM的架構設計

移動開發 iOS
由于本人項目經驗有限,關于架構設計方面的東西理解有限,我個人對MVVM的理解主要是借鑒于之前的用過的MVC的Web框架~在學校的時候用過ThinkPHP框架,和SSH框架,都是MVC的架構模式,今天MVVM與傳統的MVC可謂是極為相似,也可以說是兄弟關系,也就是一家人了。

今天寫這篇文章是想達到拋磚引玉的作用,想與大家交流一下思想,相互學習,博文中有不足之處還望大家批評指正。本篇文章的內容沿襲以往博客的風格,也是以干貨為主,偶爾扯扯咸蛋(哈哈~不好好工作又開始發表博客啦~)。

由于本人項目經驗有限,關于架構設計方面的東西理解有限,我個人對MVVM的理解主要是借鑒于之前的用過的MVC的Web框架~在學校的時候用過ThinkPHP框架,和SSH框架,都是MVC的架構模式,今天MVVM與傳統的MVC可謂是極為相似,也可以說是兄弟關系,也就是一家人了。

說到架構設計和團隊協作,這個對App的開發還是比較重要的。即使作為一個專業的搬磚者,前提是你這磚搬完放在哪?不只是Code有框架,其他的東西都是有框架的,比如橋梁等等神馬的~在這兒就不往外扯了。一個好的工程框架不進可以提高團隊的協作效率,同時還可以減少代碼的冗余度和耦合性,合理的分工與系統的架構設計是少不了的。

至于團隊協作不僅僅是有SVN或者Git這些版本控制工具就行的,至于如何在iOS開發中使用SVN,請參考之前的博客(iOS開發之版本控制(SVN))。一個團隊可以高效的工作,本人覺得交流是最為重要的,團隊中的每個人都比較和氣,而且交流上沒有什么障礙(不過有的團隊中總有幾個合不來的人),交流在團隊中最為重要。至于SVN怎么用,那都不是事兒!

好了今天就以我寫的一個Demo來淺談一下iOS開發中的架構設計和團隊協作,今天的咸蛋先到這兒,切入今天的話題。

為了寫今天的博客我花了點時間做了個工程,這個工程后臺的接口用的新浪微博的API來進行測試的,在本文的后面也會跟上GitHub的分享鏈接。OK~說的高大上一些就是,仁者見仁智者見智,交流思想,共同學習。

一、小酌一下MVVM

在這呢也不贅述什么是MVC,神馬又是MVVM了,在百度上谷歌一下一抓一大把,在這兒就簡單的提上一嘴。下面的Demo用的就是MVVM的架構模式。

Model層是少不了的了,我們得有東西充當DTO(數據傳輸對象),當然,用字典也是可以的,編程么,要靈活一些。Model層是比較薄的一層,如果學過Java的小伙伴的話,對JavaBean應該不陌生吧。

ViewModel層,就是View和Model層的粘合劑,他是一個放置用戶輸入驗證邏輯,視圖顯示邏輯,發起網絡請求和其他各種各樣的代碼的極好的地方。說白了,就是把原來ViewController層的業務邏輯和頁面邏輯等剝離出來放到ViewModel層。

View層,就是ViewController層,他的任務就是從ViewModel層獲取數據,然后顯示。

上面對MVVM就先簡單的這么一說,好好的理解并應用的話,還得實戰。

二、關于工程中是否使用StoryBoard的論述

從網上經常看到說不推薦使用StoryBoard或者Xib,推薦用純代碼手寫。個人認為這種觀點是和蘋果設計StoryBoard的初衷相悖的,在我做過的項目中是以StoryBoard為主,xib為輔,然后用代碼整合每個StoryBoard.

舉一個用Storyboard好處的例子就OK了,給控件添加約束,如果用Storyboard完成那是分分秒的事情,而用代碼的添加約束的話是何等的惡心,純代碼寫的話會把大量的時間花在寫UI上,而且技術含量是比較低的,這個個人認為沒什么必要。在團隊合作中負責UI開發的小伙伴只需沒人負責一個Storyboard,各開發各的,用SVN提交時把下面的勾(如下圖)去掉即可,這樣用Storyboard是沒有問題的。然后再用代碼進行整合就OK了。如果你在你的工程中加入了新的資源文件的話,用XCode自帶的SVN提交的話需要吧Project Setting文件一并提交。

三、實戰MVVM(用Xcode創建的Group是虛擬的文件夾,為了便于維護,建議創建物理文件夾,然后再手動引入)

1.下面通過一個實例來體會一下MVVM架構模式,下面是該工程的一級目錄如下,每層之間的交互是用Block的形式來實現的

工程目錄說明:

Request:文件夾下存儲網絡請求的類,下面會給出具體的實現

Config:就是工程的配置文件

Resource:就是工程的資源文件,下面有圖片資源和Storyboard文件資源

Tools是:工具文件類,存放工具類,比如數據正則匹配等。

Vender:存放第三方類庫

Model:這個就不多說了

ViewController:存放ViewController類資源文件,也就是View層

ViewModel:存放各種業務邏輯和網絡請求

2.詳解Request:Request負責網絡請求的東西,具體如下:

NetRequestClass是存放網絡請求的代碼,本工程用的AF,因為本工程只是一個Demo,所以就只封裝了監測網絡狀態,GET請求,POST請求方法,根據現實需要,還可以封裝上傳下載等類方法。

NetRequestClass.h中的代碼如下:

  1. // 
  2. //  NetRequestClass.h 
  3. //  MVVMTest 
  4. // 
  5. //  Created by 李澤魯 on 15/1/6. 
  6. //  Copyright (c) 2015年 李澤魯. All rights reserved. 
  7. // 
  8.   
  9. #import @interface NetRequestClass : NSObject 
  10.   
  11. #pragma 監測網絡的可鏈接性 
  12. + (BOOL) netWorkReachabilityWithURLString:(NSString *) strUrl; 
  13.   
  14. #pragma POST請求 
  15. + (void) NetRequestPOSTWithRequestURL: (NSString *) requestURLString 
  16.                         WithParameter: (NSDictionary *) parameter 
  17.                  WithReturnValeuBlock: (ReturnValueBlock) block 
  18.                    WithErrorCodeBlock: (ErrorCodeBlock) errorBlock 
  19.                      WithFailureBlock: (FailureBlock) failureBlock; 
  20.   
  21. #pragma GET請求 
  22. + (void) NetRequestGETWithRequestURL: (NSString *) requestURLString 
  23.                         WithParameter: (NSDictionary *) parameter 
  24.                 WithReturnValeuBlock: (ReturnValueBlock) block 
  25.                   WithErrorCodeBlock: (ErrorCodeBlock) errorBlock 
  26.                     WithFailureBlock: (FailureBlock) failureBlock; 
  27.   
  28. @end 

NetRequestClass.m中的代碼如下:

  1. // 
  2. //  NetRequestClass.m 
  3. //  MVVMTest 
  4. // 
  5. //  Created by 李澤魯 on 15/1/6. 
  6. //  Copyright (c) 2015年 李澤魯. All rights reserved. 
  7. // 
  8.   
  9. #import "NetRequestClass.h" 
  10.   
  11. @interface NetRequestClass () 
  12.   
  13. @end 
  14.   
  15.   
  16. @implementation NetRequestClass 
  17. #pragma 監測網絡的可鏈接性 
  18. + (BOOL) netWorkReachabilityWithURLString:(NSString *) strUrl 
  19.     __block BOOL netState = NO; 
  20.       
  21.     NSURL *baseURL = [NSURL URLWithString:strUrl]; 
  22.       
  23.     AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL]; 
  24.       
  25.     NSOperationQueue *operationQueue = manager.operationQueue; 
  26.       
  27.     [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
  28.         switch (status) { 
  29.             case AFNetworkReachabilityStatusReachableViaWWAN: 
  30.             case AFNetworkReachabilityStatusReachableViaWiFi: 
  31.                 [operationQueue setSuspended:NO]; 
  32.                 netState = YES; 
  33.                 break
  34.             case AFNetworkReachabilityStatusNotReachable: 
  35.                 netState = NO; 
  36.             default
  37.                 [operationQueue setSuspended:YES]; 
  38.                 break
  39.         } 
  40.     }]; 
  41.       
  42.     [manager.reachabilityManager startMonitoring]; 
  43.       
  44.     return netState; 
  45.   
  46.   
  47. /*************************************** 
  48.  在這做判斷如果有dic里有errorCode 
  49.  調用errorBlock(dic) 
  50.  沒有errorCode則調用block(dic 
  51.  ******************************/ 
  52.   
  53. #pragma --mark GET請求方式 
  54. + (void) NetRequestGETWithRequestURL: (NSString *) requestURLString 
  55.                        WithParameter: (NSDictionary *) parameter 
  56.                 WithReturnValeuBlock: (ReturnValueBlock) block 
  57.                   WithErrorCodeBlock: (ErrorCodeBlock) errorBlock 
  58.                     WithFailureBlock: (FailureBlock) failureBlock 
  59.     AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init]; 
  60.       
  61.     AFHTTPRequestOperation *op = [manager GET:requestURLString parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) { 
  62.         NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; 
  63.         DDLog(@"%@", dic); 
  64.           
  65.         block(dic); 
  66.           
  67.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
  68.         failureBlock(); 
  69.     }]; 
  70.       
  71.     op.responseSerializer = [AFHTTPResponseSerializer serializer]; 
  72.       
  73.     [op start]; 
  74.       
  75.   
  76. #pragma --mark POST請求方式 
  77.   
  78. + (void) NetRequestPOSTWithRequestURL: (NSString *) requestURLString 
  79.                         WithParameter: (NSDictionary *) parameter 
  80.                  WithReturnValeuBlock: (ReturnValueBlock) block 
  81.                    WithErrorCodeBlock: (ErrorCodeBlock) errorBlock 
  82.                      WithFailureBlock: (FailureBlock) failureBlock 
  83.     AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init]; 
  84.       
  85.     AFHTTPRequestOperation *op = [manager POST:requestURLString parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) { 
  86.         NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; 
  87.           
  88.         DDLog(@"%@", dic); 
  89.           
  90.         block(dic); 
  91.         /*************************************** 
  92.          在這做判斷如果有dic里有errorCode 
  93.          調用errorBlock(dic) 
  94.          沒有errorCode則調用block(dic 
  95.          ******************************/ 
  96.           
  97.     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
  98.         failureBlock(); 
  99.     }]; 
  100.       
  101.     op.responseSerializer = [AFHTTPResponseSerializer serializer]; 
  102.       
  103.     [op start]; 
  104.   
  105.   
  106.   
  107.   
  108.   
  109. @end 

3.詳解Config:創建pch文件,和Config.h文件

pch文件引入常用的頭文件,內容如下:

  1. // 
  2. //  PrefixHeader.pch 
  3. //  MVVMTest 
  4. // 
  5. //  Created by 李澤魯 on 15/1/6. 
  6. //  Copyright (c) 2015年 李澤魯. All rights reserved. 
  7. // 
  8.   
  9. #ifndef MVVMTest_PrefixHeader_pch 
  10. #define MVVMTest_PrefixHeader_pch 
  11.   
  12. #import"AFNetworking.h" 
  13. #import "UIKit+AFNetworking.h" 
  14. #import "Config.h" 
  15.   
  16. #import "NetRequestClass.h" 
  17. #import "SVProgressHUD.h" 
  18. #endif 

Config.h中就是各種宏定義和各種枚舉類型和block類型,代碼如下:

  1. // 
  2. //  Config.h 
  3. //  MVVMTest 
  4. // 
  5. //  Created by 李澤魯 on 15/1/6. 
  6. //  Copyright (c) 2015年 李澤魯. All rights reserved. 
  7. // 
  8.   
  9. #ifndef MVVMTest_Config_h 
  10. #define MVVMTest_Config_h 
  11.   
  12. //定義返回請求數據的block類型 
  13. typedef void (^ReturnValueBlock) (id returnValue); 
  14. typedef void (^ErrorCodeBlock) (id errorCode); 
  15. typedef void (^FailureBlock)(); 
  16. typedef void (^NetWorkBlock)(BOOL netConnetState); 
  17.   
  18. #define DDLog(xx, ...)  NSLog(@"%s(%d): " xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
  19.   
  20. //accessToken 
  21. #define ACCESSTOKEN @"你自己的access_token" 
  22.   
  23. //請求公共微博的網絡接口 
  24. #define REQUESTPUBLICURL @"https://api.weibo.com/2/statuses/public_timeline.json" 
  25.   
  26. #define SOURCE @"source" 
  27. #define TOKEN @"access_token" 
  28. #define COUNT @"count" 
  29.   
  30. #define STATUSES @"statuses" 
  31. #define CREATETIME @"created_at" 
  32. #define WEIBOID @"id" 
  33. #define WEIBOTEXT @"text" 
  34. #define USER @"user" 
  35. #define UID @"id" 
  36. #define HEADIMAGEURL @"profile_image_url" 
  37. #define USERNAME @"screen_name" 
  38.   
  39. #endif 

4.詳解資源文件Resource,結構如下圖:

Image中就存放各種圖片(3x,2x等),InterfaceBuider里面就是放一些Xib和Storyboard文件,每個負責UI的開發人員負責一個Storyboard

5.詳解Model:本工程用的是請求公共微博接口我們需要在頁面上現實用戶的頭像,用戶名,發布日期,博文,已經隱式的用戶ID和微博ID,文件目錄結構如下:

PublicModel中的內容如下:

  1. // 
  2. //  PublicModel.h 
  3. //  MVVMTest 
  4. // 
  5. //  Created by 李澤魯 on 15/1/8. 
  6. //  Copyright (c) 2015年 李澤魯. All rights reserved. 
  7. // 
  8.   
  9. #import @interface PublicModel : NSObject 
  10. @property (strong, nonatomic) NSString *userId; 
  11. @property (strong, nonatomic) NSString *weiboId; 
  12. @property (strong, nonatomic) NSString *userName; 
  13. @property (strong, nonatomic) NSURL *imageUrl; 
  14. @property (strong, nonatomic) NSString *date; 
  15. @property (strong, nonatomic) NSString *text; 
  16.   
  17. @end 

6.詳解ViewModel層,本層是最為重要的一層,下面是本層的詳細截圖,ViewModeClass是所有ViewMode的父類,其中存儲著共同部分

ViewModelClass.h中的內容如下:

  1. // 
  2. //  ViewModelClass.h 
  3. //  MVVMTest 
  4. // 
  5. //  Created by 李澤魯 on 15/1/8. 
  6. //  Copyright (c) 2015年 李澤魯. All rights reserved. 
  7. // 
  8.   
  9. #import @interface ViewModelClass : NSObject 
  10.   
  11. @property (strong, nonatomic) ReturnValueBlock returnBlock; 
  12. @property (strong, nonatomic) ErrorCodeBlock errorBlock; 
  13. @property (strong, nonatomic) FailureBlock failureBlock; 
  14.   
  15.   
  16. //獲取網絡的鏈接狀態 
  17. -(void) netWorkStateWithNetConnectBlock: (NetWorkBlock) netConnectBlock WithURlStr: (NSString *) strURl; 
  18.   
  19. // 傳入交互的Block塊 
  20. -(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock 
  21.                  WithErrorBlock: (ErrorCodeBlock) errorBlock 
  22.                WithFailureBlock: (FailureBlock) failureBlock; 
  23. @end 

ViewModelClass.m中的內容如下:

  1. // 
  2. //  ViewModelClass.m 
  3. //  MVVMTest 
  4. // 
  5. //  Created by 李澤魯 on 15/1/8. 
  6. //  Copyright (c) 2015年 李澤魯. All rights reserved. 
  7. // 
  8.   
  9. #import "ViewModelClass.h" 
  10. @implementation ViewModelClass 
  11.   
  12. #pragma 獲取網絡可到達狀態 
  13. -(void) netWorkStateWithNetConnectBlock: (NetWorkBlock) netConnectBlock WithURlStr: (NSString *) strURl; 
  14.     BOOL netState = [NetRequestClass netWorkReachabilityWithURLString:strURl]; 
  15.     netConnectBlock(netState); 
  16.   
  17. #pragma 接收穿過來的block 
  18. -(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock 
  19.                  WithErrorBlock: (ErrorCodeBlock) errorBlock 
  20.                WithFailureBlock: (FailureBlock) failureBlock 
  21.     _returnBlock = returnBlock; 
  22.     _errorBlock = errorBlock; 
  23.     _failureBlock = failureBlock; 
  24.   
  25. @end 

PublicWeiboViewModel.m中的內容如下:

  1. // 
  2. //  PublicWeiboViewModel.m 
  3. //  MVVMTest 
  4. // 
  5. //  Created by 李澤魯 on 15/1/8. 
  6. //  Copyright (c) 2015年 李澤魯. All rights reserved. 
  7. // 
  8.   
  9. #import "PublicWeiboViewModel.h" 
  10. #import "PublicDetailViewController.h" 
  11.   
  12. @implementation PublicWeiboViewModel 
  13.   
  14. //獲取公共微博 
  15. -(void) fetchPublicWeiBo 
  16.     NSDictionary *parameter = @{TOKEN: ACCESSTOKEN, 
  17.                                 COUNT: @"100" 
  18.                                 }; 
  19.     [NetRequestClass NetRequestGETWithRequestURL:REQUESTPUBLICURL WithParameter:parameter WithReturnValeuBlock:^(id returnValue) { 
  20.           
  21.         DDLog(@"%@", returnValue); 
  22.         [self fetchValueSuccessWithDic:returnValue]; 
  23.           
  24.     } WithErrorCodeBlock:^(id errorCode) { 
  25.         DDLog(@"%@", errorCode); 
  26.         [self errorCodeWithDic:errorCode]; 
  27.           
  28.     } WithFailureBlock:^{ 
  29.         [self netFailure]; 
  30.         DDLog(@"網絡異常"); 
  31.           
  32.     }]; 
  33.       
  34.   
  35.   
  36.   
  37. #pragma 獲取到正確的數據,對正確的數據進行處理 
  38. -(void)fetchValueSuccessWithDic: (NSDictionary *) returnValue 
  39.     //對從后臺獲取的數據進行處理,然后傳給ViewController層進行顯示 
  40.       
  41.     NSArray *statuses = returnValue[STATUSES]; 
  42.     NSMutableArray *publicModelArray = [[NSMutableArray alloc] initWithCapacity:statuses.count]; 
  43.       
  44.     for (int i = 0; i < statuses.count; i ++) { 
  45.         PublicModel *publicModel = [[PublicModel alloc] init]; 
  46.           
  47.         //設置時間 
  48.         NSDateFormatter *iosDateFormater=[[NSDateFormatter alloc]init]; 
  49.         iosDateFormater.dateFormat=@"EEE MMM d HH:mm:ss Z yyyy"
  50.           
  51.         //必須設置,否則無法解析 
  52.         iosDateFormater.locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_US"]; 
  53.         NSDate *date=[iosDateFormater dateFromString:statuses[i][CREATETIME]]; 
  54.           
  55.         //目的格式 
  56.         NSDateFormatter *resultFormatter=[[NSDateFormatter alloc]init]; 
  57.         [resultFormatter setDateFormat:@"MM月dd日 HH:mm"]; 
  58.           
  59.         publicModel.date = [resultFormatter stringFromDate:date]; 
  60.         publicModel.userName = statuses[i][USER][USERNAME]; 
  61.         publicModel.text = statuses[i][WEIBOTEXT]; 
  62.         publicModel.imageUrl = [NSURL URLWithString:statuses[i][USER][HEADIMAGEURL]]; 
  63.         publicModel.userId = statuses[i][USER][UID]; 
  64.         publicModel.weiboId = statuses[i][WEIBOID]; 
  65.           
  66.         [publicModelArray addObject:publicModel]; 
  67.           
  68.     } 
  69.       
  70.     self.returnBlock(publicModelArray); 
  71.   
  72. #pragma 對ErrorCode進行處理 
  73. -(void) errorCodeWithDic: (NSDictionary *) errorDic 
  74.     self.errorBlock(errorDic); 
  75.   
  76. #pragma 對網路異常進行處理 
  77. -(void) netFailure 
  78.     self.failureBlock(); 
  79.   
  80.   
  81. #pragma 跳轉到詳情頁面,如需網路請求的,可在此方法中添加相應的網絡請求 
  82. -(void) weiboDetailWithPublicModel: (PublicModel *) publicModel WithViewController:(UIViewController *)superController 
  83.     DDLog(@"%@,%@,%@",publicModel.userId,publicModel.weiboId,publicModel.text); 
  84.     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
  85.     PublicDetailViewController *detailController = [storyboard instantiateViewControllerWithIdentifier:@"PublicDetailViewController"]; 
  86.     detailController.publicModel = publicModel; 
  87.     [superController.navigationController pushViewController:detailController animated:YES]; 
  88.       
  89.   
  90.   
  91. @end 

7.ViewController層的目錄結構如下:

上面的代碼就不一一粘了(主要是手按command + C 按累了),后面的鏈接會有源碼

8.storybord中的結構如下:

運行的最終效果:

 

9.完整目錄結構,頁面間的業務邏輯,和網絡的請求數據是放在ViewModel層的,當然了這也不是絕對的,要靈活把握。我個人是特別喜歡編程的,因為編程靈活起來就會很有樂趣。

10.文章快結束了,在這兒在總結一下SVN使用頻率比較高的而且比較重要的命令吧(當然,本人平時主要是用XCode自帶的SVN可視化管理~)

(1)、更新本地代碼命令

svn up 更新版本

svn info 查看當前版本信息

(2)、代碼的提交

svn info 查看當前本地版本信息

svn up 更新到最新版本信息

svn st 查看文件狀態 M-修改 D-刪除 A-添加 U-更新 ?-未知狀態 !-警告 C-沖突

svn add fileName: 如果出現?一般是添加文件時出的問題,在把文件svn add fileName一下后,該文件的狀態會改成A

svn del fileName:如果出現!一般是刪除文件時會出現的警告需呀執行svn del fileName命令后,該文件的狀態會改成D

svn ci -m"提交的原因"

責任編輯:chenqingxiang 來源: 清風玉露一相逢博客
相關推薦

2023-04-11 07:50:27

軟件架構設計

2021-07-21 16:30:38

iOSAPP架構

2009-07-06 10:36:41

敏捷開發

2021-04-19 10:06:19

NVIDIA

2017-05-17 14:51:31

DNS架構負載均衡

2025-04-15 04:00:00

2022-06-16 10:58:52

物聯網安全安全漏洞

2016-05-09 09:26:06

架構ios網絡層

2012-08-28 11:15:57

IBMdw

2013-05-27 10:58:28

Tumblr架構設計雅虎收購

2012-04-09 13:39:37

ibmdw

2023-05-12 08:06:46

Kubernetes多云架構

2015-08-18 13:58:07

2011-04-08 17:03:19

Java架構

2023-09-21 18:14:34

VSCode擴展工具

2025-01-15 08:10:29

Java架構代碼

2015-06-02 04:17:44

架構設計審架構設計說明書

2025-05-09 08:45:13

2021-11-08 06:57:35

Redis架構設計

2015-10-23 13:25:12

Github團隊協作Pull
點贊
收藏

51CTO技術棧公眾號

97超碰人人模人人爽人人看| 一区二区三区四区在线观看视频| 国产资源在线免费观看| 国产精品美女一区| 雨宫琴音一区二区在线| 亚洲精品福利免费在线观看| 国产又黄又猛视频| 国产鲁鲁视频在线观看特色| 国产传媒欧美日韩成人| 欧美中文字幕在线| 欧美性猛交xxxx乱大交少妇| 9l亚洲国产成人精品一区二三| 精品日本美女福利在线观看| 亚洲精品中字| 亚洲不卡免费视频| 三级精品在线观看| 欧美俄罗斯性视频| 人妻少妇无码精品视频区| 不卡一区视频| 在线免费观看一区| 日韩精品一区二区免费| 尤物视频在线免费观看| av福利精品导航| 国产欧美在线看| 国产超碰人人爽人人做人人爱| 久久亚洲影视| 亚洲人成网站777色婷婷| 欧美国产在线一区| 麻豆精品蜜桃| 亚洲午夜久久久久久久久电影院| 亚洲欧美电影在线观看| 色网站在线免费观看| 国产精品小仙女| 国产精品福利网| a v视频在线观看| 午夜精品久久久久99热蜜桃导演| 中文字幕在线看视频国产欧美在线看完整 | 日韩美女在线观看一区| 激情综合网五月天| 99久久婷婷国产综合精品电影√| 亚洲视频777| 国产精品久久久久久亚洲色| 国产精品麻豆| 欧美乱妇15p| 三级a在线观看| 激情都市亚洲| 懂色aⅴ精品一区二区三区蜜月 | 91免费高清视频| 91麻豆精品在线| 免费亚洲视频| 欧美专区在线播放| 国产午夜精品无码| 在线不卡欧美| 97国产精品人人爽人人做| 妺妺窝人体色www在线下载| 亚洲欧洲美洲一区二区三区| 精品国内亚洲在观看18黄 | 久久久精品麻豆| 性欧美freehd18| 91福利区一区二区三区| 人妻内射一区二区在线视频| 欧美xxxhd| 亚洲成精国产精品女| 国内精品国产三级国产99| 日韩国产高清一区| 久热精品在线观看| 欧美激情综合| 久久久久久久久爱| 久久精品久久精品久久| 亚洲日本激情| 日本精品性网站在线观看| 国产成人精品一区二三区| 亚洲免费影视| 国产成人福利网站| 中文在线观看av| 精品一区二区精品| 亚洲综合自拍一区| 老熟妇高潮一区二区高清视频| 成人蜜臀av电影| 久久精品欧美| av中文字幕在线| 亚洲天堂2014| 欧美性潮喷xxxxx免费视频看| 国产精品13p| 在线国产亚洲欧美| 污污视频网站在线| 51vv免费精品视频一区二区| 日韩精品免费综合视频在线播放| 中文字幕在线观看网址| 日本成人小视频| 久久99精品国产99久久6尤物| 国产a∨精品一区二区三区仙踪林| 首页欧美精品中文字幕| 国产专区欧美专区| 少妇人妻精品一区二区三区| 国产日韩成人精品| 国风产精品一区二区| 久草在线资源福利站| 欧美日韩一区二区三区免费看| 韩国三级丰满少妇高潮| 免费久久久久久久久| yellow中文字幕久久| 国产乡下妇女做爰| 美女久久久精品| 97神马电影| 精品资源在线看| 亚洲欧洲综合另类| 日本精品www| 美女精品久久| 在线播放日韩欧美| 日韩成人免费在线观看| 久国产精品韩国三级视频| 国产欧美日韩一区二区三区| 69久久夜色| 亚洲成av人片一区二区梦乃| 日韩肉感妇bbwbbwbbw| 久久视频在线观看| 久久精彩免费视频| 成人免费毛片男人用品| 成人性色生活片免费看爆迷你毛片| 日韩av一区二区三区美女毛片| sqte在线播放| 欧美一区二区三区日韩| 亚洲黄色网址大全| 国产情侣一区| 国产精品毛片va一区二区三区| www.成人.com| 一本到不卡免费一区二区| 色哟哟免费视频| 久久久影院免费| 国产精品高清在线| 婷婷亚洲一区二区三区| 亚洲免费av观看| 欧美美女性视频| 精品美女视频| 欧美在线亚洲一区| 午夜视频在线播放| 亚洲妇女屁股眼交7| 性色av浪潮av| 欧美视频福利| 99国产超薄肉色丝袜交足的后果| 日韩精品黄色| 欧美日韩成人在线一区| 欧美老女人性生活视频| 天堂午夜影视日韩欧美一区二区| 久草热久草热线频97精品| 黄色小说在线播放| 欧美一区中文字幕| 亚洲av无码一区二区三区在线| 老司机精品视频在线| 亚洲国产精品久久久久久女王| 手机看片久久| 在线视频一区二区| 中文字幕一区二区三区四区免费看 | 欧美精品国产精品日韩精品| 成人av免费播放| 亚洲最色的网站| 四虎国产精品永久免费观看视频| 中文字幕一区二区三区乱码图片 | 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 99精品综合| 国产在线观看精品| av在线网址观看| 日韩精品一区二区三区视频在线观看| 五月天丁香激情| 成人动漫在线一区| 免费成人午夜视频| 在线一级成人| 国产精品男人的天堂| 蜜桃av在线免费观看| 91麻豆精品国产自产在线观看一区 | 久久精品66| 欧洲精品久久久| av在线免费一区| 91精品久久久久久蜜臀| 久久国产在线视频| jiyouzz国产精品久久| aaa毛片在线观看| 日韩理论电影| 成人自拍爱视频| 精品丝袜在线| 中文字幕综合在线| 性生活三级视频| 日韩欧美福利视频| 人妻无码一区二区三区免费| 国产精品自拍三区| 女性女同性aⅴ免费观女性恋 | 黄黄视频在线观看| 风间由美一区二区av101| 日韩美女免费观看| 成码无人av片在线观看网站| 亚洲国产三级网| 亚洲第一区av| 亚洲午夜在线视频| 亚洲色图欧美色| 成人激情免费网站| 91香蕉视频导航| 亚洲福利一区| 亚洲资源视频| 五月天亚洲一区| 成人午夜小视频| 成人av免费电影网站| 久久在线视频在线| 国产美女性感在线观看懂色av| 日韩一级高清毛片| 日韩熟女一区二区| 亚洲一区日韩精品中文字幕| 99精品欧美一区二区| 成人美女视频在线观看18| 午夜免费看视频| 国产一区91| 国产激情在线看| 成人精品电影| 久久亚裔精品欧美| caoporn成人免费视频在线| 国产精品久久久久久久久久久新郎 | 日韩区欧美区| 国产精品久久久久久久久久久久久久| av电影免费在线看| 欧美成人一区在线| www亚洲人| 亚洲女人天堂av| 乱色精品无码一区二区国产盗| 欧美性猛交xxxx黑人交| 毛片基地在线观看| 亚洲精品视频自拍| 国产在线免费av| 久久久亚洲精品一区二区三区| 好吊操视频这里只有精品| 美国av一区二区| 无码少妇一区二区三区芒果| 国产乱码精品| 91九色在线观看视频| 亚洲高清资源| 日韩视频一二三| 五月开心六月丁香综合色啪| 亚洲精品视频一二三| 精品国产不卡| 久久久久久99| 日韩av影院| 久久精品99| 日韩福利视频一区| 国产欧美一区二区三区另类精品| 欧美三级一区| 91在线观看免费观看| av国产精品| 91久久精品美女| 国产精品久久免费视频 | 91成品人影院| 欧美日韩黄视频| 一级黄色片在线看| 欧美日韩性生活| 一区二区三区黄| 欧美一区二区在线视频| 国产三级自拍视频| 日韩欧美国产精品| 亚洲精品一区二区三区蜜桃| 精品国产乱码久久久久久1区2区| 性一交一乱一乱一视频| 亚洲国产成人久久综合| 亚洲欧美日韩综合在线| 亚洲欧美日韩一区二区在线| 黄色在线播放| 日韩中文在线观看| 97caopron在线视频| 欧美国产日本在线| 日韩伦理在线一区| 人人爽久久涩噜噜噜网站| 欧美va在线观看| 91亚洲精品久久久久久久久久久久| 久久久久久久久成人| 国产日韩欧美精品| 亚洲ab电影| 一区二区三区偷拍| 欧美日韩国产综合网| www.av片| 免费观看久久久4p| 性生交大片免费看l| 99久久久久久99| 国产极品视频在线观看| 自拍视频在线观看一区二区| 免费视频一二三区| 狠狠躁夜夜躁人人爽超碰91| 在线观看国产成人| 欧美videossexotv100| 香港一级纯黄大片| 色偷偷噜噜噜亚洲男人| 成人影院在线播放| 国产精品对白刺激| 成人自拍在线| 色涩成人影视在线播放| 欧美日韩亚洲一区在线观看| 国产精品-区区久久久狼| 久色婷婷小香蕉久久| 亚洲色图欧美日韩| 国产欧美一区二区在线| 久久久国产精品人人片| 色素色在线综合| www.中文字幕| 一区二区三区久久精品| 一区二区三区伦理| 国产精品久久久久不卡| 黄色欧美在线| 国产免费xxx| 日韩和欧美一区二区三区| 色哟哟在线观看视频| 国产日韩在线不卡| 久久久久久久久艹| 精品视频在线免费看| 人妻无码中文字幕免费视频蜜桃| 一本久久综合亚洲鲁鲁| 17videosex性欧美| 成人有码视频在线播放| 国产一区二区三区电影在线观看| 日本大片免费看| 精品一区二区三区欧美| xxxx日本免费| 亚洲成a人在线观看| 国产av无码专区亚洲a∨毛片| 亚洲视频在线看| а√天堂资源官网在线资源| 5g国产欧美日韩视频| 99久久这里只有精品| 别急慢慢来1978如如2| 99国产精品久久久久久久久久久 | 欧美成人精品一区二区三区在线看| 久久久久免费看黄a片app| 国产麻豆精品一区二区| 黄色一级片一级片| 日本道在线观看一区二区| 污视频在线免费| 久久久久久久999精品视频| 国产在线视频欧美一区| 亚洲图片欧洲图片日韩av| 日韩黄色在线观看| 国产真实乱人偷精品人妻| 欧美性videos高清精品| 香蕉视频黄在线观看| 97精品一区二区三区| 国产一区二区三区不卡av| 久久这里只有精品8| 国产精品一区一区| 国产精品 欧美激情| 日韩一级片在线观看| 在线看三级电影| 999日本视频| 国产精品地址| 亚洲少妇一区二区三区| 亚洲精品免费播放| 精品国产av鲁一鲁一区| 欧美成人精品xxx| 香蕉成人app| 精品人妻少妇一区二区| va亚洲va日韩不卡在线观看| 天堂网av手机版| 精品视频—区二区三区免费| 美女一区网站| 特级西西444www大精品视频| 免费在线观看视频一区| 99re6热在线精品视频| 欧美嫩在线观看| 污污网站在线看| 国产嫩草一区二区三区在线观看| 亚洲三级免费| 好吊视频在线观看| 欧美综合一区二区| 黄色免费网站在线观看| 超碰97在线人人| 西西裸体人体做爰大胆久久久| 无码一区二区三区在线| 欧美三片在线视频观看| 麻豆传媒在线免费看| 国产精品加勒比| 午夜在线a亚洲v天堂网2018| 亚洲色图 激情小说| 欧美成人激情免费网| 亚洲天堂手机| 在线观看一区二区三区三州 | 欧洲av一区二区嗯嗯嗯啊| 欧洲不卡av| 国产精品一区二区av| 日韩综合小视频| 国产1区2区3区4区| 日韩av在线导航| 精品乱码一区二区三区四区| 久久久国内精品| 久久精品欧美一区二区三区不卡 | 久草成人在线视频| 亚洲男人天天操| 国产精品一区二区美女视频免费看| 91丨porny丨探花| 国产精品久久久一区麻豆最新章节| 超碰在线观看av| 国产精品高精视频免费| 亚洲视频综合| 国产一区在线观看免费| 亚洲精品二三区| 国产成年精品| 三级a在线观看| 亚洲va韩国va欧美va|