久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用NSOperations和NSOperationQueues

發布時間:2023/12/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用NSOperations和NSOperationQueues 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Soheil Azarpour

第一部分


學習如何在你的app中使用NSOperations!

這篇博客是由iOS個人開發者Soheil Moayedi Azarpour發布的。

每個人都會在使用iOS或者Mac app,點擊按鈕或者輸入文本時,有過讓人沮喪的經歷,突然間,用戶交互界面停止了響應。

你真幸運 – 你只能盯著沙漏或者旋轉的風火輪一段時間直到能夠再次和UI界面交互為止!挺討厭的,不是嗎?

在一款移動端iOS程序中,用戶期望你的app可以即時地響應他們的觸摸操作,然而當它不響應時,app就會讓人覺得反應遲鈍,通常會導致不好的評價。

然而說的容易做就難。一旦你的app需要執行多個任務,事情很快就會變得復雜起來。在主運行回路中并沒有很多時間去執行繁重的工作,并且還有一直提供可響應的UI界面。

可憐的開發者要怎么做呢?一種方法是通過并發操作將部分任務從主線程中撤離。并發操作意味著你的程序可以在操作中同時執行多個流(或者線程)- 這樣,當你執行任務時,交互界面可以保持響應。

一種在iOS中執行并發操作的方法,是使用NSOperation和NSOperationQueue類。在本教程中,你將學習如何使用它們!你會先創建一款不使用多線程的app,這樣它會變得響應非常遲鈍。然后改進程序,添加上并行操作 – 并且希望 – 可以提供一個交互響應更好的界面給用戶!

在開始閱讀這篇教程之前,先閱讀我們的?Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial會很有幫助。然而,因為本篇教程比較通俗易懂,所以也可以不必閱讀這篇文章。

背景知識

在你學習這篇教程之前,有幾個技術概念需要先解決下。

也許你聽說過并發和并行操作。從技術角度來看,并發是程序的屬性,而并行運作是機器的屬性。并行和并發是兩種分開的概念。作為程序員,你不能保證你的代碼會在能并行執行你的代碼的機器上運行。然而,你可以設計你的代碼,讓它使用并發操作。

首先,有必要定義幾個術語:

  • 任務:一項需要完成的,簡單,單一的任務。
  • 線程:一種由操作系統提供的機制,允許多條指令在一個單獨的程序中同時執行。
  • 進程:一段可執行的代碼,它可以由幾個線程組成。

注意:在iPhone和Mac中,線程功能是由POSIX Threads API(或者pthreads)提供的,它是操作系統的一部分。這是相當底層的東西,你會發現很容易犯錯;也許線程最壞的地方就是那些極難被發現的錯誤吧!

Foundation 框架包含了一個叫做NSThread的類,他更容易處理,但是使用NSThread管理多個線程仍然是件令人頭疼的事情。NSOperation和NSOperationQueue是更高級別的類,他們大大簡化了處理多個線程的過程。

在這張圖中,你可以看到進程,線程和任務之間的關系:

進程,線程和任務

正如你看到的,一個進程包含多個可執行的線程,而且每個線程可以同時執行多項任務。

在這張圖中,線程2執行了讀文件的操作,而線程1執行了用戶界面相關的代碼。這跟你在iOS中構建你的代碼很相似 – 主線程應該執行任何與用戶界面有關的任務,然后二級線程應該執行緩慢的或者長時間的操作(例如讀文件,訪問網絡,等等。)

NSOperation vs. Grand Central Dispatch (GCD)

你也許聽說過?Grand Central Dispatch (GCD)。簡而言之,GCD包含語言特性,運行時刻庫和系統增強(提供系統性和綜合性的提升,從而在iOS和OS X的多核硬件上支持并發操作)。如果你希望更多的了解GCD,你可以閱讀我們的Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial教程。

在Mac OS X v10.6和iOS4之前,NSOperation 與 NSOperationQueue 不同于GCD,他們使用了完全不同的機制。從Mac OS X v10.6和iOS4開始,NSOperation 和 NSOperationQueue是建立在GCD上的。作為一種通例,蘋果推薦使用最高級別的抽象,然而當評估顯示有需要時,會突然降到更低級別。

以下是對兩者的快速比較,它會幫助你決定何時何地去使用GCD或者NSOperation和NSOperationQueue;

  • GCD是一種輕量級的方法來代表將要被并發執行的任務單位。你并不需要去計劃這些任務單位;系統會為你做計劃。在塊(block)中添加依賴會是一件令人頭疼的事情。取消或者暫停一個塊會給一個開發者產生額外的工作!:]
  • NSOperation和NSOperationQueue 對比GCD會帶來一點額外的系統開銷,但是你可以在多個操作(operation)中添加附屬。你可以重用操作,取消或者暫停他們。NSOperation和?Key-Value Observation (KVO)是兼容的;例如,你可以通過監聽NSNotificationCenter去讓一個操作開始執行。

初步的工程模型

在工程的初步模型中,你有一個由字典作為其數據來源的table view。字典的關鍵字是圖片的名字,每個關鍵字的值是圖片所在的URL地址。本工程的目標是讀取字典的內容,下載圖片,應用圖片濾鏡操作,最后在table view中顯示圖片。

以下是該模型的示意圖:

初步模型

實現 – 你可能會首先想到的方法…

注意:
如果你不想先創建一個非線程版本的工程,而是想直接進入多線程方向,你可以跳過這一節,下載我們在本節中創建的第一版本工程。

所有的圖片來自stock.xchng。在數據源中的某些圖片是有意命名錯誤,這樣就有例子去測試下載圖片失敗的情況。

啟動Xcode并使用iOSApplicationEmpty Application模版創建一個新工程,然后點擊下一步。將它命名為ClassicPhotos。選擇Universal, 勾選上Use Automatic Reference Counting(其他都不要選),然后點擊下一步。將工程保存到任意位置。

從Project Navigator中選擇ClassicPhoto工程。選擇Targets ClassicPhotosBuild Phases 然后展開Link Binary with Libraries。使用+按鈕添加Core Image framework(你將需要Core Image來做圖像濾鏡處理)。

在Project Navigator中切換到AppDelegate.h 文件,然后導入ListViewController文件 — 它將會作為root view controller,接下來你會定義它。ListViewController是UITableViewController的子類。

#import "ListViewController.h"

切換到AppDelegate.m文件,找到application:didFinishLaunchingWithOptions:方法。Init和alloc一個ListViewController的實例變量。將它包在UINavigationController中,然后設置它為UIWindow的root view controller.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];self.window.backgroundColor = [UIColor whiteColor];/*ListViewController is a subclass of UITableViewController.We will display images in ListViewController.Here, we wrap our ListViewController in a UINavigationController, and set it as the root view controller.*/ListViewController *listViewController = [[ListViewController alloc] initWithStyle:UITableViewStylePlain];UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:listViewController];self.window.rootViewController = navController;[self.window makeKeyAndVisible];return YES; }

注意: 如果你之前還沒有這樣創建過一個用戶界面,那么這就是在不需要使用Storyboards或者Interface Builder的情況下,用純代碼形式去創建一個用戶界面的方法。

接下來創建一個UITableViewController的子類,然后命名它為ListViewController. 切換到ListViewController.h文件,并對它做以下修改:

//1 #import UIKit/UIKit.h #import CoreImage/CoreImage.h// 2 #define kDatasourceURLString @"http://www.raywenderlich.com/downloads/ClassicPhotosDictionary.plist"// 3 @interface ListViewController : UITableViewController// 4 @property (nonatomic, strong)NSDictionary *photos; // main data source of controller @end

讓我們一段一段地過一遍上面的代碼:

  • 導入UIKit和Core Image。
  • 方便起見,定義kDatasourceURLString為數據源文件所在位置的URL字符串。
  • 通過替換NSObject為UITableViewController,讓ListViewController繼承UITableViewController。
  • 定義NSDictionary的一個實例。這會是數據源。
  • 現在,切換到ListViewController.m文件,添加以下代碼:

    @implementation ListViewController //1 @synthesize photos = _photos;#pragma mark - #pragma mark - Lazy instantiation// 2 - (NSDictionary *)photos {if (!_photos) {NSURL *dataSourceURL = [NSURL URLWithString:kDatasourceURLString];_photos = [[NSDictionary alloc] initWithContentsOfURL:dataSourceURL];}return _photos; }#pragma mark - #pragma mark - Life cycle- (void)viewDidLoad {// 3self.title = @"Classic Photos";// 4self.tableView.rowHeight = 80.0;[super viewDidLoad]; }- (void)viewDidUnload {// 5[self setPhotos:nil];[super viewDidUnload]; }#pragma mark - #pragma mark - UITableView data source and delegate methods// 6 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSInteger count = self.photos.count;return count; }// 7 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {return 80.0; }- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *kCellIdentifier = @"Cell Identifier";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier];cell.selectionStyle = UITableViewCellSelectionStyleNone;}// 8NSString *rowKey = [[self.photos allKeys] objectAtIndex:indexPath.row];NSURL *imageURL = [NSURL URLWithString:[self.photos objectForKey:rowKey]];NSData *imageData = [NSData dataWithContentsOfURL:imageURL];UIImage *image = nil;// 9if (imageData) {UIImage *unfiltered_image = [UIImage imageWithData:imageData];image = [self applySepiaFilterToImage:unfiltered_image];}cell.textLabel.text = rowKey;cell.imageView.image = image;return cell; }#pragma mark - #pragma mark - Image filtration// 10 - (UIImage *)applySepiaFilterToImage:(UIImage *)image {CIImage *inputImage = [CIImage imageWithData:UIImagePNGRepresentation(image)];UIImage *sepiaImage = nil;CIContext *context = [CIContext contextWithOptions:nil];CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" keysAndValues: kCIInputImageKey, inputImage, @"inputIntensity", [NSNumber numberWithFloat:0.8], nil];CIImage *outputImage = [filter outputImage];CGImageRef outputImageRef = [context createCGImage:outputImage fromRect:[outputImage extent]];sepiaImage = [UIImage imageWithCGImage:outputImageRef];CGImageRelease(outputImageRef);return sepiaImage; }@end

    好的!這里做了很多事情。別害怕 – 以下是對代碼原理的解釋:

  • 對 photos 變量做了Synthesize操作.
  • 使用了惰性實例化去加載數據源,比如photos 字典。
  • 為view設置了title屬性。
  • 將table view中的row高度設定為80.0個像素點。
  • 當ListViewController被卸載時,將photos變量設置為nil。
  • 返回被顯示的row數量。
  • 這是UITableViewDelegate的可選方法。為了達到更好的視覺效果,將每個row的高度設定為80.0。默認值為44.0。
  • 從字典中獲取key值,根據key的value值創建NSURL,然后以NSData類型下載圖片數據。
  • 如果你成功下載完數據,創建image對象,并且使用褐色濾光鏡。
  • 這個方法對image對象使用了褐色濾光鏡。如果你想了解更多關于Core Image filters的內容,你可以閱讀Beginning Core Image in iOS 5 Tutorial。
  • 就是這樣!試試吧!編譯運行工程。很美,褐色的照片 – 但是…他們..看起來…很…慢! 雖然很好看,但是你只能在等待圖片加載的時候去吃點零食打發時間了. :]

    ClassicPhotos (緩慢的版本)

    是時候想想如何提升用戶體驗了!

    線程

    每一個應用程序至少有一個主線程。線程的工作就是去執行一系列的指令。在Cocoa Touch中,主線程包含應用程序的主運行回路。幾乎所有你寫的代碼都會在主線程中執行,除非你特別創建了一個單獨的線程,并在這個新線程中執行代碼。

    線程有兩個顯著的特征:

  • 每個線程都有訪問你的應用程序資源的同等權限;它包括訪問除了局部變量之外的所有的對象。所以,任何對象都可能被任意線程修改,使用并且改變。
  • 沒有辦法可以去預測一個線程會運行多久 — 或者哪個線程會首先完成!
  • 所以,知道這些技術很重要,它們可以去攻克難點,防止意外的錯誤!:] 以下是對多線程應用時面臨的挑戰介紹 – 以及一些如何有效解決它們的提示。

    • 資源競爭:當每個線程都去訪問同一段內存時,會導致所謂的資源競爭問題。當有多個并發線程訪問共享數據時,首先訪問內存數據的線程會改變共享數據 – 而且并不能保證哪個線程會首先訪問到內存數據。你也許會假設有一個局部變量擁有你的線程最后一次寫到共享內存的值,但是另一個線程也許會同時改變了共享內存的數據,然后你的局部變量就過時了!如果你知道這種情況會存在你的代碼中(例如你會從多個線程同時讀/寫數據),就應該使用互斥鎖。互斥代表互相排斥。你可以通過使用 “@synchronized block”將實例變量包圍起來,創建一個互斥鎖。這樣你就可以確保在互斥鎖中的代碼一次只能被一個線程訪問:
      @synchronized (self) { myClass.object = value; }

      在以上代碼中“Self”被稱為一個“信號量”。當一個線程要范圍這段代碼時,它會檢查其他的線程是否也在訪問“self”。如果沒有線程在訪問“self”,這塊代碼會被執行;否則這段線程會被限制訪問直到這個互斥鎖解除為止。

    • 原子性:你也許在property聲明中見過很多次“nonatomic”。當你將一個property聲明為atomic時,通常會把它包裹在一個@synchronized塊中,確保它是線程安全的。當然,這種方法會添加一些額外的系統開銷。為了更清楚的解釋它,以下是一個關于atomic property的初步實現:
      // If you declare a property as atomic ... @property (atomic, retain) NSString *myString;// ... a rough implementation that the system generates automatically, // looks like this: - (NSString *)myString {@synchronized (self) {?return [[myString retain] autorelease];?}}

      在上面的代碼中,“retain”和“autorelease”被當做返回值來使用,它們被多個線程訪問了,而且你不希望這個對象在多個調用之間被釋放了。

      所以,你先把它的值retain一下,然后把它放在自動釋放池中。你可以在蘋果的技術文檔里面了解到更多關于?線程安全的內容。只要是大部分iOS程序員不想費心去發掘它的話,都值得去了解下。重要提示:這是一個很好的面試問題!:]

      大部分的UIKit properties都不是線程安全的。想看下一個類是否是線程安全的,可以看看API文檔。如果API文檔沒有提到任何關于線程安全的內容,你可以假設這個類是非線程安全的。

      按常規,如果你正在執行一個二級的線程,而且你要對UIKit對象做操作,可以使用performSelectorOnMainThread。

    • 死鎖:一個線程被停滯,無限期地等待永遠不會發生的條件。例如,如果兩個線程在互相執行synchronized代碼,每一個線程就會等待另一個線程完成并且打開鎖。但是這種情況永遠不會發生,這樣兩個線程都會成為死鎖。
    • 困乏時間:這會發生在有太多的線程同時執行,系統會停滯不前。NSOperationQueue有一個屬性,讓你設置并發線程的數量。

    NSOperation API

    NSOperation 類有一個相當簡短的聲明。要定制一個操作,可以遵循以下步驟:

  • 繼承NSOperation類
  • 重寫“main”方法
  • 在“main”方法中創建一個“autoreleasepool”
  • 將你的代碼放在“autoreleasepool”中
  • 創建你自己的自動釋放池的原因是,你不能訪問主線程的自動釋放池,所以你應該自己創建一個。以下是一個例子:

    #import Foundation/Foundation.h@interface MyLengthyOperation: NSOperation @end
    @implementation MyLengthyOperation- (void)main {// a lengthy operation@autoreleasepool {for (int i = 0 ; i < 10000 ; i++) {NSLog(@"%f", sqrt(i));}} }@end

    上面的例子代碼展示了ARC語法在自動釋放池中的使用。你現在必須使用ARC了!:]

    在線程操作中,你從來都不能明確知道,一個操作什么時候會開始,要持續多久才能結束。在大多數時候,如果用戶滑動離開了頁面,你并不想在后臺執行一個操作 – 沒有任何的理由讓你去執行。這里關鍵是要經常地檢查NSOperation類的isCancelled屬性。例如,在上面的例子程序中,你會這樣做:

    @interface MyLengthyOperation: NSOperation @end@implementation MyLengthyOperation - (void)main {// a lengthy operation@autoreleasepool {for (int i = 0 ; i < 10000 ; i++) {// is this operation cancelled?if (self.isCancelled)break;NSLog(@"%f", sqrt(i));}} } @end

    要取消一個操作,你可以調用NSOperation的cancel方法,展示如下:

    // In your controller class, you create the NSOperation // Create the operation MyLengthyOperation *my_lengthy_operation = [[MyLengthyOperation alloc] init]; . . . // Cancel it [my_lengthy_operation cancel];

    NSOperation類還有其他的方法和屬性:

    • 開始(start):通常,你不會重寫這個方法。重寫“start”方法需要相對復雜的實現,你還需要注意像isExecuting,isFinished,isConcurrent和isReady這些屬性。當你將一個操作添加到一個隊列當中時(一個NSOperationQueue的實例,接下來會討論的),這個隊列會在操作中調用“start”方法,然后它會做一些準備和“main”方法的后續操作。假如你在一個NSOperation實例中調用了“start”方法,如果沒有把它添加到一個隊列中,這個操作會在main loop中執行。
    • 從屬性(Dependency):你可以讓一個操作從屬于其他的操作。任何操作都可以從屬于任意數量的操作。當你讓操作A從屬于操作B時,即使你調用了操作A的“start”方法,它會等待操作B結束后才開始執行。例如:
    MyDownloadOperation *downloadOp = [[MyDownloadOperation alloc] init]; // MyDownloadOperation is a subclass of NSOperation MyFilterOperation *filterOp = [[MyFilterOperation alloc] init]; // MyFilterOperation is a subclass of NSOperation[filterOp addDependency:downloadOp];

    要刪除依賴性:

    [filterOp removeDependency:downloadOp];
    • 優先級(Priority):有時候你希望在后臺運行的操作并不是很重要的,它可以以較低的優先級執行。可以通過使用“setQueuePriority:”方法設置一個操作的優先級。
      [filterOp setQueuePriority:NSOperationQueuePriorityVeryLow];

      其他關于設置線程優先級的選擇有: NSOperationQueuePriorityLow, NSOperationQueuePriorityNormal, NSOperationQueuePriorityHigh和NSOperationQueuePriorityVeryHigh.
      當你添加了操作到一個隊列時,在對操作調用“start”方法之前,NSOperationQueue會瀏覽所有的操作。那些有較高優先級的操作會被先執行。有同等優先級的操作會按照添加到隊列中的順序去執行(先進先出)。
      (歷史注釋:在1997年,火星車中的嵌入式系統遭遇過優先級反轉問題,也許這是說明正確處理優先級和互斥鎖的最昂貴示例了。想對這一事件的背景知識有更多的了解,可以看這個網址:?http://research.microsoft.com/en-us/um/people/mbj/Mars_Pathfinder/Mars_Pathfinder.html?)

    • Completion block:在NSOperation 類中另一個有用的方法叫setCompletionBlock:。一旦操作完成了,如果你還有一些事情想做,你可以把它放在一個塊中,并且傳遞給這個方法。這個塊會在主線程中執行。
      [filterOp removeDependency:downloadOp];

    其他一些關于處理線程的提示:

    • 如果你需要傳遞一些值和指針到一個線程中,創建你自己的指定初始化方法是一個很好的嘗試:
      #import Foundation/Foundation.h@interface MyOperation : NSOperation-(id)initWithNumber:(NSNumber *)start string:(NSString *)string;@end
    • 如果你的操作需要有一個返回值或者對象,聲明一個委托方法是不錯的選擇。記住委托方法必須在主線程中返回。然而,因為你要繼承NSOperation類,你必須先將這個操作類強制轉換為NSObject對象??梢园凑找韵虏襟E去做:
      [(NSObject *)self.delegate performSelectorOnMainThread:(@selector(delegateMethod:)) withObject:object waitUntilDone:NO];
    • 要經常檢查isCancelled屬性。如果操作不需要被執行了,你就不想在后臺去運行它了!
    • 你并不需要重寫“start”方法。然而,如果你決定去重寫“start”方法,就必須處理好像isExecuting, isFinished, isConcurrent 和 isReady這些屬性。否則你的操作類不會正確的運作。
    • 你一旦添加了一個操作到一個隊列(NSOperationQueue的一個實例)中,就要負責釋放它(如果你不使用ARC的話)。NSOperationQueue 獲得操作對象的所有權,調用“start”方法,然后結束時負責釋放它。
    • 你不能重用一個操作對象。一旦它被添加到一個隊列中,你就喪失了對它的所有權。如果你想再使用同一個操作類,就必須創建一個新的實例變量。
    • 一個結束的操作不能被重啟。
    • 如果你取消了一個操作,它不會馬上就發生。它會在未來的某個時候某人在“main”函數中明確地檢查isCancelled == YES 時被取消掉;否則,操作會一直執行到完成為止。
    • 一個操作是否成功地完成,失敗了,或者是被取消了,isFinished的值總會被設置為YES。所以千萬不要覺得isFinished == YES就表示所有的事情都順利完成了 — 特別的,如果你在代碼里面有從屬性(dependencies),就要更加注意!

    NSOperationQueue API

    NSOperationQueue 也有一個相當簡單的界面。它甚至比NSOperation還要簡單,因為你不需要去繼承它,或者重寫任何的方法 — 你可以簡單創建一個。給你的隊列起一個名字會是一個不錯的做法;這樣你可以在運行時識別出你的操作隊列,并且讓調試變得更簡單:

    NSOperationQueue *myQueue = [[NSOperationQueue alloc] init]; myQueue.name = @"Download Queue";
    • ?并發操作:隊列和線程是兩個不同的概念。一個隊列可以有多個線程。每個隊列中的操作會在所屬的線程中運行。舉個例子你創建一個隊列,然后添加三個操作到里面。隊列會發起三個單獨的線程,然后讓所有操作在各自的線程中并發運行。
      到底有多少個線程會被創建?這是個很好的問題!:] 這取決與硬件。默認情況下,NSOperationQueue類會在場景背后施展一些魔法,決定如何在特定的平臺下運行代碼是最好的,并且會盡量啟用最大的線程數量??紤]以下的例子。假設系統是空閑的,并且有很多的可用資源,這樣NSOperationQueue會啟用比如8個同步線程。下次你運行程序,系統會忙于處理其他不相關的操作,它們消耗著資源,然后NSOperationQueue只會啟用兩個同步線程了。
    • 并發操作的最大值:你可以設定NSOperationQueue可以并發運行的最大操作數。NSOperationQueue會選擇去運行任何數量的并發操作,但是不會超過最大值。
      myQueue.MaxConcurrentOperationCount = 3;

      如果你改變了主意,想將MaxConcurrentOperationCount設置回默認值,你可以執行下列操作:

      myQueue.MaxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount;
    • 添加操作:一個操作一旦被添加到一個隊列中,你就應該通過傳送一個release消息給操作對象(如果使用了手動引用計數,非ARC的話),然后隊列會負責開始這個操作。從這點上看,什么時候調用“start”方法由這個隊列說了算。
      [myQueue addOperation:downloadOp]; [downloadOp release]; // manual reference counting
    • 待處理的操作:任何時候你可以詢問一個隊列哪個操作在里面,并且總共有多少個操作在里面。記住只有那些等待被執行的操作,還有那些正在運行的操作,會被保留在隊列中。操作一完成,就會退出隊列。
      NSArray *active_and_pending_operations = myQueue.operations; NSInteger count_of_operations = myQueue.operationCount;
    • 暫停隊列:你可以通過設定setSuspended:YES來暫停一個隊列。這樣會暫停所有在隊列中的操作 — 你不能單獨的暫停操作。要重新開始隊列,只要簡單的setSuspended:NO。
      // Suspend a queue [myQueue setSuspended:YES]; . . . // Resume a queue [myQueue setSuspended: NO];
    • 取消操作:要取消一個隊列中的所有操作,你只要簡單的調用“cancelAllOperations”方法即可。還記得之前提醒過經常檢查NSOperation中的isCancelled屬性嗎?
      原因是“cancelAllOperations”并沒有做太多的工作,他只是對隊列中的每一個操作調用“cancel”方法 — 這并沒有起很大作用!:] 如果一個操作并沒有開始,然后你對它調用“cancel”方法,操作會被取消,并從隊列中移除。然而,如果一個操作已經在執行了,這就要由單獨的操作去識別撤銷(通過檢查isCancelled屬性)然后停止它所做的工作。
    [myQueue cancelAllOperations];
    • addOperationWithBlock: 如果你有一個簡單的操作不需要被繼承,你可以將它當做一個塊(block)傳遞給隊列。如果你需要從塊那里傳遞回任何數據,記得你不應該傳遞任何強引用的指針給塊;相反,你必須使用弱引用。而且,如果你想要在塊中做一些跟UI有關的事情,你必須在主線程中做。
      UIImage *myImage = nil;// Create a weak reference __weak UIImage *myImage_weak = myImage;// Add an operation as a block to a queue [myQueue addOperationWithBlock: ^ {// a block of operationNSURL *aURL = [NSURL URLWithString:@"http://www.somewhere.com/image.png"];NSError *error = nil;NSData *data = [NSData dataWithContentsOfURL:aURL options:nil error:&error];If (!error)[myImage_weak imageWithData:data];// Get hold of main queue (main thread)[[NSOperationQueue mainQueue] addOperationWithBlock: ^ {myImageView.image = myImage_weak; // updating UI}];}];

    ?

    重新定義模型

    是時候重新定義初步的非線程模型了!如果你仔細看下初步的模型,你會看到有三個線程區域可以改進。通過把這三個區域區分開來,然后把它們各自放在一個單獨的線程中,主線程會獲得解脫,并且可以保持對用戶交互的迅速響應。

    注意:如果你不能馬上理解為什么你的app運作得這么慢 — 而且有時候這并不明顯 — 你應該使用Instruments工具。然而,這需要另一篇教程去講解它了!:]

    改進的模型

    為了擺脫你的程序的瓶頸限制,你需要一個特定的線程去響應用戶交互事件,一個線程專門用于下載數據源和圖片,還有一個線程用于執行圖片濾鏡處理。在新的模型中,app在主線程中開始,并且加載一個空白的table view。同時,app會開始另一個線程去下載數據源。

    一旦數據源下載完畢,你會告訴table view重新加載自己。這會在主線程中完成。這個時候,table view知道有多少行,而且知道需要顯示的圖片的URL地址,但是它還沒有實際的圖片!如果你在這個時候馬上開始下載所有的圖片,這會非常沒有效率,因為你一下子不需要所有的圖片!

    怎樣可以把它弄得更好?

    一個更好的模型就是去下載在當前屏幕可見的row的圖片。所以你的代碼首先會問table view哪些row是可見的,然后才會開始下載過程。還有,圖片濾鏡處理會在圖片下載完成后才開始。因此,代碼應該等待出現有一個待濾鏡處理的圖片時才開始進行圖片濾鏡處理。

    為了讓app的反應變得更加靈敏,代碼會在圖片下載完畢后馬上顯示,而不會等待進行濾鏡處理。一旦圖片的濾鏡處理完成,就會更新UI以顯示濾鏡處理過的圖片。以下是整個處理過程的控制流示意圖:

    控制流程

    為了達到這些目標,你需要去監測圖片是否正在下載,或者已經完成了下載,還是圖片的濾鏡處理已經完成了。你還需要去監測每個操作的狀態,以及判斷它是一個下載操作還是一個濾鏡處理操作,這樣你才能在用戶滾動table view的時候去做取消,中止或者恢復操作。

    好的!現在你準備好開始寫代碼了!:]

    打開之前的工程,添加一個命名為?PhotoRecord的NSObject新子類到工程中。打開PhotoRecord.h文件,然后添加以下代碼到頭文件中:

    #import UIKit/UIKit.h // because we need UIImage@interface PhotoRecord : NSObject@property (nonatomic, strong) NSString *name; // To store the name of image @property (nonatomic, strong) UIImage *image; // To store the actual image @property (nonatomic, strong) NSURL *URL; // To store the URL of the image @property (nonatomic, readonly) BOOL hasImage; // Return YES if image is downloaded. @property (nonatomic, getter = isFiltered) BOOL filtered; // Return YES if image is sepia-filtered @property (nonatomic, getter = isFailed) BOOL failed; // Return Yes if image failed to be downloaded@end

    是不是覺得上面的語法挺熟悉的?每一個property都有一個getter和setter方法。像這樣去指定getter方法僅僅是讓它的命名更加明確。

    切換到PhotoRecord.m文件,然后添加以下代碼:

    @implementation PhotoRecord@synthesize name = _name; @synthesize image = _image; @synthesize URL = _URL; @synthesize hasImage = _hasImage; @synthesize filtered = _filtered; @synthesize failed = _failed;- (BOOL)hasImage {return _image != nil; }- (BOOL)isFailed {return _failed; }- (BOOL)isFiltered {return _filtered; }@end

    要監測每一個操作的狀態,你需要一個單獨的類。創建另一個命名為PendingOperations的NSObject新類。切換到PendingOperations.h文件,然后添加以下代碼:

    #import Foundation/Foundation.h@interface PendingOperations : NSObject@property (nonatomic, strong) NSMutableDictionary *downloadsInProgress; @property (nonatomic, strong) NSOperationQueue *downloadQueue;@property (nonatomic, strong) NSMutableDictionary *filtrationsInProgress; @property (nonatomic, strong) NSOperationQueue *filtrationQueue;@end

    這個頭文件也挺簡單。你申明了兩個字典去監測活躍和等待的下載與濾鏡操作。字典的key代表table view row的indexPath,然后字典的value會是兩個單獨的ImageDownloader和ImageFiltration實例。

    注意:你可能會對為什么要監測所有的活躍和等待操作感到好奇。難道不能通過對 [NSOperationQueue operations]的查詢來訪問它們嗎?是的,但是在本工程中,這樣做的話效率不是很高。

    每次你需要去用有等待操作的行(row)的indexPath去和可見行的indexPath作對比時,你需要使用幾個迭代循環,這樣的話會是一個很耗資源的操作。通過申明一個額外的NSDictionary實例,你可以方便的了解等待操作(operations),而不需要執行沒有效率的循環操作(operations)。

    切換到PendingOperations.m文件,然后添加以下代碼:

    @implementation PendingOperations @synthesize downloadsInProgress = _downloadsInProgress; @synthesize downloadQueue = _downloadQueue;@synthesize filtrationsInProgress = _filtrationsInProgress; @synthesize filtrationQueue = _filtrationQueue;- (NSMutableDictionary *)downloadsInProgress {if (!_downloadsInProgress) {_downloadsInProgress = [[NSMutableDictionary alloc] init];}return _downloadsInProgress; }- (NSOperationQueue *)downloadQueue {if (!_downloadQueue) {_downloadQueue = [[NSOperationQueue alloc] init];_downloadQueue.name = @"Download Queue";_downloadQueue.maxConcurrentOperationCount = 1;}return _downloadQueue; }- (NSMutableDictionary *)filtrationsInProgress {if (!_filtrationsInProgress) {_filtrationsInProgress = [[NSMutableDictionary alloc] init];}return _filtrationsInProgress; }- (NSOperationQueue *)filtrationQueue {if (!_filtrationQueue) {_filtrationQueue = [[NSOperationQueue alloc] init];_filtrationQueue.name = @"Image Filtration Queue";_filtrationQueue.maxConcurrentOperationCount = 1;}return _filtrationQueue; }@end

    這里,你重寫了一些getter方法去利用惰性實例化,所以你并不需要真的去給實例變量分配內存空間,直到他們被訪問為止。你還要給兩個隊列初始化和分配內存空間 — 一個用于下載操作,一個用于濾鏡處理 — 然后設定他們的屬性(properties),所以當你在另外的類中訪問他們時,你不需要擔心他們的初始化操作。 maxConcurrentOperationCount變量在本教程中設定為1。

    現在,是時候處理下載和濾鏡處理操作了。創建一個命名為ImageDownloader的NSOperatoin子類。切換到ImageDownloader.h文件,然后添加以下代碼:

    #import Foundation/Foundation.h// 1 #import "PhotoRecord.h"// 2 @protocol ImageDownloaderDelegate;@interface ImageDownloader : NSOperation@property (nonatomic, assign) id delegate;// 3 @property (nonatomic, readonly, strong) NSIndexPath *indexPathInTableView; @property (nonatomic, readonly, strong) PhotoRecord *photoRecord;// 4 - (id)initWithPhotoRecord:(PhotoRecord *)record atIndexPath:(NSIndexPath *)indexPath delegate:(id) theDelegate;@end@protocol ImageDownloaderDelegate // 5 - (void)imageDownloaderDidFinish:(ImageDownloader *)downloader; @end


    第二部分

    以下是對上面代碼的注解:

  • 導入PhotoRecord.h文件,這樣你就可以在下載成功后,單獨地設置PhotoRecord變量的圖片屬性(image property)。如果下載失敗,設定它的failed值為YES。
  • 申明一個delegate,這樣一旦操作完成了,你可以通知調用者(caller)。
  • 為了方便起見,申明了indexPathInTableView變量,這樣一旦操作結束了,調用者就會有一個屬于操作的引用。
  • 申明一個初始化方法。
  • 在你的delegate方法中,將整個類作為對象傳遞回給調用者,這樣調用者就可以訪問indexPathInTableView和photoRecord變量了。因為你需要去將操作對象(operation)強制轉換為NSObject類型,然后在主線程中返回,delegate方法的變量不能超過一個。
  • 切換到ImageDownloader.m文件,然后做以下修改:

    // 1 @interface ImageDownloader () @property (nonatomic, readwrite, strong) NSIndexPath *indexPathInTableView; @property (nonatomic, readwrite, strong) PhotoRecord *photoRecord; @end@implementation ImageDownloader @synthesize delegate = _delegate; @synthesize indexPathInTableView = _indexPathInTableView; @synthesize photoRecord = _photoRecord;#pragma mark - #pragma mark - Life Cycle- (id)initWithPhotoRecord:(PhotoRecord *)record atIndexPath:(NSIndexPath *)indexPath delegate:(id<ImageDownloaderDelegate>)theDelegate {if (self = [super init]) {// 2self.delegate = theDelegate;self.indexPathInTableView = indexPath;self.photoRecord = record;}return self; }#pragma mark - #pragma mark - Downloading image// 3 - (void)main {// 4@autoreleasepool {if (self.isCancelled)return;NSData *imageData = [[NSData alloc] initWithContentsOfURL:self.photoRecord.URL];if (self.isCancelled) {imageData = nil;return;}if (imageData) {UIImage *downloadedImage = [UIImage imageWithData:imageData];self.photoRecord.image = downloadedImage;}else {self.photoRecord.failed = YES;}imageData = nil;if (self.isCancelled)return;// 5[(NSObject *)self.delegate performSelectorOnMainThread:@selector(imageDownloaderDidFinish:) withObject:self waitUntilDone:NO];} }@end

    通過代碼注釋,你將看到上面的代碼在做下面的操作:

  • 申明一個私有的接口,你可以改變實例變量的屬性為讀寫(read-write)。
  • 設定properties屬性。
  • 經常檢查isCancelled變量,確保操作即時結束。
  • 蘋果推薦使用@autoreleasepool塊,而不是alloc和init NSAutoreleasePool變量,因為blocks更加有效率。你也許會使用NSAutoreleasePool,這樣也行。
  • 將operation對象強制轉換為NSobject類型,然后在主線程中通知調用者(caller)。
  • 現在,繼續創建一個NSOperation的子類,用來處理圖片濾鏡操作吧!

    創建另一個命名為 ImageFiltration的NSOperation新子類。打開 ImageFiltration.h文件,添加以下代碼:

    ? // 1 #import <UIKit/UIKit.h> #import <CoreImage/CoreImage.h> #import "PhotoRecord.h"// 2 @protocol ImageFiltrationDelegate;@interface ImageFiltration : NSOperation@property (nonatomic, weak) id <ImageFiltrationDelegate> delegate; @property (nonatomic, readonly, strong) NSIndexPath *indexPathInTableView; @property (nonatomic, readonly, strong) PhotoRecord *photoRecord;- (id)initWithPhotoRecord:(PhotoRecord *)record atIndexPath:(NSIndexPath *)indexPath delegate:(id<ImageFiltrationDelegate>)theDelegate;@end@protocol ImageFiltrationDelegate <NSObject> - (void)imageFiltrationDidFinish:(ImageFiltration *)filtration; @end

    再次的,以下是對上面代碼的注釋:

  • 因為你要去對UIImage實例執行濾鏡處理操作,就需要導入UIKit和CoreImage框架。還需要導入PhotoRecord頭文件。與ImageDownloader類似,你想讓調用者(caller)使用初始化函數去進行alloc和init操作。申明一個delegate,一旦操作完成了,通知調用者。
  • 申明一個delegate,一旦操作完成了,通知調用者。
  • 切換到ImageFiltration.m文件,添加以下代碼:

    ? @interface ImageFiltration () @property (nonatomic, readwrite, strong) NSIndexPath *indexPathInTableView; @property (nonatomic, readwrite, strong) PhotoRecord *photoRecord; @end@implementation ImageFiltration @synthesize indexPathInTableView = _indexPathInTableView; @synthesize photoRecord = _photoRecord; @synthesize delegate = _delegate;#pragma mark - #pragma mark - Life cycle- (id)initWithPhotoRecord:(PhotoRecord *)record atIndexPath:(NSIndexPath *)indexPath delegate:(id<ImageFiltrationDelegate>)theDelegate {if (self = [super init]) {self.photoRecord = record;self.indexPathInTableView = indexPath;self.delegate = theDelegate;}return self; }#pragma mark - #pragma mark - Main operation- (void)main {@autoreleasepool {if (self.isCancelled)return;if (!self.photoRecord.hasImage)return;UIImage *rawImage = self.photoRecord.image;UIImage *processedImage = [self applySepiaFilterToImage:rawImage];if (self.isCancelled)return;if (processedImage) {self.photoRecord.image = processedImage;self.photoRecord.filtered = YES;[(NSObject *)self.delegate performSelectorOnMainThread:@selector(imageFiltrationDidFinish:) withObject:self waitUntilDone:NO];}}}#pragma mark - #pragma mark - Filtering image- (UIImage *)applySepiaFilterToImage:(UIImage *)image {// This is expensive + time consumingCIImage *inputImage = [CIImage imageWithData:UIImagePNGRepresentation(image)];if (self.isCancelled)return nil;UIImage *sepiaImage = nil;CIContext *context = [CIContext contextWithOptions:nil];CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" keysAndValues: kCIInputImageKey, inputImage, @"inputIntensity", [NSNumber numberWithFloat:0.8], nil];CIImage *outputImage = [filter outputImage];if (self.isCancelled)return nil;// Create a CGImageRef from the context// This is an expensive + time consumingCGImageRef outputImageRef = [context createCGImage:outputImage fromRect:[outputImage extent]];if (self.isCancelled) {CGImageRelease(outputImageRef);return nil;}sepiaImage = [UIImage imageWithCGImage:outputImageRef];CGImageRelease(outputImageRef);return sepiaImage; }@end

    上面的實現方法和ImageDownloader類似。圖片的濾鏡處理的實現方法和你之前在ListViewController.m文件中的一樣。它被移動到這里以便可以在后臺作為一個單獨的操作完成。你應該經常檢查isCancelled參數;在任何系統資源消耗較大的函數調用前后去調用這個濾鏡處理函數,是不錯的做法。一旦濾鏡處理結束了,PhotoRecord實例的值會被恰當的設置好,然后主線程的delegate被通知了。

    很好!現在你已經有了在后臺線程中執行操作(operations)的所有工具和基礎了。是時候回到view controller然后恰當的修改它,以便它可以利用好這些新優勢。

    注意:在動手之前,你要下載AFNetworking library from GitHub.

    AFNetworking庫是建立在NSOperation 和 NSOperatinQueue之上的。它提供給你很多便捷的方法,以便你不需要為普通的任務,比如在后臺下載一個文件,創建你自己的操作。

    當需要從互聯網下載一個文件的時候,在適當的位置寫一些代碼來檢查錯誤是個不錯的做法。下載數據源,一個只有4kBytes 的property list,不是什么大問題,你并不需要操心去為它創建一個子類。然而,你不能假設會有一個可靠持續的網絡連接。

    蘋果為此提供了NSURLConnection類。使用它會是一項額外的工作,特別是當你只是想下載一個小的property list時。AFNetworking是一個開源代碼庫,提供了一種非常方便的方式去實施這類任務。你要傳入兩個塊(blocks),一個在操作成功時傳入,另一個在操作失敗時傳入。接下來你會看到相關的實踐例子。

    要添加這個庫到工程中,選擇File > Add Files To …,然后瀏覽選擇你下載好的AFNetworking文件夾,最后點擊“Add”。確保選中了“Copy items into destination group’s folder”選項!是的,你正在使用ARC,但是AFNetworking還沒有從陳舊的手動管理內存的泥潭中爬出來。

    如果你遵循著安裝指南,就可以避免編譯錯誤,如果你不遵循的話,你會在編譯時去處理非常多的錯誤。每一個AFNetworking模塊需要在你的Target’s Build Phases標簽包含 “-fno-objc-arc”字段,它在 Compiler Flags部分下面。

    要實現它,在導航欄(在左手邊)點擊“PhotoRecords”。在右手邊,選擇“Targets”下面的“ClassicPhotos”。從標簽欄選擇“Build Phases”。在它下面,選擇三角形展開“Compile Sources”項。選上屬于AFNetworking的所有文件。敲擊Enter鍵,一個對話框就會彈出來。在對話框中,輸入 “fno-objc-arc”,然后點擊“Done”。

    切換到 ListViewController.h文件,然后根據以下內容更新頭文件:

    ? // 1 #import <UIKit/UIKit.h> // #import <CoreImage/CoreImage.h> ... you don't need CoreImage here anymore. #import "PhotoRecord.h" #import "PendingOperations.h" #import "ImageDownloader.h" #import "ImageFiltration.h" // 2 #import "AFNetworking/AFNetworking.h"#define kDatasourceURLString @"https://sites.google.com/site/soheilsstudio/tutorials/nsoperationsampleproject/ClassicPhotosDictionary.plist"// 3 @interface ListViewController : UITableViewController <ImageDownloaderDelegate, ImageFiltrationDelegate>// 4 @property (nonatomic, strong) NSMutableArray *photos; // main data source of controller// 5 @property (nonatomic, strong) PendingOperations *pendingOperations; @end

    這里發生了什么事?以下要點對上面的代碼做了解釋:

  • 你可以從ListViewController頭文件中刪除CoreImage,因為你不再需要它了。然而,你需要導入PhotoRecord.h文件,PendingOperations.h,ImageDownloader.h和ImageFiltration.h文件。
  • 這里是對AFNetworking庫的引用。
  • 確保讓ListViewController遵從 ImageDownloader和ImageFiltration的delegate方法。
  • 你不再需要這樣的數據源。你將要使用property list來創建PhotoRecord的實例。所以,將“photos”類從NSDictionary修改為NSMutableArray,這樣你就可以更新圖片數組了。
  • 這個property被用來監測等待操作(operations)。
  • 切換到ListViewController.m文件,然后根據以下內容進行更新:

    // Add this to the beginning of ListViewController.m @synthesize pendingOperations = _pendingOperations; . . . // Add this to viewDidUnload [self setPendingOperations:nil];

    在“photos”的惰性初始化之前,添加“pendingOperations”的惰性初始化:

    - (PendingOperations *)pendingOperations {if (!_pendingOperations) {_pendingOperations = [[PendingOperations alloc] init];}return _pendingOperations; }

    現在來到“photos”的惰性初始化,并做以下修改:

    - (NSMutableArray *)photos {if (!_photos) {// 1NSURL *datasourceURL = [NSURL URLWithString:kDatasourceURLString];NSURLRequest *request = [NSURLRequest requestWithURL:datasourceURL];// 2AFHTTPRequestOperation *datasource_download_operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];// 3[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];// 4[datasource_download_operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {// 5NSData *datasource_data = (NSData *)responseObject;CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)datasource_data, kCFPropertyListImmutable, NULL);NSDictionary *datasource_dictionary = (__bridge NSDictionary *)plist;// 6NSMutableArray *records = [NSMutableArray array];for (NSString *key in datasource_dictionary) {PhotoRecord *record = [[PhotoRecord alloc] init];record.URL = [NSURL URLWithString:[datasource_dictionary objectForKey:key]];record.name = key;[records addObject:record];record = nil;}// 7self.photos = records;CFRelease(plist);[self.tableView reloadData];[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];} failure:^(AFHTTPRequestOperation *operation, NSError *error){// 8// Connection error messageUIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Oops!"message:error.localizedDescriptiondelegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];[alert show];alert = nil;[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];}];// 9[self.pendingOperations.downloadQueue addOperation:datasource_download_operation];}return _photos; }

    以上代碼做了一些操作。下面的內容是對代碼完成內容的一步步解析:

  • 創建NSURL和NSURLRequest對象,指向數據源的位置。
  • 使用AFHTTPRequestOperation類,用request對象來alloc和init它。
  • 在下載數據時,通過啟動網絡活動指示器(network activity indicator)來提供用戶反饋。
  • 通過使用setCompletionBlockWithSuccess:failure:,你可以添加兩個塊(blocks):一個給操作成功的情況,另一個給操作失敗的情況。
  • 在成功的塊中,以NSData的數據格式下載property list, 然后通過使用toll-free briding橋,將參數強制轉換成CFDataRef和CFPropertyList, 再將property list文件轉換成NSDictionary。
  • 創建一個NSMutableArray,然后在字典中循環申明所有的objects和key,創建一個PhotoRecord實例,然后保存它到數組中。
  • 一旦完成了,將_photo對象指向records數組,重新加載table view然后停止網絡活動指示器。你還要釋放”plist”實例變量。
  • 也許你的操作會不成功,這時要顯示一條消息給用戶看。
  • 最后,添加 “datasource_download_operation”到PendingOperations的“downloadQueue”中。
  • 來到 tableView:cellForRowAtIndexPath:方法,根據以下內容做修改:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *kCellIdentifier = @"Cell Identifier";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier];cell.selectionStyle = UITableViewCellSelectionStyleNone;// 1UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];cell.accessoryView = activityIndicatorView;}// 2PhotoRecord *aRecord = [self.photos objectAtIndex:indexPath.row];// 3if (aRecord.hasImage) {[((UIActivityIndicatorView *)cell.accessoryView) stopAnimating];cell.imageView.image = aRecord.image;cell.textLabel.text = aRecord.name;}// 4else if (aRecord.isFailed) {[((UIActivityIndicatorView *)cell.accessoryView) stopAnimating];cell.imageView.image = [UIImage imageNamed:@"Failed.png"];cell.textLabel.text = @"Failed to load";}// 5else {[((UIActivityIndicatorView *)cell.accessoryView) startAnimating];cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"];cell.textLabel.text = @"";[self startOperationsForPhotoRecord:aRecord atIndexPath:indexPath];}return cell; }

    同樣的,花點時間看下下面的評論解析:

  • 要提供反饋給用戶,創建一個UIActivityIndicatorView然后把它設置為cell的accessory view。
  • 數據源包含PhotoRecord的所有實例。根據行(row)的indexPath參數,從photos數組中獲取并創建相應的PhotoRecord實例。
  • 檢查PhotoRecord??此膱D片是否已經下載完了,顯示了圖片,圖片的名字,然后停止了活動指示器 (activity indicator)。
  • 如果下載圖片失敗,顯示一個預留圖片來提示失敗情況,然后停止活動指示器(activity indicator)。
  • 否則,圖片還沒有被下載下來。開始下載和圖片濾鏡處理操作(它們現在還沒有被實現),然后顯示一個預留圖片表示你正在對它進行處理。啟動活動指示器(activity indicator)來提醒用戶有操作正在進行。
  • 現在是時候來實現負責啟動操作的方法了。如果你還沒有實現它,可以在ListViewController.m文件中刪除舊的“applySepiaFilterToImage:”實現方法。

    來到代碼的結尾,實現下列方法:

    ? // 1 - (void)startOperationsForPhotoRecord:(PhotoRecord *)record atIndexPath:(NSIndexPath *)indexPath {// 2if (!record.hasImage) {// 3[self startImageDownloadingForRecord:record atIndexPath:indexPath];}if (!record.isFiltered) {[self startImageFiltrationForRecord:record atIndexPath:indexPath];} }

    以上的代碼相當直接,但是有些東西要解釋下:

  • 為了保持簡潔,你要根據它的indexPath值,傳入一個需要操作(operations)的PhotoRecord實例。
  • 檢查一下看看它是否有一張圖片;如果是,就不管它。
  • 如果它沒有一張圖片,通過調用 startImageDownloadingForRecord:atIndexPath:(它會被簡短的實現出來)方法,開始下載圖片。你也可以對濾鏡操作做同樣的處理:如果圖片還沒有被濾鏡處理過,可以調用startImageFiltrationForRecord:atIndexPath:(他也會被簡短的實現出來)方法。
  • 注意:?下載圖片和濾鏡處理圖片的方法是單獨實現的,因為有可能當圖片正在下載時,用戶會將圖片滾動掉,然后你還沒有對圖片做濾鏡處理。這樣下次用戶回到同一行時,你就不需要重新下載圖片;只需要去實現圖片的濾鏡處理了!很有效的一招!:]

    現在你需要去實現以上代碼段的startImageDownloadingForRecord:atIndexPath:方法。記住你創建了一個自定義的類,PendingOperations,用于檢測操作(operations)。在這里你開始使用它了。

    - (void)startImageDownloadingForRecord:(PhotoRecord *)record atIndexPath:(NSIndexPath *)indexPath {// 1if (![self.pendingOperations.downloadsInProgress.allKeys containsObject:indexPath]) {// 2 // Start downloadingImageDownloader *imageDownloader = [[ImageDownloader alloc] initWithPhotoRecord:record atIndexPath:indexPath delegate:self];[self.pendingOperations.downloadsInProgress setObject:imageDownloader forKey:indexPath];[self.pendingOperations.downloadQueue addOperation:imageDownloader];} }- (void)startImageFiltrationForRecord:(PhotoRecord *)record atIndexPath:(NSIndexPath *)indexPath {// 3if (![self.pendingOperations.filtrationsInProgress.allKeys containsObject:indexPath]) {// 4// Start filtrationImageFiltration *imageFiltration = [[ImageFiltration alloc] initWithPhotoRecord:record atIndexPath:indexPath delegate:self];// 5ImageDownloader *dependency = [self.pendingOperations.downloadsInProgress objectForKey:indexPath];if (dependency)[imageFiltration addDependency:dependency];[self.pendingOperations.filtrationsInProgress setObject:imageFiltration forKey:indexPath];[self.pendingOperations.filtrationQueue addOperation:imageFiltration];} }

    好的!以下是簡短的解析,以確保你理解了以上代碼的工作原理。

  • 首先,檢查特定的indexPath看是否已經有一個操作在downloadsInProgress中了。如果有,就不管它。
  • 如果沒有,使用指定的初始化函數創建一個ImageDownloader的實例,然后設置ListViewController作為它的delegate。傳入恰當的indexPath和一個指針給PhotoRecord的實例,然后把它添加到下載隊列中。你還要把它添加到downloadsInProgress中,來幫助監測事情。
  • 同樣的,檢查看是否有任何的濾鏡處理操作在特定的indexPath項中進行。
  • 如果沒有,使用指定的初始化函數開始一個。
  • 這里的代碼有點巧妙。你首先必須檢查看這個特定的indexPath項是否有一個等待的下載任務;如果是,你可以基于該特定項創建這個濾鏡操作。
  • 很好!你現在需要去實現ImageDownloader和ImageFiltration的delegate方法了。將下列代碼添加到ListViewController.m文件的末尾:

    - (void)imageDownloaderDidFinish:(ImageDownloader *)downloader {// 1NSIndexPath *indexPath = downloader.indexPathInTableView;// 2PhotoRecord *theRecord = downloader.photoRecord;// 3[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];// 4[self.pendingOperations.downloadsInProgress removeObjectForKey:indexPath]; }- (void)imageFiltrationDidFinish:(ImageFiltration *)filtration {NSIndexPath *indexPath = filtration.indexPathInTableView;PhotoRecord *theRecord = filtration.photoRecord;[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];[self.pendingOperations.filtrationsInProgress removeObjectForKey:indexPath]; }

    所有的delegate方法都有非常相似的實現,所以這里只需要拿其中一個做講解:

  • 檢查操作(operation)的indexPath值,看看它是一個下載操作,還是一個濾鏡處理操作。
  • 創建PhotoRecord的實例對象。
  • 更新UI。
  • 從downloadsInProgress(或者filtrationsInProgress)中移除操作。
  • 更新:關于處理PhotoRecord的實例,來自論壇的“xlledo”提了一個不錯的意見。因為你正在傳一個指針給PhotoRecord,再給NSOperation的子類(ImageDownloader和ImageFiltration),你可以直接修改它們。所以replaceObjectAtIndex:withObject:方法在這里是多余的。

    贊!

    Wow! 你做到了!你的工程完成了。編譯運行看看實際的提升效果!當你滾動table view的時候,app不再卡死,當cell可見時,就開始下載和濾鏡處理圖片了。

    難道這不是很cool嗎?你可以看到一點小小的努力就可以讓你的應用程序的響應變得更加靈敏 — 并且讓用戶覺得更加有趣!

    進一步地調整

    你已經在本篇教程中進展很久了!你的小工程比起原來的版本變得更加反應靈敏,有了很大的提升。然而,仍然有一些細節需要去處理。你想成為一個優秀的程序員,而不僅僅是好的程序員!

    你也許已經注意到當你在table view中滾動時,那些屏幕以外的cell仍然處于下載和濾鏡處理的進程中。難道你沒有在代碼里面設置取消操作?是的,你有 — 你應該好好的利用它們!:]

    回到Xcode,切換到ListViewController.m文件中。來到tableView:cellForRowAtIndexPath:的方法實現,如下所示,將[self startOperationsForPhotoRecord:aRecord atIndexPath:indexPath];放在if判斷分支中:

    ? // in implementation of tableView:cellForRowAtIndexPath: if (!tableView.dragging && !tableView.decelerating) {[self startOperationsForPhotoRecord:aRecord atIndexPath:indexPath]; }

    你告訴table view只有在它沒有滾動時才開始操作(operations)。判斷項是UIScrollView的properties屬性,然后因為UITableView是UIScrollView的子類,它就自動地繼承了這些properties屬性。

    現在,來到ListViewController.m文件的結尾,實現下面的UIScrollView委托方法:

    #pragma mark - #pragma mark - UIScrollView delegate- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {// 1[self suspendAllOperations]; }- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {// 2if (!decelerate) {[self loadImagesForOnscreenCells];[self resumeAllOperations];} }- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {// 3[self loadImagesForOnscreenCells];[self resumeAllOperations]; }

    以下是對上面代碼的解析:

  • 一旦用戶開始了滾動操作,你會想中止所有的操作(operations),然后看下用戶想看什么。接下來會實現suspendAllOperations方法。
  • 如果decelerate的值為NO,表示用戶停止了拖動table view的操作。所以你想恢復中止了的操作(operations),取消屏幕以外的cell的操作,開始屏幕內cell的操作。接下來我們會實現loadImagesForOnscreenCells和resumeAllOperations方法。
  • 這個delegate方法告訴你table view停止了滾動,所以你會做跟第2步一樣的操作。
  • 好的!現在,在ListViewController.m文件的結尾添加上suspendAllOperations,resumeAllOperations和loadImagesForOnscreenCells方法的實現:

    ? #pragma mark - #pragma mark - Cancelling, suspending, resuming queues / operations- (void)suspendAllOperations {[self.pendingOperations.downloadQueue setSuspended:YES];[self.pendingOperations.filtrationQueue setSuspended:YES]; }- (void)resumeAllOperations {[self.pendingOperations.downloadQueue setSuspended:NO];[self.pendingOperations.filtrationQueue setSuspended:NO]; }- (void)cancelAllOperations {[self.pendingOperations.downloadQueue cancelAllOperations];[self.pendingOperations.filtrationQueue cancelAllOperations]; }- (void)loadImagesForOnscreenCells {// 1NSSet *visibleRows = [NSSet setWithArray:[self.tableView indexPathsForVisibleRows]];// 2NSMutableSet *pendingOperations = [NSMutableSet setWithArray:[self.pendingOperations.downloadsInProgress allKeys]];[pendingOperations addObjectsFromArray:[self.pendingOperations.filtrationsInProgress allKeys]];NSMutableSet *toBeCancelled = [pendingOperations mutableCopy];NSMutableSet *toBeStarted = [visibleRows mutableCopy];// 3[toBeStarted minusSet:pendingOperations];// 4[toBeCancelled minusSet:visibleRows];// 5for (NSIndexPath *anIndexPath in toBeCancelled) {ImageDownloader *pendingDownload = [self.pendingOperations.downloadsInProgress objectForKey:anIndexPath];[pendingDownload cancel];[self.pendingOperations.downloadsInProgress removeObjectForKey:anIndexPath];ImageFiltration *pendingFiltration = [self.pendingOperations.filtrationsInProgress objectForKey:anIndexPath];[pendingFiltration cancel];[self.pendingOperations.filtrationsInProgress removeObjectForKey:anIndexPath];}toBeCancelled = nil;// 6for (NSIndexPath *anIndexPath in toBeStarted) {PhotoRecord *recordToProcess = [self.photos objectAtIndex:anIndexPath.row];[self startOperationsForPhotoRecord:recordToProcess atIndexPath:anIndexPath];}toBeStarted = nil;}

    suspendAllOperations, resumeAllOperations 和 cancelAllOperations 方法都有直接的實現方式。你基本上會使用工廠方法去中止,恢復或者取消操作和隊列。為了方便起見,你將它們放在單獨的方法中。

    LoadImagesForOnscreenCells方法有點復雜。以下是對它的解釋:

  • 獲取一NSSet可見行(rows)。
  • 獲取一NSMutableSet所有的等待操作(下載和濾鏡處理)。
  • Rows(或者indexPaths)對應的開始操作(operation),等于visible rows — pendings的數量。
  • Rows(或者indexPaths)對應的需要取消的操作,等于pendings — visible rows的數量。
  • 循環查看需要被取消的操作,取消它們,然后從PendingOperations中移除它們的引用。
  • 循環查看需要開始的操作,為它們中的每一個調用startOperationsForPhotoRecord:atIndexPath:方法。
  • 最后,這個難題的最后項由ListViewController.m文件中的didReceiveMemoryWarning方法解決。

    ? // If app receive memory warning, cancel all operations - (void)didReceiveMemoryWarning {[self cancelAllOperations];[super didReceiveMemoryWarning]; }

    編譯運行工程,你會看到一個響應更加靈敏,有更好的資源管理的應用程序!給自己一點掌聲吧!

    ClassicPhotos (改進版本)

    現在還可以做什么?

    這里是工程改進后的完整代碼。

    如果你完成了這個工程,并且花時間真正理解了它,恭喜!相比剛閱讀本教程時,你可以把自己看待成一個更有價值的iOS開發者了!大部分的開發工作室都會幸運的擁有一兩個能真正理解這些原理的人。

    但是注意 — 像deeply-nested blocks(塊),無理由地使用線程會讓維護你的代碼的人難以理解。線程會引來不易察覺的bugs,只有當網絡緩慢時才會出現,或者當代碼運行在一個更快(或者更慢)的設備中,或者有不同內核數目的設備中。仔細認真的測試,經常使用Instruments(或者是你自己的觀察)來核實引入的線程是否真的取得了性能提升。

    如果你對本教程或者NSOperations有任何的意見或者問題,請加入下面的論壇討論!


    總結

    以上是生活随笔為你收集整理的如何使用NSOperations和NSOperationQueues的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    在线天堂新版最新版在线8 | 东京热一精品无码av | 丰满诱人的人妻3 | 67194成是人免费无码 | 日韩在线不卡免费视频一区 | 日韩少妇内射免费播放 | 在线欧美精品一区二区三区 | 亚洲精品久久久久久久久久久 | 婷婷色婷婷开心五月四房播播 | 99riav国产精品视频 | 成人无码视频在线观看网站 | 国产明星裸体无码xxxx视频 | 亚洲精品久久久久中文第一幕 | 亚洲精品久久久久久久久久久 | 欧美 日韩 亚洲 在线 | 亚洲色在线无码国产精品不卡 | a片在线免费观看 | 精品国产一区二区三区四区在线看 | 亚洲无人区一区二区三区 | 亚洲娇小与黑人巨大交 | 日韩亚洲欧美精品综合 | 国产精品亚洲一区二区三区喷水 | 免费观看又污又黄的网站 | 在线天堂新版最新版在线8 | 亚洲欧美精品aaaaaa片 | 国产亚洲精品久久久久久国模美 | 97久久超碰中文字幕 | 久久国语露脸国产精品电影 | 日韩无套无码精品 | 西西人体www44rt大胆高清 | 午夜嘿嘿嘿影院 | 国产麻豆精品精东影业av网站 | 欧洲精品码一区二区三区免费看 | 日本高清一区免费中文视频 | 国产精品久久国产精品99 | 天堂在线观看www | 丰满人妻翻云覆雨呻吟视频 | 99久久精品国产一区二区蜜芽 | 国产精品无码mv在线观看 | 性色欲情网站iwww九文堂 | 午夜理论片yy44880影院 | 国产激情无码一区二区 | 狠狠综合久久久久综合网 | 成人三级无码视频在线观看 | 俺去俺来也www色官网 | 欧美性生交xxxxx久久久 | 成人精品一区二区三区中文字幕 | 麻豆av传媒蜜桃天美传媒 | 国产精品久久久久久亚洲影视内衣 | 国产黄在线观看免费观看不卡 | 亚洲gv猛男gv无码男同 | 久久婷婷五月综合色国产香蕉 | 国产极品美女高潮无套在线观看 | 日日摸夜夜摸狠狠摸婷婷 | www国产亚洲精品久久久日本 | 综合激情五月综合激情五月激情1 | 国产精品a成v人在线播放 | 国产免费观看黄av片 | a国产一区二区免费入口 | 日本一区二区三区免费播放 | 中文字幕无码乱人伦 | 中文无码伦av中文字幕 | 丁香啪啪综合成人亚洲 | 欧美一区二区三区 | 欧美 亚洲 国产 另类 | 久久久精品人妻久久影视 | 欧美一区二区三区视频在线观看 | 精品无码国产一区二区三区av | 5858s亚洲色大成网站www | www一区二区www免费 | 丰满诱人的人妻3 | 大地资源中文第3页 | 97夜夜澡人人双人人人喊 | 亚洲综合无码久久精品综合 | 天天躁夜夜躁狠狠是什么心态 | 丰腴饱满的极品熟妇 | 99久久人妻精品免费二区 | 国产无遮挡又黄又爽又色 | 东京热一精品无码av | 国产亚洲精品久久久ai换 | 在线播放免费人成毛片乱码 | 风流少妇按摩来高潮 | 国产熟妇高潮叫床视频播放 | 欧美日韩一区二区三区自拍 | 国产人妻久久精品二区三区老狼 | 亚洲精品一区二区三区在线观看 | 内射老妇bbwx0c0ck | 亚洲人成影院在线无码按摩店 | 无套内谢的新婚少妇国语播放 | 成人欧美一区二区三区黑人 | 双乳奶水饱满少妇呻吟 | 久久综合狠狠综合久久综合88 | 久久精品女人天堂av免费观看 | 久久人妻内射无码一区三区 | 一本久久a久久精品vr综合 | 97久久超碰中文字幕 | 乱人伦中文视频在线观看 | 亚洲成av人在线观看网址 | 亚洲国产高清在线观看视频 | 美女张开腿让人桶 | 成在人线av无码免观看麻豆 | 精品成人av一区二区三区 | 欧美老熟妇乱xxxxx | 国产激情精品一区二区三区 | 欧美成人家庭影院 | 性史性农村dvd毛片 | 99久久精品国产一区二区蜜芽 | 亚洲欧美中文字幕5发布 | 久久亚洲中文字幕精品一区 | 色综合天天综合狠狠爱 | 无码人妻丰满熟妇区五十路百度 | 中文字幕乱码亚洲无线三区 | 美女毛片一区二区三区四区 | 亚洲一区二区三区国产精华液 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产午夜手机精彩视频 | 久久亚洲国产成人精品性色 | 内射白嫩少妇超碰 | 亚洲精品成人av在线 | 亚洲熟熟妇xxxx | 国产一区二区三区精品视频 | 扒开双腿吃奶呻吟做受视频 | 亚洲 a v无 码免 费 成 人 a v | 内射爽无广熟女亚洲 | 任你躁在线精品免费 | 中文字幕无码av激情不卡 | 亚洲色无码一区二区三区 | 日韩av无码一区二区三区 | 国产后入清纯学生妹 | 网友自拍区视频精品 | 成熟女人特级毛片www免费 | 国产香蕉97碰碰久久人人 | 亚洲毛片av日韩av无码 | 波多野结衣av一区二区全免费观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 日韩精品久久久肉伦网站 | 四虎国产精品一区二区 | 狠狠噜狠狠狠狠丁香五月 | 久久久精品成人免费观看 | 在线欧美精品一区二区三区 | 一本大道久久东京热无码av | 国产精品无码一区二区三区不卡 | 亚洲 另类 在线 欧美 制服 | 一本久道久久综合婷婷五月 | 色综合久久中文娱乐网 | 久久精品人人做人人综合试看 | 亚洲国产精品一区二区第一页 | 国产亚洲精品久久久久久久久动漫 | 亚洲狠狠婷婷综合久久 | 中文无码成人免费视频在线观看 | 久久99久久99精品中文字幕 | 久久zyz资源站无码中文动漫 | 成人亚洲精品久久久久 | 国产精品.xx视频.xxtv | 麻豆人妻少妇精品无码专区 | 亚洲成在人网站无码天堂 | 亚洲国产精品无码一区二区三区 | 国产成人精品必看 | 牛和人交xxxx欧美 | 精品夜夜澡人妻无码av蜜桃 | 国产成人精品优优av | 亚洲爆乳大丰满无码专区 | 久久久久亚洲精品中文字幕 | 日韩人妻少妇一区二区三区 | 成人性做爰aaa片免费看 | 2020最新国产自产精品 | 精品一区二区三区波多野结衣 | 国产三级久久久精品麻豆三级 | 成在人线av无码免观看麻豆 | 亚洲日本va午夜在线电影 | 波多野结衣乳巨码无在线观看 | 无遮无挡爽爽免费视频 | 九九久久精品国产免费看小说 | 国产suv精品一区二区五 | 欧美日本精品一区二区三区 | 午夜无码人妻av大片色欲 | 久久精品国产一区二区三区肥胖 | 日本免费一区二区三区最新 | 亚洲爆乳精品无码一区二区三区 | 国精产品一区二区三区 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲人亚洲人成电影网站色 | 国产精品久久久久久久9999 | 久久久久亚洲精品男人的天堂 | 最新国产乱人伦偷精品免费网站 | 久久久久av无码免费网 | 装睡被陌生人摸出水好爽 | 男人的天堂2018无码 | 无码人妻精品一区二区三区下载 | 性史性农村dvd毛片 | 国产99久久精品一区二区 | 国产成人精品一区二区在线小狼 | 亚洲另类伦春色综合小说 | 人人妻人人澡人人爽人人精品 | 久久久国产精品无码免费专区 | 久久97精品久久久久久久不卡 | 成熟人妻av无码专区 | 最新国产乱人伦偷精品免费网站 | 久久久久免费看成人影片 | 国产舌乚八伦偷品w中 | 精品无人区无码乱码毛片国产 | 熟女少妇在线视频播放 | 精品国产一区av天美传媒 | 狠狠色噜噜狠狠狠7777奇米 | 九九久久精品国产免费看小说 | 久久精品99久久香蕉国产色戒 | 成人无码视频在线观看网站 | 中文字幕无码av波多野吉衣 | 人妻少妇精品视频专区 | 中文字幕乱码人妻无码久久 | 丰满人妻精品国产99aⅴ | 国产av无码专区亚洲awww | 台湾无码一区二区 | 沈阳熟女露脸对白视频 | 内射爽无广熟女亚洲 | 国产精品二区一区二区aⅴ污介绍 | 无码人妻丰满熟妇区毛片18 | 久久人人爽人人爽人人片av高清 | 精品人人妻人人澡人人爽人人 | 亚洲中文无码av永久不收费 | 亚洲综合无码一区二区三区 | 国产av一区二区三区最新精品 | 欧美日本精品一区二区三区 | 东京热一精品无码av | 国产成人精品三级麻豆 | 成人一在线视频日韩国产 | 国产亚洲精品久久久久久久 | 成 人影片 免费观看 | 欧美freesex黑人又粗又大 | 久久精品女人天堂av免费观看 | www国产精品内射老师 | 成在人线av无码免费 | 婷婷五月综合激情中文字幕 | 日韩av无码中文无码电影 | 人人妻人人澡人人爽人人精品 | 亚洲一区av无码专区在线观看 | 色噜噜亚洲男人的天堂 | 西西人体www44rt大胆高清 | 午夜福利试看120秒体验区 | 麻豆md0077饥渴少妇 | 永久黄网站色视频免费直播 | 丰满人妻一区二区三区免费视频 | 色一情一乱一伦 | 亚洲成a人片在线观看无码3d | 亚洲色成人中文字幕网站 | 亚洲成av人片在线观看无码不卡 | 久久久久免费精品国产 | 亚洲成a人片在线观看无码3d | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产亚洲精品久久久久久久 | 国产亚洲tv在线观看 | 日本成熟视频免费视频 | 人人妻人人澡人人爽人人精品 | 无码精品国产va在线观看dvd | 又大又黄又粗又爽的免费视频 | 未满成年国产在线观看 | 一个人看的视频www在线 | 又粗又大又硬又长又爽 | 十八禁真人啪啪免费网站 | 丰腴饱满的极品熟妇 | 装睡被陌生人摸出水好爽 | 伊人久久大香线焦av综合影院 | 久久久久免费看成人影片 | 青青久在线视频免费观看 | 一二三四社区在线中文视频 | 亚洲国产高清在线观看视频 | 在线播放免费人成毛片乱码 | 激情亚洲一区国产精品 | 欧美日韩一区二区免费视频 | 无码任你躁久久久久久久 | 国产精品毛片一区二区 | 日韩欧美中文字幕在线三区 | 300部国产真实乱 | 亚洲国产欧美日韩精品一区二区三区 | 熟女少妇人妻中文字幕 | 国产艳妇av在线观看果冻传媒 | 精品国产aⅴ无码一区二区 | 嫩b人妻精品一区二区三区 | 真人与拘做受免费视频一 | av在线亚洲欧洲日产一区二区 | 精品无码成人片一区二区98 | 国产成人无码av在线影院 | 免费国产黄网站在线观看 | 亚洲 另类 在线 欧美 制服 | 少妇厨房愉情理9仑片视频 | 最新国产乱人伦偷精品免费网站 | 荫蒂添的好舒服视频囗交 | 少妇太爽了在线观看 | 国产亚洲精品久久久久久 | 国产无遮挡吃胸膜奶免费看 | 国产疯狂伦交大片 | 国产女主播喷水视频在线观看 | 欧美日韩在线亚洲综合国产人 | 国产高清av在线播放 | 初尝人妻少妇中文字幕 | 波多野结衣av一区二区全免费观看 | 久久亚洲精品中文字幕无男同 | 精品国产一区二区三区四区在线看 | 久久精品女人的天堂av | 中文字幕无码av波多野吉衣 | 精品一区二区三区无码免费视频 | 人妻插b视频一区二区三区 | 无码乱肉视频免费大全合集 | 成人性做爰aaa片免费看 | 日韩精品成人一区二区三区 | 人妻插b视频一区二区三区 | 中文字幕乱码人妻无码久久 | 日日摸天天摸爽爽狠狠97 | 精品人妻人人做人人爽 | 国产黄在线观看免费观看不卡 | 丰满少妇人妻久久久久久 | 俺去俺来也在线www色官网 | 日日碰狠狠丁香久燥 | 中文毛片无遮挡高清免费 | 丰满少妇女裸体bbw | 欧美 亚洲 国产 另类 | 久久午夜无码鲁丝片秋霞 | 精品久久久久久人妻无码中文字幕 | 天堂а√在线中文在线 | 天堂亚洲2017在线观看 | 中文字幕人妻丝袜二区 | 18精品久久久无码午夜福利 | 国产亚洲视频中文字幕97精品 | 四虎永久在线精品免费网址 | 久在线观看福利视频 | 国产精品va在线播放 | 亚洲一区二区三区在线观看网站 | 波多野结衣高清一区二区三区 | 色综合久久久久综合一本到桃花网 | 国产电影无码午夜在线播放 | 久久久精品人妻久久影视 | 理论片87福利理论电影 | 中文无码伦av中文字幕 | 丰腴饱满的极品熟妇 | 色综合久久88色综合天天 | 一本久道高清无码视频 | 人人妻人人澡人人爽人人精品 | 国产亚洲精品久久久久久久久动漫 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 亚洲狠狠色丁香婷婷综合 | 内射欧美老妇wbb | 久久无码中文字幕免费影院蜜桃 | 精品夜夜澡人妻无码av蜜桃 | 精品久久8x国产免费观看 | 国产成人无码区免费内射一片色欲 | 国产欧美亚洲精品a | 日韩人妻无码中文字幕视频 | 2020久久香蕉国产线看观看 | 国产午夜无码精品免费看 | 丰满少妇熟乱xxxxx视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 久久国产精品精品国产色婷婷 | 又色又爽又黄的美女裸体网站 | 国内精品久久久久久中文字幕 | 无码乱肉视频免费大全合集 | 国产精品成人av在线观看 | 亚洲s码欧洲m码国产av | 大肉大捧一进一出好爽视频 | 国产精品久久久久无码av色戒 | 天堂а√在线中文在线 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲大尺度无码无码专区 | 精品国产一区二区三区四区 | 成人免费视频一区二区 | 亚洲日韩中文字幕在线播放 | 精品国精品国产自在久国产87 | 老熟女重囗味hdxx69 | 野外少妇愉情中文字幕 | 国产精品久久久av久久久 | 动漫av网站免费观看 | 亚洲 激情 小说 另类 欧美 | 国产超级va在线观看视频 | 永久免费精品精品永久-夜色 | 亚洲男人av天堂午夜在 | 77777熟女视频在线观看 а天堂中文在线官网 | 国内精品九九久久久精品 | 国产极品视觉盛宴 | 色婷婷欧美在线播放内射 | 丁香花在线影院观看在线播放 | 色噜噜亚洲男人的天堂 | 国产精品久久久久影院嫩草 | 国产精品久久久久久久9999 | 无码av最新清无码专区吞精 | 国产成人久久精品流白浆 | 久久久中文久久久无码 | 成人毛片一区二区 | 国产精品二区一区二区aⅴ污介绍 | 精品国偷自产在线视频 | 亚洲国产一区二区三区在线观看 | 久久人妻内射无码一区三区 | 中文无码伦av中文字幕 | 午夜时刻免费入口 | 曰韩无码二三区中文字幕 | 性色欲网站人妻丰满中文久久不卡 | 国产精品爱久久久久久久 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲综合在线一区二区三区 | 樱花草在线播放免费中文 | 特黄特色大片免费播放器图片 | 人人爽人人爽人人片av亚洲 | 少女韩国电视剧在线观看完整 | 日本熟妇人妻xxxxx人hd | 久久久久久久女国产乱让韩 | 强辱丰满人妻hd中文字幕 | 国内丰满熟女出轨videos | 樱花草在线播放免费中文 | 妺妺窝人体色www婷婷 | 色诱久久久久综合网ywww | 欧美黑人巨大xxxxx | 成人女人看片免费视频放人 | 中文无码精品a∨在线观看不卡 | 国产成人精品视频ⅴa片软件竹菊 | 国产人妻人伦精品 | а√资源新版在线天堂 | 国产sm调教视频在线观看 | 初尝人妻少妇中文字幕 | 日韩av无码中文无码电影 | 男人的天堂av网站 | 成熟人妻av无码专区 | 欧洲vodafone精品性 | 嫩b人妻精品一区二区三区 | 国产精品美女久久久久av爽李琼 | 成人无码精品1区2区3区免费看 | √天堂中文官网8在线 | 成人免费无码大片a毛片 | 亚洲国产精品美女久久久久 | 国产精品亚洲综合色区韩国 | 欧美激情内射喷水高潮 | 日韩av无码一区二区三区 | 蜜桃av抽搐高潮一区二区 | 免费观看黄网站 | 国产精品无码mv在线观看 | 亚洲色在线无码国产精品不卡 | 成在人线av无码免观看麻豆 | 久久综合香蕉国产蜜臀av | 精品一区二区三区波多野结衣 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 波多野结衣一区二区三区av免费 | 亚洲熟妇色xxxxx亚洲 | 精品国产一区二区三区av 性色 | 亚洲国产高清在线观看视频 | 国产成人亚洲综合无码 | 无码人妻精品一区二区三区不卡 | 色偷偷人人澡人人爽人人模 | 成年女人永久免费看片 | 全黄性性激高免费视频 | 又色又爽又黄的美女裸体网站 | 亚洲精品久久久久久一区二区 | 精品乱子伦一区二区三区 | 澳门永久av免费网站 | 亚洲中文字幕无码一久久区 | 午夜丰满少妇性开放视频 | 欧美三级a做爰在线观看 | 中文无码精品a∨在线观看不卡 | 最近免费中文字幕中文高清百度 | 欧洲vodafone精品性 | 5858s亚洲色大成网站www | 内射爽无广熟女亚洲 | 99精品国产综合久久久久五月天 | 欧美人与物videos另类 | 中文亚洲成a人片在线观看 | 55夜色66夜色国产精品视频 | 亚洲色成人中文字幕网站 | 欧美精品无码一区二区三区 | 黑人巨大精品欧美一区二区 | 欧美熟妇另类久久久久久不卡 | 成熟女人特级毛片www免费 | 水蜜桃av无码 | 无码人妻丰满熟妇区毛片18 | 狠狠色丁香久久婷婷综合五月 | 人妻中文无码久热丝袜 | 久久综合久久自在自线精品自 | 黑人粗大猛烈进出高潮视频 | 亚洲日本一区二区三区在线 | 日本精品久久久久中文字幕 | 日韩av无码中文无码电影 | 亚洲 a v无 码免 费 成 人 a v | 亚洲爆乳精品无码一区二区三区 | 狠狠色欧美亚洲狠狠色www | 曰韩少妇内射免费播放 | av无码电影一区二区三区 | 桃花色综合影院 | 亚洲欧洲日本综合aⅴ在线 | 国产亚洲视频中文字幕97精品 | 丰满人妻被黑人猛烈进入 | 成熟女人特级毛片www免费 | 国产精品.xx视频.xxtv | 国产精品理论片在线观看 | 西西人体www44rt大胆高清 | 人妻体内射精一区二区三四 | 精品国产一区av天美传媒 | 亚无码乱人伦一区二区 | 国产亚洲欧美在线专区 | 久久zyz资源站无码中文动漫 | 亚洲欧美日韩国产精品一区二区 | 特级做a爰片毛片免费69 | 四虎国产精品免费久久 | 日韩人妻无码一区二区三区久久99 | 国产又爽又黄又刺激的视频 | 中文字幕人成乱码熟女app | 大乳丰满人妻中文字幕日本 | 亚洲国产精品久久人人爱 | 综合人妻久久一区二区精品 | 福利一区二区三区视频在线观看 | 风流少妇按摩来高潮 | 久久国产精品二国产精品 | 人人妻人人澡人人爽欧美一区 | 亚洲成av人影院在线观看 | 精品亚洲成av人在线观看 | 欧美日韩一区二区免费视频 | 欧美三级不卡在线观看 | 国产精品国产自线拍免费软件 | 欧美人与动性行为视频 | 国产精品亚洲综合色区韩国 | 99久久精品国产一区二区蜜芽 | 日韩少妇内射免费播放 | 玩弄中年熟妇正在播放 | 色婷婷综合中文久久一本 | 18精品久久久无码午夜福利 | 午夜精品久久久久久久 | 欧美xxxxx精品 | 两性色午夜免费视频 | www国产精品内射老师 | 精品无码一区二区三区的天堂 | 国产97在线 | 亚洲 | 99久久久无码国产aaa精品 | 中文字幕亚洲情99在线 | 六十路熟妇乱子伦 | 亚洲国产av精品一区二区蜜芽 | 久久99精品久久久久久 | 无套内谢的新婚少妇国语播放 | 欧美成人午夜精品久久久 | 国产亚洲欧美在线专区 | 欧美黑人巨大xxxxx | аⅴ资源天堂资源库在线 | 久久99精品国产.久久久久 | 国产超碰人人爽人人做人人添 | av在线亚洲欧洲日产一区二区 | 中文字幕人成乱码熟女app | 国内少妇偷人精品视频免费 | 少妇高潮一区二区三区99 | 色综合视频一区二区三区 | 性生交大片免费看女人按摩摩 | 欧美放荡的少妇 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 精品亚洲韩国一区二区三区 | 亚洲自偷精品视频自拍 | 免费观看的无遮挡av | 欧美猛少妇色xxxxx | 国产精品资源一区二区 | 亚洲人成无码网www | 日韩少妇内射免费播放 | 成人无码影片精品久久久 | 免费人成在线观看网站 | 色情久久久av熟女人妻网站 | 未满小14洗澡无码视频网站 | 日本丰满熟妇videos | 成人aaa片一区国产精品 | 欧美精品国产综合久久 | 亚洲国产精品美女久久久久 | 久久成人a毛片免费观看网站 | 久久综合狠狠综合久久综合88 | 天天摸天天碰天天添 | 少妇无码av无码专区在线观看 | 国产亚洲tv在线观看 | 成人影院yy111111在线观看 | 亚洲精品无码国产 | 天天躁夜夜躁狠狠是什么心态 | 黑人粗大猛烈进出高潮视频 | 国产精品资源一区二区 | 亚洲一区二区三区偷拍女厕 | 久久久久久av无码免费看大片 | 国内少妇偷人精品视频 | 奇米影视888欧美在线观看 | 日本肉体xxxx裸交 | 99精品视频在线观看免费 | 纯爱无遮挡h肉动漫在线播放 | 老司机亚洲精品影院无码 | 欧美日韩一区二区免费视频 | 大肉大捧一进一出好爽视频 | 日本大香伊一区二区三区 | 亚洲中文字幕无码一久久区 | 99麻豆久久久国产精品免费 | 欧美放荡的少妇 | 亚洲人亚洲人成电影网站色 | 夫妻免费无码v看片 | 午夜精品久久久内射近拍高清 | 亚洲午夜久久久影院 | 国产熟女一区二区三区四区五区 | 欧美午夜特黄aaaaaa片 | 美女扒开屁股让男人桶 | 在教室伦流澡到高潮hnp视频 | 日本护士毛茸茸高潮 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国精产品一品二品国精品69xx | 午夜无码人妻av大片色欲 | 精品人妻av区 | 波多野结衣乳巨码无在线观看 | 俺去俺来也www色官网 | 天干天干啦夜天干天2017 | 国产精品久久久久7777 | 日韩无套无码精品 | 对白脏话肉麻粗话av | 中文字幕无码热在线视频 | 毛片内射-百度 | 无码帝国www无码专区色综合 | 亚洲娇小与黑人巨大交 | 精品久久久久久人妻无码中文字幕 | 亚洲国产精品一区二区第一页 | 免费国产成人高清在线观看网站 | 人人妻人人澡人人爽欧美精品 | 成人毛片一区二区 | 国产偷抇久久精品a片69 | 欧美喷潮久久久xxxxx | 色欲久久久天天天综合网精品 | 久久99国产综合精品 | 久久精品国产大片免费观看 | 成年美女黄网站色大免费视频 | 最近中文2019字幕第二页 | 午夜肉伦伦影院 | 内射巨臀欧美在线视频 | 欧美人与动性行为视频 | 日本乱人伦片中文三区 | 丰满人妻一区二区三区免费视频 | 99久久精品国产一区二区蜜芽 | 精品熟女少妇av免费观看 | 无码人妻精品一区二区三区不卡 | 日韩在线不卡免费视频一区 | 亚洲а∨天堂久久精品2021 | 67194成是人免费无码 | 在线看片无码永久免费视频 | 亚洲国产精品成人久久蜜臀 | 大乳丰满人妻中文字幕日本 | 久久久久久av无码免费看大片 | 亚洲小说春色综合另类 | 国产超碰人人爽人人做人人添 | 亚洲日韩中文字幕在线播放 | 国产午夜福利亚洲第一 | 国产人妻久久精品二区三区老狼 | 色爱情人网站 | 久久久久亚洲精品中文字幕 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品永久免费视频 | 久久久久亚洲精品中文字幕 | 国产av一区二区三区最新精品 | 亚洲中文字幕乱码av波多ji | 中文字幕+乱码+中文字幕一区 | 欧美国产日韩亚洲中文 | 伊人久久大香线蕉av一区二区 | 一个人看的视频www在线 | 久久久久久九九精品久 | 精品国产一区av天美传媒 | 国产精品久久久久久久9999 | 男女爱爱好爽视频免费看 | 亚洲一区二区三区 | 荫蒂添的好舒服视频囗交 | 久久久久久久久888 | 久久久婷婷五月亚洲97号色 | 国产精品爱久久久久久久 | 99er热精品视频 | 精品国产av色一区二区深夜久久 | 亚洲日本va中文字幕 | 秋霞成人午夜鲁丝一区二区三区 | 久久久久久国产精品无码下载 | 久久人人爽人人人人片 | 九月婷婷人人澡人人添人人爽 | 97精品国产97久久久久久免费 | 精品 日韩 国产 欧美 视频 | 欧美人妻一区二区三区 | 又大又黄又粗又爽的免费视频 | 国产亚洲精品久久久久久大师 | 日韩精品无码免费一区二区三区 | 欧美精品国产综合久久 | 一本久道久久综合婷婷五月 | 俺去俺来也在线www色官网 | 西西人体www44rt大胆高清 | 精品国产一区二区三区四区在线看 | 久久精品国产亚洲精品 | 丰满少妇人妻久久久久久 | 两性色午夜免费视频 | 嫩b人妻精品一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产网红无码精品视频 | 少妇人妻av毛片在线看 | 亚洲精品一区三区三区在线观看 | 国产午夜福利亚洲第一 | 精品国产av色一区二区深夜久久 | а√资源新版在线天堂 | 俺去俺来也www色官网 | 夜夜高潮次次欢爽av女 | 内射白嫩少妇超碰 | 天天躁夜夜躁狠狠是什么心态 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲精品中文字幕 | 狠狠亚洲超碰狼人久久 | 国产人妻精品一区二区三区不卡 | 国产精品亚洲lv粉色 | 国产69精品久久久久app下载 | 无码人妻av免费一区二区三区 | 领导边摸边吃奶边做爽在线观看 | 大肉大捧一进一出好爽视频 | 国产精品99爱免费视频 | 精品无人国产偷自产在线 | 婷婷丁香六月激情综合啪 | 性色欲网站人妻丰满中文久久不卡 | 日本xxxx色视频在线观看免费 | 国产精品无码永久免费888 | 精品 日韩 国产 欧美 视频 | 国产午夜手机精彩视频 | av无码不卡在线观看免费 | 成人免费视频在线观看 | 青春草在线视频免费观看 | 亚洲国产精品久久久天堂 | 国产精品对白交换视频 | 亚洲自偷自拍另类第1页 | 色噜噜亚洲男人的天堂 | 亚洲色欲久久久综合网东京热 | 无码国内精品人妻少妇 | 欧美亚洲日韩国产人成在线播放 | 亚洲精品中文字幕久久久久 | 任你躁国产自任一区二区三区 | 免费无码午夜福利片69 | 九九在线中文字幕无码 | 又紧又大又爽精品一区二区 | 精品久久久久久亚洲精品 | 18禁止看的免费污网站 | 国产三级精品三级男人的天堂 | 成人性做爰aaa片免费看不忠 | 亚洲 a v无 码免 费 成 人 a v | 欧美熟妇另类久久久久久不卡 | 亚洲 a v无 码免 费 成 人 a v | 蜜桃av抽搐高潮一区二区 | 99久久久无码国产精品免费 | 99精品无人区乱码1区2区3区 | 澳门永久av免费网站 | 日本护士xxxxhd少妇 | 日韩人妻无码一区二区三区久久99 | 又粗又大又硬又长又爽 | 国产精品手机免费 | 国产激情艳情在线看视频 | 曰本女人与公拘交酡免费视频 | 久久精品人妻少妇一区二区三区 | 国产亲子乱弄免费视频 | www国产亚洲精品久久久日本 | 精品无码一区二区三区的天堂 | 久久久无码中文字幕久... | 99久久精品国产一区二区蜜芽 | 久久精品人妻少妇一区二区三区 | 欧美熟妇另类久久久久久不卡 | 欧美熟妇另类久久久久久多毛 | 久久精品无码一区二区三区 | 无码人妻精品一区二区三区不卡 | 午夜免费福利小电影 | 成人av无码一区二区三区 | 青草青草久热国产精品 | 女人被爽到呻吟gif动态图视看 | 国产又爽又黄又刺激的视频 | 暴力强奷在线播放无码 | 免费观看又污又黄的网站 | 亚洲大尺度无码无码专区 | 国产精品久久久久无码av色戒 | 无码av最新清无码专区吞精 | 日本精品久久久久中文字幕 | 欧美第一黄网免费网站 | 久久午夜无码鲁丝片 | 久久精品无码一区二区三区 | 久久久久se色偷偷亚洲精品av | 成人精品天堂一区二区三区 | 亚洲理论电影在线观看 | 一个人看的视频www在线 | 久久精品国产日本波多野结衣 | 免费男性肉肉影院 | 中文无码精品a∨在线观看不卡 | 久久久久99精品国产片 | 日本又色又爽又黄的a片18禁 | 久久久久成人片免费观看蜜芽 | 久久人妻内射无码一区三区 | 久久精品人人做人人综合 | 少妇性l交大片欧洲热妇乱xxx | 国内少妇偷人精品视频免费 | 超碰97人人做人人爱少妇 | 天堂а√在线中文在线 | 国产综合在线观看 | 亚洲精品中文字幕 | 98国产精品综合一区二区三区 | 人妻少妇精品无码专区二区 | 国产一区二区三区日韩精品 | 国产尤物精品视频 | 人人妻在人人 | 国产精品第一国产精品 | 色综合久久久无码网中文 | 精品午夜福利在线观看 | 给我免费的视频在线观看 | 精品熟女少妇av免费观看 | 桃花色综合影院 | 精品久久久久久人妻无码中文字幕 | 久久久国产一区二区三区 | 国产免费久久精品国产传媒 | 色情久久久av熟女人妻网站 | 亚洲国产成人a精品不卡在线 | 日日摸夜夜摸狠狠摸婷婷 | ass日本丰满熟妇pics | 四虎4hu永久免费 | 一本一道久久综合久久 | 国产欧美精品一区二区三区 | 黑人粗大猛烈进出高潮视频 | 国产一区二区三区精品视频 | 漂亮人妻洗澡被公强 日日躁 | 狠狠cao日日穞夜夜穞av | 精品久久8x国产免费观看 | 伊人久久婷婷五月综合97色 | 色狠狠av一区二区三区 | 亚洲s码欧洲m码国产av | 欧洲极品少妇 | 国产在线aaa片一区二区99 | 免费乱码人妻系列无码专区 | 色综合天天综合狠狠爱 | 日韩亚洲欧美精品综合 | 清纯唯美经典一区二区 | 18禁止看的免费污网站 | 亚洲а∨天堂久久精品2021 | 亚洲精品一区二区三区在线观看 | 久久精品国产一区二区三区肥胖 | 亚洲一区二区三区国产精华液 | 99久久精品日本一区二区免费 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | www国产亚洲精品久久久日本 | 乱人伦中文视频在线观看 | 在线a亚洲视频播放在线观看 | 国产在线精品一区二区三区直播 | 性生交大片免费看女人按摩摩 | 久久久www成人免费毛片 | 国产午夜亚洲精品不卡下载 | 任你躁国产自任一区二区三区 | 亚洲精品综合一区二区三区在线 | 国产综合久久久久鬼色 | 女人色极品影院 | 日韩亚洲欧美精品综合 | 欧美自拍另类欧美综合图片区 | 成人无码精品1区2区3区免费看 | 蜜臀av无码人妻精品 | 人人澡人人透人人爽 | 国产香蕉尹人综合在线观看 | 国产成人综合美国十次 | 国产农村妇女高潮大叫 | 强伦人妻一区二区三区视频18 | 亚洲狠狠婷婷综合久久 | 爽爽影院免费观看 | 丁香花在线影院观看在线播放 | 两性色午夜视频免费播放 | 粉嫩少妇内射浓精videos | 国产亚洲人成在线播放 | 荫蒂被男人添的好舒服爽免费视频 | 伊人久久大香线蕉午夜 | 精品国产乱码久久久久乱码 | 无码任你躁久久久久久久 | 老熟女乱子伦 | 97色伦图片97综合影院 | 亚洲一区二区三区偷拍女厕 | 亚洲一区二区三区香蕉 | 清纯唯美经典一区二区 | 久激情内射婷内射蜜桃人妖 | 日本精品人妻无码免费大全 | 亚洲精品久久久久avwww潮水 | 人人妻人人藻人人爽欧美一区 | 国产精品丝袜黑色高跟鞋 | 久青草影院在线观看国产 | 无遮挡啪啪摇乳动态图 | 荫蒂添的好舒服视频囗交 | 久久精品一区二区三区四区 | 亚洲国产精品无码一区二区三区 | 国产情侣作爱视频免费观看 | 日韩少妇内射免费播放 | 亚洲色欲久久久综合网东京热 | 亚洲综合在线一区二区三区 | 久久成人a毛片免费观看网站 | 狠狠色色综合网站 | 国产精品资源一区二区 | 无码精品国产va在线观看dvd | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 爽爽影院免费观看 | 麻豆国产丝袜白领秘书在线观看 | 日韩成人一区二区三区在线观看 | 内射老妇bbwx0c0ck | 久久综合色之久久综合 | 色婷婷久久一区二区三区麻豆 | 男女作爱免费网站 | 性欧美大战久久久久久久 | 中文字幕乱码人妻无码久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产一区二区三区日韩精品 | 亚欧洲精品在线视频免费观看 | 亚洲国产欧美日韩精品一区二区三区 | 天堂一区人妻无码 | 欧美黑人巨大xxxxx | 波多野结衣高清一区二区三区 | a国产一区二区免费入口 | 久久精品国产日本波多野结衣 | 永久免费观看国产裸体美女 | 精品无码一区二区三区的天堂 | 亚洲一区二区观看播放 | 天天拍夜夜添久久精品大 | 欧美日韩人成综合在线播放 | 精品国产精品久久一区免费式 | 免费无码的av片在线观看 | 成熟人妻av无码专区 | 国内综合精品午夜久久资源 | 国产精品无码一区二区桃花视频 | 欧美日韩人成综合在线播放 | 精品亚洲成av人在线观看 | 亚洲 高清 成人 动漫 | 一本久久伊人热热精品中文字幕 | 乱中年女人伦av三区 | 国产乱子伦视频在线播放 | 欧美日本免费一区二区三区 | 久久99精品国产麻豆 | 最近的中文字幕在线看视频 | 久久国语露脸国产精品电影 | 国产亚洲欧美在线专区 | 窝窝午夜理论片影院 | 小泽玛莉亚一区二区视频在线 | 樱花草在线播放免费中文 | 一个人看的www免费视频在线观看 | 久久久婷婷五月亚洲97号色 | 日本护士毛茸茸高潮 | 人妻少妇精品无码专区二区 | 国产成人无码午夜视频在线观看 | 天下第一社区视频www日本 | 亚洲一区二区三区国产精华液 | 成人av无码一区二区三区 | 成人免费视频一区二区 | 无码吃奶揉捏奶头高潮视频 | 久久精品中文字幕一区 | 亚洲一区二区三区四区 | 亚洲天堂2017无码 | 亚洲精品午夜无码电影网 | 强开小婷嫩苞又嫩又紧视频 | 色婷婷久久一区二区三区麻豆 | 国产极品美女高潮无套在线观看 | 国产午夜精品一区二区三区嫩草 | 国产三级精品三级男人的天堂 | 人人妻人人澡人人爽人人精品浪潮 | 99久久精品无码一区二区毛片 | 少妇性俱乐部纵欲狂欢电影 | 巨爆乳无码视频在线观看 | 麻豆md0077饥渴少妇 | 日本精品人妻无码免费大全 | 国产色xx群视频射精 | 香蕉久久久久久av成人 | 东京一本一道一二三区 | 国产综合在线观看 | 国产精品人人爽人人做我的可爱 | 亚洲欧洲日本综合aⅴ在线 | 国产精品手机免费 | 黑人巨大精品欧美一区二区 | 国产两女互慰高潮视频在线观看 | 国产精品高潮呻吟av久久 | 少妇无码av无码专区在线观看 | 国产偷自视频区视频 | 亚洲伊人久久精品影院 | 丰满少妇熟乱xxxxx视频 | 九九在线中文字幕无码 | 国产亲子乱弄免费视频 | 成熟妇人a片免费看网站 | www国产精品内射老师 | 色欲av亚洲一区无码少妇 | 无码人中文字幕 | 97人妻精品一区二区三区 | 永久免费观看国产裸体美女 | 免费无码的av片在线观看 | 亚洲色www成人永久网址 | 东京无码熟妇人妻av在线网址 | 精品久久久久久亚洲精品 | 国产亚洲美女精品久久久2020 | 亚洲色欲久久久综合网东京热 | 国内精品久久毛片一区二区 | 野狼第一精品社区 | 色一情一乱一伦 | 人人爽人人爽人人片av亚洲 | 亚洲欧美日韩国产精品一区二区 | 四虎永久在线精品免费网址 | 天海翼激烈高潮到腰振不止 | 精品偷自拍另类在线观看 | 久久久久亚洲精品中文字幕 | 午夜熟女插插xx免费视频 | 综合网日日天干夜夜久久 | 久久久久se色偷偷亚洲精品av | 久久国产精品二国产精品 | 国产国产精品人在线视 | 亚洲综合无码一区二区三区 | 永久免费精品精品永久-夜色 | 国产精品内射视频免费 | 亚洲精品久久久久avwww潮水 | 国产麻豆精品一区二区三区v视界 | 国产农村妇女高潮大叫 | 久久久久久久人妻无码中文字幕爆 | 日本免费一区二区三区最新 | 国产黑色丝袜在线播放 | 国产无遮挡吃胸膜奶免费看 | 88国产精品欧美一区二区三区 | 久久久精品欧美一区二区免费 | 国产精品久久久一区二区三区 | 丰满岳乱妇在线观看中字无码 | 亚洲经典千人经典日产 | 一本久道高清无码视频 | 久久久久久国产精品无码下载 | 人妻少妇精品无码专区动漫 | 三级4级全黄60分钟 | 色婷婷综合中文久久一本 | 国产凸凹视频一区二区 | 久久精品成人欧美大片 | 亚洲色偷偷男人的天堂 | 亚洲欧美精品aaaaaa片 | 国产精品永久免费视频 | 中文精品无码中文字幕无码专区 | 久久精品中文字幕一区 | 精品久久久久香蕉网 | 色噜噜亚洲男人的天堂 | 国产精品18久久久久久麻辣 | 国产深夜福利视频在线 | 亚洲精品一区二区三区在线 | 76少妇精品导航 | 中文字幕乱妇无码av在线 | 国产一精品一av一免费 | 国产精品99久久精品爆乳 | 亚洲精品一区二区三区在线 | 久热国产vs视频在线观看 | 青春草在线视频免费观看 | 色综合久久网 | 国产香蕉尹人综合在线观看 | 久久zyz资源站无码中文动漫 | 国产绳艺sm调教室论坛 | 97久久国产亚洲精品超碰热 | 亚洲 激情 小说 另类 欧美 | 亚洲a无码综合a国产av中文 | 欧美日韩一区二区综合 | 人妻互换免费中文字幕 | 国内精品久久久久久中文字幕 | 国产综合色产在线精品 | 色欲综合久久中文字幕网 | 强开小婷嫩苞又嫩又紧视频 | 亚洲一区二区三区播放 | 日韩人妻无码中文字幕视频 | 国内老熟妇对白xxxxhd | 色五月丁香五月综合五月 | 国产超碰人人爽人人做人人添 | 超碰97人人射妻 | 欧美freesex黑人又粗又大 | 久久久成人毛片无码 | 国产av剧情md精品麻豆 | 波多野结衣 黑人 | 国产精品福利视频导航 | 国产真实夫妇视频 | 免费视频欧美无人区码 | 欧美丰满少妇xxxx性 | 网友自拍区视频精品 | 精品国产乱码久久久久乱码 | 午夜精品久久久久久久久 | 亚洲国产精品久久人人爱 | 久久熟妇人妻午夜寂寞影院 | 亚洲一区二区三区无码久久 | 成 人 网 站国产免费观看 | 波多野结衣高清一区二区三区 | 色诱久久久久综合网ywww | 国产精品丝袜黑色高跟鞋 | 国内精品久久久久久中文字幕 | 日产精品高潮呻吟av久久 | 精品久久久久久人妻无码中文字幕 | √天堂中文官网8在线 | 日韩 欧美 动漫 国产 制服 | 无码精品人妻一区二区三区av | 久久精品中文字幕一区 | 久久亚洲国产成人精品性色 | 国产精品高潮呻吟av久久 | 欧美老熟妇乱xxxxx | 国产精品内射视频免费 | 久久精品人人做人人综合 | 国产精品久久福利网站 | 国产精品国产三级国产专播 | 黑人巨大精品欧美一区二区 | 丰满岳乱妇在线观看中字无码 | 色老头在线一区二区三区 | 曰本女人与公拘交酡免费视频 | 亚洲国产午夜精品理论片 | 国产真实乱对白精彩久久 | 5858s亚洲色大成网站www | 精品国精品国产自在久国产87 | 99视频精品全部免费免费观看 | 国产乱人伦偷精品视频 | 最近的中文字幕在线看视频 | 欧美兽交xxxx×视频 | 在线播放免费人成毛片乱码 | 精品国产精品久久一区免费式 | 国产明星裸体无码xxxx视频 | 日本一卡2卡3卡四卡精品网站 | 亚洲男人av香蕉爽爽爽爽 | 俄罗斯老熟妇色xxxx | 日本乱人伦片中文三区 | 久久久久人妻一区精品色欧美 | 水蜜桃亚洲一二三四在线 | 亚洲一区二区三区国产精华液 | 一本久道久久综合婷婷五月 | 伊人久久婷婷五月综合97色 | 亚洲乱码日产精品bd | 宝宝好涨水快流出来免费视频 | 久久久久久久人妻无码中文字幕爆 | 国产精品无码一区二区桃花视频 | 久久久久av无码免费网 | 国产精品亚洲一区二区三区喷水 | 少妇久久久久久人妻无码 | 四虎4hu永久免费 | 亚洲色欲色欲天天天www | 国产午夜精品一区二区三区嫩草 | 久久综合香蕉国产蜜臀av | 久久国产精品_国产精品 | 国产国语老龄妇女a片 | 日本一卡二卡不卡视频查询 | 亚洲欧洲日本综合aⅴ在线 | 亚洲中文字幕在线观看 | 日本精品人妻无码免费大全 | 国产成人久久精品流白浆 | 国产精品鲁鲁鲁 | 日本熟妇大屁股人妻 | 人妻体内射精一区二区三四 | 日日噜噜噜噜夜夜爽亚洲精品 | 一本色道婷婷久久欧美 | 秋霞特色aa大片 | 蜜桃无码一区二区三区 | 小sao货水好多真紧h无码视频 | 性色欲网站人妻丰满中文久久不卡 | 无码人妻丰满熟妇区五十路百度 | 免费无码肉片在线观看 | 人妻天天爽夜夜爽一区二区 | 少妇人妻偷人精品无码视频 | 97夜夜澡人人爽人人喊中国片 | 大乳丰满人妻中文字幕日本 | 久久亚洲国产成人精品性色 | 亚洲精品鲁一鲁一区二区三区 | 国产无套内射久久久国产 | 成 人 网 站国产免费观看 | 久久综合给久久狠狠97色 | 大肉大捧一进一出视频出来呀 | 狠狠综合久久久久综合网 | 99久久人妻精品免费一区 | 亚洲第一网站男人都懂 | 亚洲欧美日韩综合久久久 | 久激情内射婷内射蜜桃人妖 | 国产艳妇av在线观看果冻传媒 | 欧美丰满少妇xxxx性 | 亚洲一区二区观看播放 | 亚洲熟妇色xxxxx欧美老妇 | 国产成人精品视频ⅴa片软件竹菊 | 宝宝好涨水快流出来免费视频 | 激情五月综合色婷婷一区二区 | 人人妻人人澡人人爽欧美一区九九 | 国产内射爽爽大片视频社区在线 | 亚拍精品一区二区三区探花 | 精品国产一区二区三区四区 | 午夜精品久久久内射近拍高清 | 国产97色在线 | 免 | 亚洲码国产精品高潮在线 | 少妇无码av无码专区在线观看 | 午夜男女很黄的视频 | 国产乡下妇女做爰 | 熟女体下毛毛黑森林 | 成人动漫在线观看 | 中文字幕乱码中文乱码51精品 | 国内精品人妻无码久久久影院 | 在线欧美精品一区二区三区 | 人人澡人摸人人添 | 在线成人www免费观看视频 | 久久久av男人的天堂 | 强奷人妻日本中文字幕 | 日本精品久久久久中文字幕 | 成人无码影片精品久久久 | 久久久久久久人妻无码中文字幕爆 | 国产情侣作爱视频免费观看 | 97人妻精品一区二区三区 | 99久久久无码国产aaa精品 | 亚洲欧洲中文日韩av乱码 | av无码电影一区二区三区 | 日本高清一区免费中文视频 | 国产精品99爱免费视频 | 欧洲欧美人成视频在线 | 欧美黑人巨大xxxxx | 亚洲色大成网站www国产 | 成 人 网 站国产免费观看 | 精品人妻中文字幕有码在线 | 伊人久久婷婷五月综合97色 | 久久久久免费精品国产 | 天堂亚洲免费视频 | 亚洲中文字幕久久无码 | 成熟女人特级毛片www免费 | 亚洲欧美色中文字幕在线 | www成人国产高清内射 | 国产亚洲精品久久久久久久久动漫 | 免费国产成人高清在线观看网站 | 男人和女人高潮免费网站 | 人妻夜夜爽天天爽三区 | 人人妻人人藻人人爽欧美一区 | 内射欧美老妇wbb | 98国产精品综合一区二区三区 | 亚洲人成网站色7799 | 国产做国产爱免费视频 | 国产成人精品一区二区在线小狼 | 久久亚洲中文字幕精品一区 | 熟妇人妻激情偷爽文 | 欧美一区二区三区视频在线观看 | 曰韩少妇内射免费播放 | 国产精华av午夜在线观看 | 成人动漫在线观看 | 国内揄拍国内精品少妇国语 | 性开放的女人aaa片 | 欧美老熟妇乱xxxxx | 国产69精品久久久久app下载 | 精品欧洲av无码一区二区三区 | 欧美丰满老熟妇xxxxx性 | 国产亲子乱弄免费视频 | 丰满少妇人妻久久久久久 | 中文精品无码中文字幕无码专区 | 少妇性l交大片欧洲热妇乱xxx | 爱做久久久久久 | a在线亚洲男人的天堂 | 激情亚洲一区国产精品 | 国产麻豆精品精东影业av网站 | 日本一卡2卡3卡四卡精品网站 | 日韩av激情在线观看 | 夜先锋av资源网站 | 蜜桃视频插满18在线观看 | 免费观看又污又黄的网站 | 中文毛片无遮挡高清免费 | 亚洲成av人综合在线观看 | 国模大胆一区二区三区 | 一本久道久久综合婷婷五月 | 国产午夜福利100集发布 | 波多野结衣aⅴ在线 | 亚洲熟悉妇女xxx妇女av | 亚洲精品无码人妻无码 | 女人被爽到呻吟gif动态图视看 | 无码av岛国片在线播放 | 日韩视频 中文字幕 视频一区 | 亚洲色欲色欲欲www在线 | 精品无码一区二区三区的天堂 | 麻豆md0077饥渴少妇 | 日韩人妻少妇一区二区三区 | 色婷婷久久一区二区三区麻豆 | 亚洲精品国产精品乱码不卡 | 亚洲人成网站免费播放 | 亚洲日本va午夜在线电影 | 激情内射亚州一区二区三区爱妻 | 无码播放一区二区三区 | 奇米影视7777久久精品人人爽 | 欧美第一黄网免费网站 | 国产精品-区区久久久狼 | 我要看www免费看插插视频 | 熟女少妇在线视频播放 | 成人亚洲精品久久久久 | 中文字幕 亚洲精品 第1页 | 精品国精品国产自在久国产87 | 99久久久无码国产精品免费 | 性生交片免费无码看人 | 亚洲日韩av片在线观看 | 无码吃奶揉捏奶头高潮视频 | 久久精品国产99精品亚洲 | 中文字幕无码日韩欧毛 | 亚洲中文字幕在线无码一区二区 | 狠狠色噜噜狠狠狠狠7777米奇 | 玩弄中年熟妇正在播放 | 亚洲第一网站男人都懂 | 高潮毛片无遮挡高清免费 | 在线а√天堂中文官网 | 2020久久香蕉国产线看观看 | 国产乱码精品一品二品 | 国产内射爽爽大片视频社区在线 | 东京无码熟妇人妻av在线网址 | 国产精品亚洲一区二区三区喷水 | 真人与拘做受免费视频一 | 性生交片免费无码看人 | 性欧美疯狂xxxxbbbb | 久久国产自偷自偷免费一区调 | 亚洲а∨天堂久久精品2021 | 天天做天天爱天天爽综合网 | 天堂亚洲2017在线观看 | 精品国产一区二区三区四区在线看 | 欧美自拍另类欧美综合图片区 | 国产激情精品一区二区三区 | 亚洲精品成a人在线观看 | 丁香啪啪综合成人亚洲 | 国产成人综合在线女婷五月99播放 | 成熟人妻av无码专区 | 人妻少妇精品无码专区动漫 | 熟女体下毛毛黑森林 | 国内少妇偷人精品视频免费 | 免费无码av一区二区 | 久久99精品国产麻豆 | 国产精品a成v人在线播放 | 午夜理论片yy44880影院 | 狠狠色欧美亚洲狠狠色www | 成人欧美一区二区三区黑人 | 亚洲一区二区三区在线观看网站 | 日本欧美一区二区三区乱码 | 狠狠噜狠狠狠狠丁香五月 | 国产精品视频免费播放 | 亚洲精品国偷拍自产在线观看蜜桃 | 性欧美牲交在线视频 | 欧美日本免费一区二区三区 | 综合人妻久久一区二区精品 | 国产精品怡红院永久免费 | 日本一区二区更新不卡 | 无遮挡国产高潮视频免费观看 | av人摸人人人澡人人超碰下载 | 色婷婷久久一区二区三区麻豆 | 精品无码一区二区三区的天堂 | 日本一区二区三区免费高清 | 天下第一社区视频www日本 | 成人精品视频一区二区三区尤物 | 无套内谢的新婚少妇国语播放 | 精品久久久久香蕉网 | aa片在线观看视频在线播放 | 天天躁夜夜躁狠狠是什么心态 | 丝袜足控一区二区三区 | 日日夜夜撸啊撸 | 精品偷拍一区二区三区在线看 | 乌克兰少妇xxxx做受 | 国产美女极度色诱视频www | 成熟人妻av无码专区 | 欧洲美熟女乱又伦 | 久久精品中文字幕一区 | 亚洲精品午夜无码电影网 | 色偷偷人人澡人人爽人人模 | 天天拍夜夜添久久精品大 | 亚洲区小说区激情区图片区 | 亚洲人成网站免费播放 | 西西人体www44rt大胆高清 | 三上悠亚人妻中文字幕在线 | 影音先锋中文字幕无码 | 沈阳熟女露脸对白视频 | 欧美性猛交xxxx富婆 | 狠狠色噜噜狠狠狠狠7777米奇 | 狂野欧美性猛交免费视频 | 亚洲乱码国产乱码精品精 | 成人一在线视频日韩国产 | 人妻少妇被猛烈进入中文字幕 | 亚洲精品久久久久久一区二区 | 波多野结衣一区二区三区av免费 | 动漫av网站免费观看 | 亚洲熟妇色xxxxx欧美老妇y | 久久久久久亚洲精品a片成人 | 色欲久久久天天天综合网精品 | 丰满少妇弄高潮了www | 激情五月综合色婷婷一区二区 | 97无码免费人妻超级碰碰夜夜 | 宝宝好涨水快流出来免费视频 | 国产人妻精品一区二区三区 | 精品国产aⅴ无码一区二区 | 免费看少妇作爱视频 | 亚洲毛片av日韩av无码 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 无码人妻丰满熟妇区毛片18 | 国产精品丝袜黑色高跟鞋 | 亚洲精品中文字幕久久久久 | 国产一区二区三区四区五区加勒比 | 亚洲精品国产品国语在线观看 | 午夜福利一区二区三区在线观看 | 成人性做爰aaa片免费看 | 香蕉久久久久久av成人 | 日日碰狠狠躁久久躁蜜桃 | 一本久久伊人热热精品中文字幕 | 99久久精品国产一区二区蜜芽 | 亚洲中文无码av永久不收费 | 久久久久免费精品国产 | 亚洲色无码一区二区三区 | 亚洲国产一区二区三区在线观看 | 国产精品怡红院永久免费 | 国产成人av免费观看 | 欧洲精品码一区二区三区免费看 | 亚洲精品美女久久久久久久 | 美女扒开屁股让男人桶 | 欧美人与禽zoz0性伦交 | 欧美性生交活xxxxxdddd | 老子影院午夜伦不卡 | 国内精品人妻无码久久久影院 | 曰韩无码二三区中文字幕 | 青青青手机频在线观看 | 国产欧美熟妇另类久久久 | av无码不卡在线观看免费 | 欧美大屁股xxxxhd黑色 | 日本一区二区更新不卡 | 一本一道久久综合久久 | yw尤物av无码国产在线观看 | 国产亚洲欧美在线专区 | 粉嫩少妇内射浓精videos | 欧美激情内射喷水高潮 | 色婷婷综合中文久久一本 | 国产色精品久久人妻 | 精品国产一区二区三区四区 | 国产成人无码av片在线观看不卡 | 久久午夜无码鲁丝片 | 亚洲精品一区二区三区四区五区 | 久久精品国产一区二区三区 | 国产绳艺sm调教室论坛 | 日韩精品成人一区二区三区 | 国产精品无码永久免费888 | 99精品久久毛片a片 | 性色av无码免费一区二区三区 | 精品一二三区久久aaa片 | 成人欧美一区二区三区 | 亚洲综合色区中文字幕 | 国产女主播喷水视频在线观看 | 亚洲国产精华液网站w | 亚洲男人av香蕉爽爽爽爽 | 熟女俱乐部五十路六十路av | 国产农村乱对白刺激视频 | 欧美国产亚洲日韩在线二区 | 少妇人妻av毛片在线看 | 中文精品无码中文字幕无码专区 | 国产色xx群视频射精 | 久久久中文字幕日本无吗 | 亚洲精品国产精品乱码不卡 | 人妻aⅴ无码一区二区三区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 欧洲精品码一区二区三区免费看 | 国产日产欧产精品精品app | 狠狠色噜噜狠狠狠7777奇米 | 牲欲强的熟妇农村老妇女视频 | 老熟女重囗味hdxx69 | 未满小14洗澡无码视频网站 | 久久国产精品精品国产色婷婷 | 亚洲精品久久久久中文第一幕 | 美女黄网站人色视频免费国产 | 夫妻免费无码v看片 | 久久aⅴ免费观看 | 久久99久久99精品中文字幕 | 永久免费观看美女裸体的网站 | 午夜无码人妻av大片色欲 | 四虎4hu永久免费 | 国产精品久久久久久亚洲影视内衣 | 高清无码午夜福利视频 | 狂野欧美性猛xxxx乱大交 | 国产精品嫩草久久久久 | 性色欲网站人妻丰满中文久久不卡 | 亚洲熟妇色xxxxx欧美老妇y | 国产亚洲精品久久久ai换 | 精品熟女少妇av免费观看 | 精品无码av一区二区三区 | 欧美xxxxx精品 | 成人精品视频一区二区三区尤物 | 国产片av国语在线观看 | 欧美三级a做爰在线观看 | 3d动漫精品啪啪一区二区中 | 男女超爽视频免费播放 | 国产精品嫩草久久久久 | 国产欧美熟妇另类久久久 | 麻豆国产丝袜白领秘书在线观看 | 亚洲狠狠婷婷综合久久 | 一本久道久久综合婷婷五月 | 国产精品高潮呻吟av久久 | 狠狠亚洲超碰狼人久久 | 久久久久国色av免费观看性色 | 国产后入清纯学生妹 | 青春草在线视频免费观看 | 女人被爽到呻吟gif动态图视看 | 亚洲小说图区综合在线 | 亚洲爆乳无码专区 | 国产va免费精品观看 | 曰韩无码二三区中文字幕 | 欧美熟妇另类久久久久久多毛 | 人妻天天爽夜夜爽一区二区 | 国产精品人妻一区二区三区四 | 国产精品永久免费视频 | 动漫av网站免费观看 | 日产精品99久久久久久 | 无码毛片视频一区二区本码 | 久激情内射婷内射蜜桃人妖 | 亚洲国产精品久久人人爱 | 国产热a欧美热a在线视频 | 亚洲春色在线视频 | 天天拍夜夜添久久精品 | 中国大陆精品视频xxxx | 少妇邻居内射在线 | 伊人久久大香线焦av综合影院 | 国产三级精品三级男人的天堂 | av在线亚洲欧洲日产一区二区 | 99久久人妻精品免费二区 | 婷婷丁香六月激情综合啪 | 国产成人精品优优av | 精品国精品国产自在久国产87 | 精品乱码久久久久久久 | 亚洲人成影院在线无码按摩店 | a国产一区二区免费入口 | 亚洲国产欧美在线成人 | 日日摸夜夜摸狠狠摸婷婷 | 久久精品女人天堂av免费观看 | 成人无码视频免费播放 | 久久综合色之久久综合 | 久久人人97超碰a片精品 | 亚洲欧美色中文字幕在线 | 日韩 欧美 动漫 国产 制服 | 伊人久久婷婷五月综合97色 | 国产又粗又硬又大爽黄老大爷视 | 无码成人精品区在线观看 | 永久免费观看国产裸体美女 | 欧美zoozzooz性欧美 | 国精产品一区二区三区 | 国产色精品久久人妻 | 国内精品久久久久久中文字幕 | 欧美丰满熟妇xxxx | 日韩人妻无码一区二区三区久久99 | 无码av免费一区二区三区试看 | 99精品国产综合久久久久五月天 | 乱人伦人妻中文字幕无码久久网 | 国产无套内射久久久国产 | 亚洲国产精品毛片av不卡在线 | 精品偷拍一区二区三区在线看 | 丰满岳乱妇在线观看中字无码 | 无码帝国www无码专区色综合 | 亚洲一区二区观看播放 | 国产性生大片免费观看性 | 无套内射视频囯产 | 一区二区三区乱码在线 | 欧洲 | 亚无码乱人伦一区二区 | 97无码免费人妻超级碰碰夜夜 | 天天爽夜夜爽夜夜爽 | 国内揄拍国内精品人妻 | 性欧美videos高清精品 | 欧美第一黄网免费网站 | 无码人妻丰满熟妇区毛片18 | 亚洲成熟女人毛毛耸耸多 | 国产免费无码一区二区视频 | 国产九九九九九九九a片 | 日日摸夜夜摸狠狠摸婷婷 | 老司机亚洲精品影院 | 激情人妻另类人妻伦 | 曰韩少妇内射免费播放 | 亚洲人成影院在线无码按摩店 | 色综合久久久无码网中文 | 精品无码国产自产拍在线观看蜜 | 2020久久香蕉国产线看观看 | 国产国产精品人在线视 | 国产va免费精品观看 | 国产亚洲精品久久久久久久 | 荫蒂被男人添的好舒服爽免费视频 | 国产国语老龄妇女a片 | 色一情一乱一伦一区二区三欧美 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲精品国产a久久久久久 | 色综合久久久无码网中文 | 国产精品.xx视频.xxtv | 欧美日韩久久久精品a片 | 日本一卡二卡不卡视频查询 | 国产成人无码一二三区视频 | 1000部夫妻午夜免费 | 扒开双腿吃奶呻吟做受视频 | 岛国片人妻三上悠亚 | 国产黄在线观看免费观看不卡 | 日本熟妇乱子伦xxxx | 亚洲日韩av一区二区三区中文 | 麻豆av传媒蜜桃天美传媒 | 久久国产精品精品国产色婷婷 | 日本一区二区三区免费高清 | 亚洲精品综合一区二区三区在线 | 久久久亚洲欧洲日产国码αv | 亚洲а∨天堂久久精品2021 | 色综合久久久无码中文字幕 | 成年女人永久免费看片 | 国产乱码精品一品二品 | 国产精品无码一区二区三区不卡 | www国产精品内射老师 | 日韩在线不卡免费视频一区 | 亚洲成av人在线观看网址 | 无码成人精品区在线观看 | 乱码午夜-极国产极内射 | 窝窝午夜理论片影院 | 色老头在线一区二区三区 | 亚洲日韩av片在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲爆乳大丰满无码专区 | 免费无码一区二区三区蜜桃大 | 青春草在线视频免费观看 | 在线精品国产一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 日本精品高清一区二区 | 国产亚洲精品久久久ai换 | 亚洲春色在线视频 | 国产99久久精品一区二区 | 少妇性l交大片 | 日本大香伊一区二区三区 | 国产精品美女久久久网av | 久久午夜夜伦鲁鲁片无码免费 | 日本va欧美va欧美va精品 | 性色欲网站人妻丰满中文久久不卡 | 国产特级毛片aaaaaaa高清 | 国产精品对白交换视频 | 久久精品中文字幕大胸 | 日本一区二区三区免费高清 | 色狠狠av一区二区三区 | 强辱丰满人妻hd中文字幕 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲大尺度无码无码专区 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲码国产精品高潮在线 | 亚洲日本一区二区三区在线 | 亚洲色无码一区二区三区 | 乱中年女人伦av三区 | 久久久精品国产sm最大网站 | 99视频精品全部免费免费观看 | 久久久久亚洲精品男人的天堂 | 99国产精品白浆在线观看免费 | 野狼第一精品社区 | 精品亚洲韩国一区二区三区 | 欧美日韩综合一区二区三区 | 精品aⅴ一区二区三区 | 久久精品成人欧美大片 | 2019nv天堂香蕉在线观看 | 人妻少妇精品无码专区动漫 | 国产成人人人97超碰超爽8 | 人妻无码久久精品人妻 | 国产成人精品一区二区在线小狼 | 少妇邻居内射在线 | 午夜福利一区二区三区在线观看 | 又大又黄又粗又爽的免费视频 | 99久久久无码国产aaa精品 | 欧美熟妇另类久久久久久不卡 | 久久久久免费精品国产 | 久久无码中文字幕免费影院蜜桃 | 国产av人人夜夜澡人人爽麻豆 | 无码成人精品区在线观看 | 一个人看的www免费视频在线观看 | 国内丰满熟女出轨videos | 2020久久香蕉国产线看观看 | 国产超碰人人爽人人做人人添 | 国产成人综合美国十次 | 俺去俺来也在线www色官网 | 东京一本一道一二三区 | 国产性生交xxxxx无码 | 亚洲色偷偷男人的天堂 | 精品无码国产自产拍在线观看蜜 | 国产精品a成v人在线播放 | 亚洲精品久久久久久久久久久 | 国产偷国产偷精品高清尤物 | 亚洲综合色区中文字幕 | 国产精品自产拍在线观看 | 人妻夜夜爽天天爽三区 | 一本久道久久综合狠狠爱 | 久久久久久国产精品无码下载 | 99久久久无码国产aaa精品 | 亚洲中文字幕乱码av波多ji | 欧美丰满少妇xxxx性 | 偷窥村妇洗澡毛毛多 | 国产超级va在线观看视频 | 无人区乱码一区二区三区 | 超碰97人人射妻 | 中文无码精品a∨在线观看不卡 | 日韩少妇白浆无码系列 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产精品久久久久久无码 | 在教室伦流澡到高潮hnp视频 | 亚洲 a v无 码免 费 成 人 a v | 亚洲色欲色欲欲www在线 | 精品国产青草久久久久福利 | 伊人久久大香线焦av综合影院 | 日韩少妇内射免费播放 | 婷婷丁香五月天综合东京热 | 国产在线一区二区三区四区五区 | 亚洲国产欧美在线成人 | 蜜桃视频韩日免费播放 | 日韩人妻少妇一区二区三区 | 亚洲男人av香蕉爽爽爽爽 | 无码国内精品人妻少妇 | 伊人久久大香线焦av综合影院 | 1000部啪啪未满十八勿入下载 | 国产做国产爱免费视频 | 亚洲阿v天堂在线 | 67194成是人免费无码 | 国产内射老熟女aaaa |