日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

iOS之深入分析GCD的函数与队列以及多种组合使用

發(fā)布時間:2024/5/21 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS之深入分析GCD的函数与队列以及多种组合使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、GCD 簡介

① 什么是 GCD ?
  • GCD 是 Apple 開發(fā)的一個多核編程的較新的解決方法;
  • GCD 全稱:Grand Central Dispatch,是純 C 語言,提供非常多強大的函數(shù);
  • 它主要用于優(yōu)化應用程序以支持多核處理器以及其他對稱多處理系統(tǒng);
  • 它是一個在線程池模式的基礎(chǔ)上執(zhí)行的并發(fā)任務(wù);
  • 在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。
  • 簡而言之,GCD 就是將任務(wù)添加到隊列,并指定任務(wù)執(zhí)行的函數(shù)
② GCD 優(yōu)勢
  • GCD 是蘋果公司為多核的并行運算提出的解決方案;
  • GCD 會自動利用更多的CPU內(nèi)核(比如雙核、四核);
  • GCD 會自動管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)、銷毀線程);
  • 程序員只需要告訴 GCD 想要執(zhí)行什么任務(wù),不需要編寫任何線程管理代碼。

二、任務(wù)與隊列

① 任務(wù)
  • 任務(wù)就是執(zhí)行操作的意思,換句話說就是在線程中執(zhí)行的那段代碼,在 GCD 中是放在 block 中的。
  • 執(zhí)行任務(wù)有兩種方式:『同步執(zhí)行』 和 『異步執(zhí)行』。兩者的主要區(qū)別是:是否等待隊列的任務(wù)執(zhí)行結(jié)束,以及是否具備開啟新線程的能力。
  • 同步執(zhí)行(sync):
    • 同步添加任務(wù)到指定的隊列中,在添加的任務(wù)執(zhí)行結(jié)束之前,會一直等待,直到隊列里面的任務(wù)完成之后再繼續(xù)執(zhí)行;
    • 只能在當前線程中執(zhí)行任務(wù),不具備開啟新線程的能力。
  • 異步執(zhí)行(async):
    • 異步添加任務(wù)到指定的隊列中,它不會做任何等待,可以繼續(xù)執(zhí)行任務(wù);
    • 可以在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力。
  • 任務(wù)的創(chuàng)建:GCD 提供了同步執(zhí)行任務(wù)的創(chuàng)建方法 dispatch_sync 和異步執(zhí)行任務(wù)創(chuàng)建方法 dispatch_async。
// 同步執(zhí)行任務(wù)創(chuàng)建方法dispatch_sync(queue, ^{// 同步執(zhí)行任務(wù)代碼});// 異步執(zhí)行任務(wù)創(chuàng)建方法dispatch_async(queue, ^{// 異步執(zhí)行任務(wù)代碼});
② 隊列
  • 隊列指執(zhí)行任務(wù)的等待隊列,即用來存放任務(wù)的隊列。
  • 隊列是一種特殊的線性表,采用 FIFO(先進先出)的原則,即新任務(wù)總是被插入到隊列的末尾,而讀取任務(wù)的時候總是從隊列的頭部開始讀取。每讀取一個任務(wù),則從隊列中釋放一個任務(wù)。
  • 隊列的結(jié)構(gòu)可參考下圖:

  • 在 GCD 中有兩種隊列:『串行隊列』 和 『并發(fā)隊列』,兩者都符合 FIFO(先進先出)的原則,主要區(qū)別是:執(zhí)行順序不同,以及開啟線程數(shù)不同。
  • 串行隊列(Serial Dispatch Queue):每次只有一個任務(wù)被執(zhí)行,讓任務(wù)一個接著一個地執(zhí)行(只開啟一個線程,一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù)),如下:

  • 使用dispatch_queue_create(“xx”, DISPATCH_QUEUE_SERIAL)創(chuàng)建串行隊列,其中的 DISPATCH_QUEUE_SERIAL 也可以使用 NULL 表示,這兩種均表示默認的串行隊列;
// 串行隊列的獲取方法dispatch_queue_t serialQueue1 = dispatch_queue_create("com.YDW.Queue", NULL);dispatch_queue_t serialQueue2 = dispatch_queue_create("com.YDW.Queue", DISPATCH_QUEUE_SERIAL);
  • 并發(fā)隊列(Concurrent Dispatch Queue):可以讓多個任務(wù)并發(fā)(同時)執(zhí)行(可以開啟多個線程,并且同時執(zhí)行任務(wù)),如下:

  • 使用 dispatch_queue_create(“xxx”, DISPATCH_QUEUE_CONCURRENT) 創(chuàng)建并發(fā)隊列:
// 并發(fā)隊列的獲取方法dispatch_queue_t concurrentQueue = dispatch_queue_create("com.YDW.Queue", DISPATCH_QUEUE_CONCURRENT);
  • 注意:并發(fā)隊列的并發(fā)功能只有在異步函數(shù)(dispatch_async)下才有效。
③ 主隊列和全局并發(fā)隊列
  • 主隊列(Main Dispatch Queue):GCD 中提供的特殊的串行隊列:
    • 主要用來在主線程上調(diào)度任務(wù)的串行隊列,依賴于主線程、主 Runloop,在 main 函數(shù)調(diào)用之前自動創(chuàng)建;
    • 不會開啟線程;
    • 如果當前主線程正在有任務(wù)執(zhí)行,那么無論主隊列中當前被添加了什么任務(wù),都不會被調(diào)度;
    • 使用dispatch_get_main_queue()獲得主隊列;
    • 通常在返回主線程 更新UI時使用;
    • 注意:主隊列其實并不特殊,實質(zhì)上就是一個普通的串行隊列,只是因為默認情況下,當前代碼是放在主隊列中的,然后主隊列中的代碼,有都會放到主線程中去執(zhí)行,所以才造成了主隊列特殊的現(xiàn)象。
// 主隊列獲取方法dispatch_queue_t mainQueue = dispatch_get_main_queue();
  • 全局并發(fā)隊列(Global Dispatch Queue):GCD 提供的默認并發(fā)隊列:
    • 為了方便程序員的使用,蘋果提供了全局隊列dispatch_get_global_queue;
    • 在使用多線程開發(fā)時,如果對隊列沒有特殊需求,在執(zhí)行異步任務(wù)時,可以直接使用全局隊列;
    • 使用 dispatch_get_global_queue 獲取全局并發(fā)隊列,最簡單的是dispatch_get_global_queue(0, 0);
    • 全局隊列是一個并發(fā)隊列;
// 全局并發(fā)隊列的獲取方法// 第一個參數(shù)表示隊列優(yōu)先級,默認優(yōu)先級為DISPATCH_QUEUE_PRIORITY_DEFAULT=0,在ios9之后,已經(jīng)被服務(wù)質(zhì)量(quality-of-service)取代;// 第二個參數(shù)暫時沒用,用 0 即可dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);// 優(yōu)先級從高到低(對應的服務(wù)質(zhì)量)依次為- DISPATCH_QUEUE_PRIORITY_HIGH -- QOS_CLASS_USER_INITIATED- DISPATCH_QUEUE_PRIORITY_DEFAULT -- QOS_CLASS_DEFAULT- DISPATCH_QUEUE_PRIORITY_LOW -- QOS_CLASS_UTILITY- DISPATCH_QUEUE_PRIORITY_BACKGROUND -- QOS_CLASS_BACKGROUND
  • 日常開發(fā)中,全局并發(fā)隊列與主隊列通常配合使用:
// 主隊列 + 全局并發(fā)隊列的日常使用dispatch_async(dispatch_get_global_queue(0, 0), ^{// 執(zhí)行耗時操作dispatch_async(dispatch_get_main_queue(), ^{// 回到主線程進行UI操作});});

三、函數(shù)與隊列的組合

(一)組合方式
  • 既然有兩種隊列(串行隊列 / 并發(fā)隊列),兩種任務(wù)執(zhí)行方式(同步執(zhí)行 / 異步執(zhí)行),那么就有了四種不同的組合方式,這四種不同的組合方式是:
同步執(zhí)行 + 串行隊列異步執(zhí)行 + 串行隊列同步執(zhí)行 + 并發(fā)隊列異步執(zhí)行 + 并發(fā)隊列
  • 實際上,上面還提到了兩種默認隊列:全局并發(fā)隊列和主隊列。全局并發(fā)隊列可以作為普通并發(fā)隊列來使用,但是當前代碼默認放在主隊列中,所以就又多了兩種組合方式,這樣就有六種不同的組合方式:
同步執(zhí)行 + 主隊列異步執(zhí)行 + 主隊列
① 同步執(zhí)行 + 串行隊列
  • 任務(wù)按順序執(zhí)行,即任務(wù)一個接一個的在當前線程執(zhí)行,不會開辟新線程:
dispatch_queue_t serialQueue = dispatch_queue_create("com.YDW.queue", NULL);for (int i = 0; i < 5; i++) {dispatch_sync(serialQueue, ^{NSLog(@"同步執(zhí)行 + 串行隊列 : %d-%@", i, [NSThread currentThread]);});}
  • 執(zhí)行結(jié)果如下:
2021-03-24 20:33:25.553587+0800 GCD[48756:7803380] 同步執(zhí)行 + 串行隊列 : 0-<NSThread: 0x600003f3cac0>{number = 1, name = main}2021-03-24 20:33:25.553810+0800 GCD[48756:7803380] 同步執(zhí)行 + 串行隊列 : 1-<NSThread: 0x600003f3cac0>{number = 1, name = main}2021-03-24 20:33:25.553893+0800 GCD[48756:7803380] 同步執(zhí)行 + 串行隊列 : 2-<NSThread: 0x600003f3cac0>{number = 1, name = main}2021-03-24 20:33:25.553984+0800 GCD[48756:7803380] 同步執(zhí)行 + 串行隊列 : 3-<NSThread: 0x600003f3cac0>{number = 1, name = main}2021-03-24 20:33:25.554072+0800 GCD[48756:7803380] 同步執(zhí)行 + 串行隊列 : 4-<NSThread: 0x600003f3cac0>{number = 1, name = main}
② 異步執(zhí)行 + 串行隊列
  • 任務(wù)按順序執(zhí)行,即任務(wù)一個接一個的執(zhí)行,但會開辟新線程:
dispatch_queue_t serialQueue = dispatch_queue_create("com.YDW.queue", NULL);for (int i = 0; i < 5; i++) {dispatch_async(serialQueue, ^{NSLog(@"異步執(zhí)行 + 串行隊列 : %d-%@", i, [NSThread currentThread]);});}
  • 執(zhí)行結(jié)果如下:
2021-03-24 20:35:18.365089+0800 GCD[48776:7805999] 異步執(zhí)行 + 串行隊列 : 0-<NSThread: 0x60000013a100>{number = 8, name = (null)}2021-03-24 20:35:18.365240+0800 GCD[48776:7805999] 異步執(zhí)行 + 串行隊列 : 1-<NSThread: 0x60000013a100>{number = 8, name = (null)}2021-03-24 20:35:18.365366+0800 GCD[48776:7805999] 異步執(zhí)行 + 串行隊列 : 2-<NSThread: 0x60000013a100>{number = 8, name = (null)}2021-03-24 20:35:18.365491+0800 GCD[48776:7805999] 異步執(zhí)行 + 串行隊列 : 3-<NSThread: 0x60000013a100>{number = 8, name = (null)}2021-03-24 20:35:18.365726+0800 GCD[48776:7805999] 異步執(zhí)行 + 串行隊列 : 4-<NSThread: 0x60000013a100>{number = 8, name = (null)}
③ 同步執(zhí)行 + 并發(fā)隊列
  • 任務(wù)按順序執(zhí)行,即任務(wù)一個接一個的執(zhí)行,不開辟線程:
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.YDW.queue", DISPATCH_QUEUE_CONCURRENT);for (int i = 0; i < 5; i++) {dispatch_sync(concurrentQueue, ^{NSLog(@"同步執(zhí)行 + 并發(fā)隊列 : %d-%@", i, [NSThread currentThread]);});}
  • 執(zhí)行結(jié)果如下:
2021-03-24 20:39:46.185808+0800 GCD[48809:7810771] 同步執(zhí)行 + 并發(fā)隊列 : 0-<NSThread: 0x600003388240>{number = 1, name = main}2021-03-24 20:39:46.185940+0800 GCD[48809:7810771] 同步執(zhí)行 + 并發(fā)隊列 : 1-<NSThread: 0x600003388240>{number = 1, name = main}2021-03-24 20:39:46.186041+0800 GCD[48809:7810771] 同步執(zhí)行 + 并發(fā)隊列 : 2-<NSThread: 0x600003388240>{number = 1, name = main}2021-03-24 20:39:46.186150+0800 GCD[48809:7810771] 同步執(zhí)行 + 并發(fā)隊列 : 3-<NSThread: 0x600003388240>{number = 1, name = main}2021-03-24 20:39:46.186258+0800 GCD[48809:7810771] 同步執(zhí)行 + 并發(fā)隊列 : 4-<NSThread: 0x600003388240>{number = 1, name = main}
④ 異步執(zhí)行 + 并發(fā)隊列
  • 任務(wù)無序執(zhí)行,即任務(wù)執(zhí)行無順序,會開辟新線程:
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.YDW.queue", DISPATCH_QUEUE_CONCURRENT);for (int i = 0; i < 5; i++) {dispatch_async(concurrentQueue, ^{NSLog(@"異步執(zhí)行 + 并發(fā)隊列 : %d-%@", i, [NSThread currentThread]);});}
  • 執(zhí)行結(jié)果如下:
2021-03-24 20:42:55.252746+0800 GCD[48847:7815248] 異步執(zhí)行 + 并發(fā)隊列 : 2-<NSThread: 0x600002f6a980>{number = 5, name = (null)}2021-03-24 20:42:55.252747+0800 GCD[48847:7815249] 異步執(zhí)行 + 并發(fā)隊列 : 1-<NSThread: 0x600002f74240>{number = 4, name = (null)}2021-03-24 20:42:55.252750+0800 GCD[48847:7815256] 異步執(zhí)行 + 并發(fā)隊列 : 4-<NSThread: 0x600002f6c140>{number = 7, name = (null)}2021-03-24 20:42:55.252750+0800 GCD[48847:7815251] 異步執(zhí)行 + 并發(fā)隊列 : 0-<NSThread: 0x600002f1ac00>{number = 3, name = (null)}2021-03-24 20:42:55.252756+0800 GCD[48847:7815250] 異步執(zhí)行 + 并發(fā)隊列 : 3-<NSThread: 0x600002f74180>{number = 6, name = (null)}
⑤ 同步執(zhí)行 + 主隊列
  • 任務(wù)相互等待,造成死鎖:
NSLog(@"同步執(zhí)行 + 主隊列 : %@", [NSThread currentThread]);dispatch_queue_t mainQueue = dispatch_get_main_queue();for (int i = 0; i < 5; i++) {dispatch_sync(mainQueue, ^{NSLog(@"同步執(zhí)行 + 主隊列 : %d-%@", i, [NSThread currentThread]);});}
  • 造成死鎖的原因分析:
    • 主隊列有兩個任務(wù),順序為:NSLog 任務(wù) - 同步 block;
    • 執(zhí)行 NSLog 任務(wù)后,執(zhí)行同步 Block,會將任務(wù)1(即i=1時)加入到主隊列,主隊列順序為:NSLog任務(wù) - 同步block - 任務(wù)1;
    • 任務(wù)1的執(zhí)行需要等待同步block執(zhí)行完畢才會執(zhí)行,而同步block的執(zhí)行需要等待任務(wù)1執(zhí)行完畢,所以就造成了任務(wù)互相等待的情況,即造成死鎖崩潰。
⑥ 異步執(zhí)行 + 主隊列
  • 任務(wù)按順序執(zhí)行,即為任務(wù)一個接一個的執(zhí)行,不開辟線程:
dispatch_queue_t mainQueue = dispatch_get_main_queue();for (int i = 0; i < 5; i++) {dispatch_async(mainQueue, ^{NSLog(@"異步執(zhí)行 + 主隊列 : %d-%@", i, [NSThread currentThread]);});}
  • 執(zhí)行結(jié)果如下:
2021-03-24 20:50:18.098874+0800 GCD[48915:7823351] 異步執(zhí)行 + 主隊列 : 0-<NSThread: 0x600003530300>{number = 1, name = main}2021-03-24 20:50:18.099025+0800 GCD[48915:7823351] 異步執(zhí)行 + 主隊列 : 1-<NSThread: 0x600003530300>{number = 1, name = main}2021-03-24 20:50:18.099132+0800 GCD[48915:7823351] 異步執(zhí)行 + 主隊列 : 2-<NSThread: 0x600003530300>{number = 1, name = main}2021-03-24 20:50:18.099232+0800 GCD[48915:7823351] 異步執(zhí)行 + 主隊列 : 3-<NSThread: 0x600003530300>{number = 1, name = main}2021-03-24 20:50:18.099338+0800 GCD[48915:7823351] 異步執(zhí)行 + 主隊列 : 4-<NSThread: 0x600003530300>{number = 1, name = main}
(二)組合區(qū)別
① 主線程
  • 主線程中,不同隊列 +不同任務(wù)簡單組合的區(qū)別:
區(qū)別并發(fā)隊列串行隊列主隊列
同步沒有開啟新線程,串行執(zhí)行任務(wù)沒有開啟新線程,串行執(zhí)行任務(wù)死鎖卡住不執(zhí)行
異步有開啟新線程,并發(fā)執(zhí)行任務(wù)有開啟新線程(1條),串行執(zhí)行任務(wù)沒有開啟新線程,串行執(zhí)行任務(wù)
  • 從上邊可看出: 『主線程』 中調(diào)用 『主隊列』+『同步執(zhí)行』 會導致死鎖問題:
    • 這是因為主隊列中追加的同步任務(wù)和主線程本身的任務(wù)兩者之間相互等待,阻塞了 主隊列,最終造成了主隊列所在的線程(主線程)死鎖問題;
    • 而如果我們在其他線程調(diào)用主隊列 + 同步執(zhí)行,則不會阻塞主隊列,自然也不會造成死鎖問題。最終的結(jié)果是:不會開啟新線程,串行執(zhí)行任務(wù)。
② 隊列
  • 不同隊列 + 不同任務(wù)組合,以及隊列中嵌套隊列使用的區(qū)別:
區(qū)別異步執(zhí)行+并發(fā)隊列嵌套同一個并發(fā)隊列同步執(zhí)行+并發(fā)隊列嵌套同一個并發(fā)隊列異步執(zhí)行+串行隊列嵌套同一個串行隊列同步執(zhí)行+串行隊列嵌套同一個串行隊列
同步(sync)沒有開啟新的線程,串行執(zhí)行任務(wù)沒有開啟新線程,串行執(zhí)行任務(wù)死鎖卡住不執(zhí)行死鎖卡住不執(zhí)行
異步(async)有開啟新線程,并發(fā)執(zhí)行任務(wù)有開啟新線程,并發(fā)執(zhí)行任務(wù)有開啟新線程(1 條),串行執(zhí)行任務(wù)有開啟新線程(1 條),串行執(zhí)行任務(wù)
  • 除了上邊提到的主線程中調(diào)用主隊列 + 同步執(zhí)行會導致死鎖問題。實際在使用串行隊列的時候,也可能出現(xiàn)阻塞串行隊列所在線程的情況發(fā)生,從而造成死鎖問題。這種情況多見于同一個串行隊列的嵌套使用。
  • 下面代碼這樣:在異步執(zhí)行 + 串行任務(wù)的任務(wù)中,又嵌套了當前的串行隊列,然后進行同步執(zhí)行,如下:
dispatch_queue_t queue = dispatch_queue_create("com.YDW.queue", DISPATCH_QUEUE_SERIAL);dispatch_async(queue, ^{ // 異步執(zhí)行 + 串行隊列dispatch_sync(queue, ^{ // 同步執(zhí)行 + 當前串行隊列// 追加任務(wù) 1[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"1---%@",[NSThread currentThread]); // 打印當前線程});});
  • 執(zhí)行上面的代碼會導致串行隊列中追加的任務(wù)和串行隊列中原有的任務(wù)兩者之間相互等待,阻塞了串行隊列,最終造成了串行隊列所在的線程(子線程)死鎖問題。

四、GCD 線程間的通信

  • 在 iOS 開發(fā)過程中,我們一般在主線程里邊進行 UI 刷新,例如:點擊、滾動、拖拽等事件。通常把一些耗時的操作放在其他線程,比如說圖片下載、文件上傳等耗時操作。而有時候在其他線程完成了耗時操作時,需要回到主線程,那么就用到了線程之間的通訊。
// 獲取全局并發(fā)隊列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 獲取主隊列dispatch_queue_t mainQueue = dispatch_get_main_queue();dispatch_async(queue, ^{// 異步追加任務(wù) 1[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"1 : %@",[NSThread currentThread]); // 打印當前線程// 回到主線程dispatch_async(mainQueue, ^{// 追加在主線程中執(zhí)行的任務(wù)[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"2 : %@",[NSThread currentThread]); // 打印當前線程});});
  • 執(zhí)行結(jié)果如下:
2021-03-24 21:12:08.140921+0800 GCD[48987:7842436] 1 : <NSThread: 0x6000029e5340>{number = 5, name = (null)}2021-03-24 21:12:10.142362+0800 GCD[48987:7842289] 2 : <NSThread: 0x6000029a8000>{number = 1, name = main}
  • 可以看到在其他線程中先執(zhí)行任務(wù),執(zhí)行完了之后回到主線程執(zhí)行主線程的相應操作。

五、GCD 其他方法

① GCD 柵欄方法:dispatch_barrier_async
  • 我們有時需要異步執(zhí)行兩組操作,而且第一組操作執(zhí)行完之后,才能開始執(zhí)行第二組操作,這樣就需要一個相當于“柵欄”一樣的一個方法將兩組異步執(zhí)行的操作組給分割起來,當然這里的操作組里可以包含一個或多個任務(wù),這就需要用到dispatch_barrier_async 方法在兩個操作組間形成柵欄。
  • dispatch_barrier_async 方法會等待前邊追加到并發(fā)隊列中的任務(wù)全部執(zhí)行完畢之后,再將指定的任務(wù)追加到該異步隊列中。然后在 dispatch_barrier_async 方法追加的任務(wù)執(zhí)行完畢之后,異步隊列才恢復為一般動作,接著追加任務(wù)到該異步隊列并開始執(zhí)行。具體如下圖所示:

  • 使用如下:
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);dispatch_async(queue, ^{// 追加任務(wù) 1[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"1 : %@",[NSThread currentThread]); // 打印當前線程});dispatch_async(queue, ^{// 追加任務(wù) 2[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"2 : %@",[NSThread currentThread]); // 打印當前線程});dispatch_barrier_async(queue, ^{// 追加任務(wù) barrier[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"barrier : %@",[NSThread currentThread]);// 打印當前線程});dispatch_async(queue, ^{// 追加任務(wù) 3[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"3 : %@",[NSThread currentThread]); // 打印當前線程});dispatch_async(queue, ^{// 追加任務(wù) 4[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"4 : %@",[NSThread currentThread]); // 打印當前線程});
  • 執(zhí)行結(jié)果如下:
2021-03-24 21:27:48.490812+0800 GCD[49065:7858826] 1 : <NSThread: 0x600003976000>{number = 6, name = (null)}2021-03-24 21:27:48.490856+0800 GCD[49065:7858825] 2 : <NSThread: 0x600003973600>{number = 7, name = (null)}2021-03-24 21:27:50.494787+0800 GCD[49065:7858825] barrier : <NSThread: 0x600003973600>{number = 7, name = (null)}2021-03-24 21:27:52.496547+0800 GCD[49065:7858825] 3 : <NSThread: 0x600003973600>{number = 7, name = (null)}2021-03-24 21:27:52.496590+0800 GCD[49065:7858826] 4 : <NSThread: 0x600003976000>{number = 6, name = (null)}
  • 在 dispatch_barrier_async 執(zhí)行結(jié)果中可以看出:在執(zhí)行完柵欄前面的操作之后,才執(zhí)行柵欄操作,最后再執(zhí)行柵欄后邊的操作。
② GCD 延時執(zhí)行方法:dispatch_after
  • 我們經(jīng)常會遇到這樣的需求:在指定時間(例如 3 秒)之后執(zhí)行某個任務(wù),這個時候,可以用 GCD 的dispatch_after 方法來實現(xiàn)。
  • 需要注意的是:dispatch_after 方法并不是在指定時間之后才開始執(zhí)行處理,而是在指定時間之后將任務(wù)追加到主隊列中。嚴格來說,這個時間并不是絕對準確的,但想要大致延遲執(zhí)行任務(wù),dispatch_after 方法是很有效的。
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// 2.0 秒后異步追加任務(wù)代碼到主隊列,并開始執(zhí)行NSLog(@"after---%@",[NSThread currentThread]); // 打印當前線程});
③ GCD 一次性代碼(只執(zhí)行一次):dispatch_once
  • 在創(chuàng)建單例或者有整個程序運行過程中只執(zhí)行一次的代碼時,就需要用到 GCD 的 dispatch_once 方法。
  • 使用 dispatch_once 方法能保證某段代碼在程序運行過程中只被執(zhí)行 1 次,并且即使在多線程的環(huán)境下,dispatch_once 也可以保證線程安全。
static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{// 只執(zhí)行 1 次的代碼(這里面默認是線程安全的)});
④ GCD 快速迭代方法:dispatch_apply
  • 通常我們會用 for 循環(huán)遍歷,但是 GCD 給我們提供了快速迭代的方法 dispatch_apply。
  • dispatch_apply 按照指定的次數(shù)將指定的任務(wù)追加到指定的隊列中,并等待全部隊列執(zhí)行結(jié)束。
  • 如果是在串行隊列中使用 dispatch_apply,那么就和 for 循環(huán)一樣,按順序同步執(zhí)行。
  • 可以利用并發(fā)隊列進行異步執(zhí)行:比如說遍歷 0~5 這 6 個數(shù)字,for 循環(huán)的做法是每次取出一個元素,逐個遍歷,dispatch_apply 可以在多個線程中同時(異步)遍歷多個數(shù)字。
  • 無論是在串行隊列,還是并發(fā)隊列中,dispatch_apply 都會等待全部任務(wù)執(zhí)行完畢,這點就像是同步操作,也像是隊列組中的 dispatch_group_wait方法。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);NSLog(@"apply--begin");dispatch_apply(6, queue, ^(size_t index) {NSLog(@"%zd---%@",index, [NSThread currentThread]);});NSLog(@"apply--end");
  • 執(zhí)行結(jié)果:
2021-03-24 21:34:02.610819+0800 GCD[49119:7865760] apply--begin2021-03-24 21:34:02.611022+0800 GCD[49119:7865760] 0---<NSThread: 0x6000004d41c0>{number = 1, name = main}2021-03-24 21:34:02.611026+0800 GCD[49119:7865874] 1---<NSThread: 0x600000499800>{number = 3, name = (null)}2021-03-24 21:34:02.611056+0800 GCD[49119:7865872] 3---<NSThread: 0x60000048c3c0>{number = 5, name = (null)}2021-03-24 21:34:02.611056+0800 GCD[49119:7865871] 2---<NSThread: 0x60000048c840>{number = 6, name = (null)}2021-03-24 21:34:02.611099+0800 GCD[49119:7865875] 4---<NSThread: 0x60000048dc80>{number = 7, name = (null)}2021-03-24 21:34:02.611140+0800 GCD[49119:7865760] 5---<NSThread: 0x6000004d41c0>{number = 1, name = main}2021-03-24 21:34:02.611215+0800 GCD[49119:7865760] apply--end
  • 這是因為在并發(fā)隊列中異步執(zhí)行任務(wù),所以各個任務(wù)的執(zhí)行時間長短不定,最后結(jié)束順序也不定。但是 apply—end 一定在最后執(zhí)行,是因為 dispatch_apply 方法會等待全部任務(wù)執(zhí)行完畢。
⑤ GCD 隊列組:dispatch_group
  • 有時候會有這樣的需求:分別異步執(zhí)行2個耗時任務(wù),然后當2個耗時任務(wù)都執(zhí)行完畢后再回到主線程執(zhí)行任務(wù),這時候我們可以用到 GCD 的隊列組。
  • 調(diào)用隊列組的 dispatch_group_async 先把任務(wù)放到隊列中,然后將隊列放入隊列組中,或者使用隊列組的 dispatch_group_enter、dispatch_group_leave 組合來實現(xiàn) dispatch_group_async。
  • 調(diào)用隊列組的 dispatch_group_notify 回到指定線程執(zhí)行任務(wù),或者使用 dispatch_group_wait 回到當前線程繼續(xù)向下執(zhí)行(會阻塞當前線程)。
  • dispatch_group_notify
    • 監(jiān)聽 group 中任務(wù)的完成狀態(tài),當所有的任務(wù)都執(zhí)行完成后,追加任務(wù)到 group 中,并執(zhí)行任務(wù)。
    • 使用如下:
NSLog(@"group--begin");dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 追加任務(wù) 1[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"1 : %@",[NSThread currentThread]); // 打印當前線程});dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 追加任務(wù) 2[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"2 : %@",[NSThread currentThread]); // 打印當前線程});dispatch_group_notify(group, dispatch_get_main_queue(), ^{// 等前面的異步任務(wù) 1、任務(wù) 2 都執(zhí)行完畢后,回到主線程執(zhí)行下邊任務(wù)[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"3 : %@",[NSThread currentThread]); // 打印當前線程NSLog(@"group--end");});
    • 從 dispatch_group_notify 相關(guān)代碼運行輸出結(jié)果可以看出:
      當所有任務(wù)都執(zhí)行完成之后,才執(zhí)行 dispatch_group_notify 相關(guān) block 中的任務(wù)。
  • dispatch_group_wait
    • 暫停當前線程(阻塞當前線程),等待指定的 group 中的任務(wù)執(zhí)行完成后,才會往下繼續(xù)執(zhí)行。
    • 使用如下:
NSLog(@"group--begin");dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 追加任務(wù) 1[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"1 : %@",[NSThread currentThread]); // 打印當前線程});dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 追加任務(wù) 2[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"2 : %@",[NSThread currentThread]); // 打印當前線程});// 等待上面的任務(wù)全部完成后,會往下繼續(xù)執(zhí)行(會阻塞當前線程)dispatch_group_wait(group, DISPATCH_TIME_FOREVER);NSLog(@"group--end");
    • 從 dispatch_group_wait 相關(guān)代碼運行輸出結(jié)果可以看出:
      當所有任務(wù)執(zhí)行完成之后,才執(zhí)行 dispatch_group_wait 之后的操作。
    • 注意:使用dispatch_group_wait 會阻塞當前線程。
  • dispatch_group_enter、dispatch_group_leave
    • dispatch_group_enter 標志著一個任務(wù)追加到 group,執(zhí)行一次,相當于 group 中未執(zhí)行完畢任務(wù)數(shù) +1;
    • dispatch_group_leave 標志著一個任務(wù)離開了 group,執(zhí)行一次,相當于 group 中未執(zhí)行完畢任務(wù)數(shù) -1;
    • 當 group 中未執(zhí)行完畢任務(wù)數(shù)為0的時候,才會使 dispatch_group_wait 解除阻塞,以及執(zhí)行追加到 dispatch_group_notify 中的任務(wù)。
NSLog(@"group--begin");dispatch_group_t group = dispatch_group_create();dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_group_enter(group);dispatch_async(queue, ^{// 追加任務(wù) 1[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"1 : %@",[NSThread currentThread]); // 打印當前線程dispatch_group_leave(group);});dispatch_group_enter(group);dispatch_async(queue, ^{// 追加任務(wù) 2[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"2 : %@",[NSThread currentThread]); // 打印當前線程dispatch_group_leave(group);});dispatch_group_notify(group, dispatch_get_main_queue(), ^{// 等前面的異步操作都執(zhí)行完畢后,回到主線程.[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"3 : %@",[NSThread currentThread]); // 打印當前線程NSLog(@"group--end");});
    • 從 dispatch_group_enter、dispatch_group_leave 相關(guān)代碼運行結(jié)果中可以看出:當所有任務(wù)執(zhí)行完成之后,才執(zhí)行 dispatch_group_notify 中的任務(wù),這里的dispatch_group_enter、dispatch_group_leave 組合,其實也等同于dispatch_group_async。
⑥ GCD 信號量:dispatch_semaphore
  • GCD 中的信號量是指 Dispatch Semaphore,是持有計數(shù)的信號,類似于過高速路收費站的欄桿,可以通過時,打開欄桿,不可以通過時,關(guān)閉欄桿。
  • 在 Dispatch Semaphore 中,使用計數(shù)來完成這個功能,計數(shù)小于 0 時等待,不可通過。計數(shù)為 0 或大于 0 時,計數(shù)減 1 且不等待,可通過。
  • Dispatch Semaphore 提供了三個方法:
    • dispatch_semaphore_create:創(chuàng)建一個 Semaphore 并初始化信號的總量;
    • dispatch_semaphore_signal:發(fā)送一個信號,讓信號總量加 1;
    • dispatch_semaphore_wait:可以使總信號量減 1,信號總量小于 0 時就會一直等待(阻塞所在線程),否則就可以正常執(zhí)行。
    • 注意:信號量的使用前提是,想清楚你需要處理哪個線程等待(阻塞),又要哪個線程繼續(xù)執(zhí)行,然后使用信號量。
  • Dispatch Semaphore 在實際開發(fā)中主要用于:
    • 保持線程同步,將異步執(zhí)行任務(wù)轉(zhuǎn)換為同步執(zhí)行任務(wù);
    • 保證線程安全,為線程加鎖。
  • Dispatch Semaphore 線程同步
    • 在開發(fā)中,可能會遇到這樣的需求:異步執(zhí)行耗時任務(wù),并使用異步執(zhí)行的結(jié)果進行一些額外的操作。換句話說,相當于,將將異步執(zhí)行任務(wù)轉(zhuǎn)換為同步執(zhí)行任務(wù)。
    • 比如說:AFNetworking 中 AFURLSessionManager.m 里面的 tasksForKeyPath: 方法,通過引入信號量的方式,等待異步執(zhí)行任務(wù)結(jié)果,獲取到 tasks,然后再返回該 tasks。
- (NSArray *)tasksForKeyPath:(NSString *)keyPath {__block NSArray *tasks = nil;dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {if ([keyPath isEqualToString:NSStringFromSelector(@selector(dataTasks))]) {tasks = dataTasks;} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(uploadTasks))]) {tasks = uploadTasks;} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(downloadTasks))]) {tasks = downloadTasks;} else if ([keyPath isEqualToString:NSStringFromSelector(@selector(tasks))]) {tasks = [@[dataTasks, uploadTasks, downloadTasks] valueForKeyPath:@"@unionOfArrays.self"];}dispatch_semaphore_signal(semaphore);}];dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);return tasks;}
    • 下面來利用 Dispatch Semaphore 實現(xiàn)線程同步,將異步執(zhí)行任務(wù)轉(zhuǎn)換為同步執(zhí)行任務(wù)。
NSLog(@"currentThread--%@",[NSThread currentThread]); // 打印當前線程NSLog(@"semaphore--begin");dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);__block int number = 0;dispatch_async(queue, ^{// 追加任務(wù) 1[NSThread sleepForTimeInterval:2]; // 模擬耗時操作NSLog(@"1 : %@",[NSThread currentThread]); // 打印當前線程number = 100;dispatch_semaphore_signal(semaphore);});dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);NSLog(@"semaphore--end,number = %zd",number);
    • 從 Dispatch Semaphore 實現(xiàn)線程同步的代碼可以看到:semaphore–end 是在執(zhí)行完 number = 100; 之后才打印的,而且輸出結(jié)果 number 為 100。這是因為異步執(zhí)行不會做任何等待,可以繼續(xù)執(zhí)行任務(wù)。執(zhí)行順如下:
      • semaphore 初始創(chuàng)建時計數(shù)為 0。
      • 異步執(zhí)行 將 任務(wù) 1 追加到隊列之后,不做等待,接著執(zhí)行 dispatch_semaphore_wait 方法,semaphore 減 1,此時 semaphore == -1,當前線程進入等待狀態(tài)。
      • 然后,異步任務(wù) 1 開始執(zhí)行。任務(wù) 1 執(zhí)行到 dispatch_semaphore_signal 之后,總信號量加 1,此時 semaphore == 0,正在被阻塞的線程(主線程)恢復繼續(xù)執(zhí)行。
      • 最后打印 semaphore—end,number = 100。
    • 這樣就實現(xiàn)了線程同步,將異步執(zhí)行任務(wù)轉(zhuǎn)換為同步執(zhí)行任務(wù)。
  • Dispatch Semaphore 線程安全和線程同步(為線程加鎖)
    • 線程安全:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結(jié)果和單線程運行的結(jié)果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。
    • 若每個線程中對全局變量、靜態(tài)變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執(zhí)行寫操作(更改變量),一般都需要考慮線程同步,否則的話就可能影響線程安全。
    • 線程同步:可理解為線程 A 和 線程 B 一塊配合,A 執(zhí)行到一定程度時要依靠線程 B 的某個結(jié)果,于是停下來,示意 B 運行;B 依言執(zhí)行,再將結(jié)果給 A;A 再繼續(xù)操作。
⑦ dispatch_source
  • dispatch_source 是基礎(chǔ)數(shù)據(jù)類型,用于協(xié)調(diào)特定底層系統(tǒng)事件的處理。
  • dispatch_source 替代了異步回調(diào)函數(shù),來處理系統(tǒng)相關(guān)的事件,當配置一個dispatch 時,你需要指定監(jiān)測的事件、dispatch queue、以及處理事件的代碼(block或函數(shù))。當事件發(fā)生時,dispatch source會提交你的block或函數(shù)到指定的queue去執(zhí)行;
  • 使用 dispatch_source 而不使用 dispatch_async 的主要原因就是利用聯(lián)結(jié)的優(yōu)勢;
  • 聯(lián)結(jié)就是:在任一線程上調(diào)用它的的一個函數(shù) dispatch_ source_ merge_ data 后,會執(zhí)行 dispatch_source 事先定義好的句柄(可以把句柄簡單理解為一個block),這個過程叫 Custom event 用戶事件,是 dispatch source 支持處理的一種事件,即為調(diào)用 dispatch_source_merge_data 函數(shù)來向自己發(fā)出的信號。
  • 句柄是一種指向指針的指針,它指向的就是一個類或者結(jié)構(gòu),和系統(tǒng)有很密切的關(guān)系,HINSTANCE (實例句柄)、HBITMAP (位圖句柄) 、HDC (設(shè)備表述句柄)、 HICON(圖標句柄)等,這當中還有一個通用的句柄,就是HANDLE;
    • 實例句柄 HINSTANCE
    • 位圖句柄 HBITMAP
    • 設(shè)備表句柄 HDC
    • 圖標句柄 HICON
  • dispatch_source 的CPU負荷非常小,盡量不占用資源 。
  • dispatch_source 的創(chuàng)建:
// type dispatch源可處理的事件// handle 可以理解為句柄、索引或id,假如要監(jiān)聽進程,需要傳入進程的ID// mask 可以理解為描述,提供更詳細的描述,讓它知道具體要監(jiān)聽什么// queue 自定義源需要的一個隊列,用來處理所有的響應句柄dispatch_source_t source = dispatch_source_create(dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t queue)
  • dispatch_source 的類型:
種類說明
DISPATCH_SOURCE_TYPE_DATA_ADD自定義的事件,變量增加
DISPATCH_SOURCE_TYPE_DATA_OR自定義的事件,變量OR
DISPATCH_SOURCE_TYPE_MACH_SENDMACH端口發(fā)送
DISPATCH_SOURCE_TYPE_MACH_RECVMACH端口接收
DISPATCH_SOURCE_TYPE_MEMORYPRESSURE內(nèi)存壓力 (注:iOS8后可用)
DISPATCH_SOURCE_TYPE_PROC進程監(jiān)聽,如進程的退出、創(chuàng)建一個或更多的子線程、進程收到UNIX信號
DISPATCH_SOURCE_TYPE_READIO操作,如對文件的操作、socket操作的讀響應
DISPATCH_SOURCE_TYPE_SIGNAL接收到UNIX信號時響應
DISPATCH_SOURCE_TYPE_TIMER定時器
DISPATCH_SOURCE_TYPE_VNODE文件狀態(tài)監(jiān)聽,文件被刪除、移動、重命名
DISPATCH_SOURCE_TYPE_WRITEIO操作,如對文件的操作、socket操作的寫響應
  • dispatch_source 常用函數(shù):
// 掛起隊列dispatch_suspend(queue) // 分派源創(chuàng)建時默認處于暫停狀態(tài),在分派源分派處理程序之前必須先恢復dispatch_resume(source) // 向分派源發(fā)送事件,需要注意的是,不可以傳遞0值(事件不會被觸發(fā)),同樣也不可以傳遞負數(shù)。dispatch_source_merge_data // 設(shè)置響應分派源事件的block,在分派源指定的隊列上運行dispatch_source_set_event_handler // 得到分派源的數(shù)據(jù)dispatch_source_get_data // 得到dispatch源創(chuàng)建,即調(diào)用dispatch_source_create的第二個參數(shù)uintptr_t dispatch_source_get_handle(dispatch_source_t source); // 得到dispatch源創(chuàng)建,即調(diào)用dispatch_source_create的第三個參數(shù)unsigned long dispatch_source_get_mask(dispatch_source_t source); // 取消dispatch源的事件處理--即不再調(diào)用block。如果調(diào)用dispatch_suspend只是暫停dispatch源。void dispatch_source_cancel(dispatch_source_t source); // 檢測是否dispatch源被取消,如果返回非0值則表明dispatch源已經(jīng)被取消long dispatch_source_testcancel(dispatch_source_t source); // dispatch源取消時調(diào)用的block,一般用于關(guān)閉文件或socket等,釋放相關(guān)資源void dispatch_source_set_cancel_handler(dispatch_source_t source, dispatch_block_t cancel_handler); // 可用于設(shè)置dispatch源啟動時調(diào)用block,調(diào)用完成后即釋放這個block。也可在dispatch源運行當中隨時調(diào)用這個函數(shù)。void dispatch_source_set_registration_handler(dispatch_source_t source, dispatch_block_t registration_handler);
  • dispatch_source 使用場景:由于 dispatch_source 不依賴于 Runloop,而是直接和底層內(nèi)核交互,準確性更高,所以經(jīng)常用于驗證碼倒計時。
- (void)use {// 倒計時時間__block int timeout = 3;// 創(chuàng)建隊列dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);// 創(chuàng)建timerdispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, globalQueue);// 設(shè)置1s觸發(fā)一次,0s的誤差/*- source 分派源- start 數(shù)控制計時器第一次觸發(fā)的時刻。參數(shù)類型是 dispatch_time_t,這是一個opaque類型,我們不能直接操作它。我們得需要 dispatch_time 和 dispatch_walltime 函數(shù)來創(chuàng)建它們。另外,常量 DISPATCH_TIME_NOW 和 DISPATCH_TIME_FOREVER 通常很有用。- interval 間隔時間- leeway 計時器觸發(fā)的精準程度*/dispatch_source_set_timer(timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0);// 觸發(fā)的事件dispatch_source_set_event_handler(timer, ^{// 倒計時結(jié)束,關(guān)閉if (timeout <= 0) {// 取消dispatch源dispatch_source_cancel(timer);}else{timeout--;dispatch_async(dispatch_get_main_queue(), ^{// 更新主界面的操作NSLog(@"倒計時 - %d", timeout);});}});// 開始執(zhí)行dispatch源dispatch_resume(timer);}

總結(jié)

以上是生活随笔為你收集整理的iOS之深入分析GCD的函数与队列以及多种组合使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

深爱激情五月婷婷 | 国产精品久久久久久久免费观看 | 免费看av片网站 | 四虎天堂| 手机看片福利 | 丁香五婷| 久久精品视频国产 | 高潮久久久 | 日韩网站免费观看 | 亚洲精品黄色片 | 久久伦理 | 西西www4444大胆视频 | 午夜精品福利在线 | 色偷偷88888欧美精品久久久 | 97av视频| 国产午夜精品一区二区三区在线观看 | 亚洲电影一区二区 | 51精品国自产在线 | 九九视频免费观看视频精品 | 男女激情免费网站 | 热re99久久精品国产66热 | 国产第一页精品 | 夜夜躁日日躁狠狠久久88av | 亚洲综合视频在线 | 成人黄色电影在线 | 欧美日韩视频一区二区 | 欧美精品免费视频 | 综合精品在线 | 国产精品久久久久久久毛片 | 日韩免费看 | 亚洲成av人片在线观看香蕉 | 国产在线播放一区二区 | 99爱这里只有精品 | 日本精品va在线观看 | 日本激情视频中文字幕 | 四虎影视成人永久免费观看亚洲欧美 | 亚洲精品一区二区18漫画 | 亚洲综合欧美日韩狠狠色 | 婷婷久久一区二区三区 | 一区二区三区四区五区在线 | 日韩精品视频在线免费观看 | 人人射av | 日本高清中文字幕有码在线 | 成人黄色小说在线观看 | www国产亚洲精品久久麻豆 | 天天射天 | 丁香婷婷网 | 国产精品视频最多的网站 | 亚洲欧美视频在线播放 | 久草在线视频免赞 | 91亚洲夫妻 | 中文在线免费一区三区 | 精品高清美女精品国产区 | 欧美日韩二三区 | 女人高潮特级毛片 | 国产福利精品一区二区 | 九色精品免费永久在线 | 国产高清视频在线免费观看 | 成人欧美一区二区三区黑人麻豆 | 97成人在线| 国产在线观看网站 | 精品国产1区2区3区 国产欧美精品在线观看 | 精品久久一二三区 | 网站在线观看日韩 | 国产免费又黄又爽 | 国产看片网站 | 中文字幕观看av | 国产中年夫妇高潮精品视频 | 亚洲激情综合网 | 精品一区二区精品 | 日韩欧美在线观看一区二区三区 | av三级av| 麻豆视频一区 | 国产一区在线播放 | 91大神dom调教在线观看 | 最近免费中文字幕mv在线视频3 | 日b视频国产 | 国产色秀视频 | 亚洲国产欧美在线人成大黄瓜 | 中文字幕888| 2019中文在线观看 | 国产色a在线观看 | 国产激情久久久 | 国产亚洲精品久久久久久电影 | 欧美日韩视频 | 国产高清在线观看 | 最新av网址在线观看 | 日日夜夜天天综合 | 在线观看免费国产小视频 | 91自拍视频在线 | 香蕉97视频观看在线观看 | 国产专区第一页 | 色婷婷av国产精品 | 色视频一区| 国产91在线 | 美洲 | 99 视频 高清| 99在线高清视频在线播放 | 精品高清美女精品国产区 | 久久免费在线观看视频 | 91资源在线免费观看 | 日韩一区精品 | 91精品视频免费看 | 成人av资源在线 | 成人久久久精品国产乱码一区二区 | 国产福利免费在线观看 | 99热999| 久久九九国产视频 | 久久影院中文字幕 | 亚洲丝袜中文 | 日日碰夜夜爽 | 一级黄色在线免费观看 | 973理论片235影院9 | 又黄又爽又色无遮挡免费 | 97人人澡人人爽人人模亚洲 | 国产精品手机播放 | 在线一二三四区 | 日本精品久久久久影院 | 成人av在线网址 | 久久综合色天天久久综合图片 | 黄色小说视频在线 | 欧产日产国产69 | 久久9999久久免费精品国产 | 日韩午夜三级 | 欧美一级片 | 最近最新中文字幕 | 香蕉网在线播放 | 国产精品一区二区在线看 | 国产精品一区二区免费 | 成年人国产精品 | 欧美一区二区三区在线看 | 天天射天天干天天操 | 中文字幕在线观看资源 | 韩国av免费 | 久久五月激情 | 国产在线观看午夜 | 中文字幕日韩有码 | 婷婷丁香激情五月 | 亚洲一区二区三区精品在线观看 | 99久高清在线观看视频99精品热在线观看视频 | 色天天中文 | 亚洲经典中文字幕 | 成人福利在线播放 | 中文字幕视频 | 二区三区在线 | 996久久国产精品线观看 | 人人爽人人乐 | 一区二区三区国产欧美 | 精品免费视频123区 午夜久久成人 | www.狠狠操.com | 日韩高清一区在线 | www.com久久久 | 啪啪资源 | 日韩精品你懂的 | 国产视频每日更新 | 久久久国际精品 | 国产视频69 | 日韩av三区 | 在线精品视频在线观看高清 | 黄色在线观看免费 | 日精品在线观看 | 久久官网| www色网站 | 精品久久91 | 999成人免费视频 | 性色在线视频 | 五月天综合网站 | 亚洲综合网 | 亚洲激情精品 | 久久99久久99 | 黄色网址在线播放 | 色偷偷888欧美精品久久久 | 视频一区在线免费观看 | 亚洲理论影院 | 久久久国产日韩 | 久久婷婷网 | 久久系列 | 夜夜躁日日躁狠狠躁 | 在线观看黄色国产 | av在线精品| 蜜桃视频在线视频 | 国产成人av电影在线观看 | 国产又粗又猛又黄 | 久久久穴| 久久国产影视 | 日韩大陆欧美高清视频区 | 欧美在线视频不卡 | 成人午夜电影在线 | 97日日碰人人模人人澡分享吧 | 在线观看91网站 | 国产高清专区 | 九九精品久久久 | 韩国三级在线一区 | 99国产精品久久久久老师 | 久久福利综合 | 久久人人爽人人爽人人片av免费 | 成人精品影视 | 日韩狠狠操 | 成 人 免费 黄 色 视频 | 狠狠操天天操 | 国产视频一 | 日本一区二区免费在线观看 | 天天操 夜夜操 | www.夜夜| 国产高清专区 | 99久久精 | 97电影院网 | 一区中文字幕在线观看 | 黄色在线网站噜噜噜 | ,午夜性刺激免费看视频 | 国产专区在线视频 | 国产伦精品一区二区三区高清 | 69绿帽绿奴3pvideos | 国产精品一区免费在线观看 | 欧美性生活大片 | 国内久久精品视频 | 亚洲精选99 | 五月综合激情婷婷 | 在线免费高清视频 | 99热超碰| 99在线热播| 亚洲日本va在线观看 | 在线观看国产日韩 | 免费观看国产成人 | 麻豆免费精品视频 | 欧美一级特黄aaaaaa大片在线观看 | 毛片美女网站 | 日韩在线视频免费看 | 国产成本人视频在线观看 | 国产精品欧美久久久久无广告 | 久久免费成人网 | 亚洲一区久久 | 日韩色爱 | 国产中文字幕视频 | 久久av观看 | 中文字幕视频三区 | 欧美天天射 | 日本三级不卡 | 午夜在线日韩 | 麻豆影视在线播放 | 欧美一区二区三区在线播放 | 99精品在线视频观看 | wwxxxx日本| 国产精品一区在线观看你懂的 | 青青河边草手机免费 | 国产中文在线播放 | 国产又粗又猛又黄又爽视频 | 精品女同一区二区三区在线观看 | 国产91丝袜在线播放动漫 | 91成人网页版 | 丁香五月缴情综合网 | 日韩成片 | 97操操| 精品视频久久 | 日日干网| 中文字幕免费久久 | 成人免费观看在线视频 | 日韩中文字幕一区 | 999在线视频 | 日韩精品一区二 | 五月天亚洲激情 | 亚洲每日更新 | 久久精品超碰 | 国产精品资源 | 在线免费国产视频 | 91中文字幕在线 | 99精品一区 | 中文视频在线看 | 狠狠色狠狠色综合系列 | 成人一级在线 | 免费观看全黄做爰大片国产 | 久草观看 | 久久在线视频在线 | 日韩精品一区二区三区中文字幕 | 精品久久久久久久久久 | 日本aa在线 | 亚洲欧美日韩精品久久久 | 久久久在线观看 | 日韩欧美高清一区二区 | 伊香蕉大综综综合久久啪 | 欧美一二三在线 | 免费a级黄色毛片 | 亚洲日韩中文字幕在线播放 | 99视频久久| 成人国产亚洲 | 成 人 黄 色 视频免费播放 | 96香蕉视频 | 欧美日韩国产一区二区三区在线观看 | 成人在线超碰 | 国内精品久久久久久久久久清纯 | 伊人黄| 97超视频 | 久99视频| 欧美整片sss | 正在播放国产一区二区 | 国产精品久久久电影 | 国产一线在线 | 久日精品| 亚洲欧美日韩一区二区三区在线观看 | 久久香蕉一区 | 一级黄色片在线免费看 | 久久综合九色综合97_ 久久久 | 成人禁用看黄a在线 | 在线亚洲播放 | 永久中文字幕 | 国产精品成人一区二区三区吃奶 | 91精品国产91热久久久做人人 | 国产无遮挡又黄又爽在线观看 | 色www免费视频 | 夜又临在线观看 | 免费成人在线观看 | 精品一区二区在线免费观看 | 99久久电影| 人人草人 | 国产精品精品久久久久久 | 亚洲国产三级在线观看 | 色狠狠狠 | 精品理论片 | 国产99久久久久 | 亚洲成熟女人毛片在线 | 91禁在线看| 香蕉视频最新网址 | 99热在线看 | 天天干天天干天天射 | 久久久久久久久久免费 | 天天摸天天干天天操天天射 | 97手机电影网 | 国产高清 不卡 | 久久精彩免费视频 | 国产三级久久久 | 日韩综合一区二区 | av在线观| 国产破处在线视频 | 97超视频| 国产精品一区二区久久 | 免费看的国产视频网站 | 亚洲国产中文在线观看 | 色综合久久久久网 | 婷婷黄色片 | 超碰在线色 | 99国产精品免费网站 | av在线免费不卡 | 久久久久久久久电影 | a黄色| 天天射天天干天天 | 美女视频a美女大全免费下载蜜臀 | 国产精品美女久久久久久 | 久久精品79国产精品 | 国产精品视频免费观看 | 成人在线播放免费观看 | 欧美日韩国产亚洲乱码字幕 | 五月天婷婷在线观看视频 | 狠狠操91| 日韩欧美视频二区 | 婷婷久操| 激情丁香5月 | 国内精品久久久久久中文字幕 | 国产手机视频在线观看 | 成年人看片网站 | 91av视频在线播放 | 久久激情五月婷婷 | 丝袜制服天堂 | 中文字幕在线观看国产 | 麻豆极品| 日本久久不卡视频 | 久久欧美精品 | 91精品中文字幕 | 深夜福利视频在线观看 | 99免在线观看免费视频高清 | 人人看人人草 | 国产理伦在线 | 国产精品 中文字幕 亚洲 欧美 | 在线播放 日韩专区 | 91丨九色丨91啦蝌蚪老版 | 国产亚州av | 欧美日韩在线免费视频 | 国产 一区二区三区 在线 | 色综合亚洲精品激情狠狠 | 日韩最新av| 久久久999| 日韩免费电影网站 | 日韩欧美精品在线观看视频 | 五月婷婷精品 | 久久三级毛片 | 92中文资源在线 | 国产成人黄色片 | 国产少妇在线观看 | 国产美女视频 | 国产又粗又猛又黄 | 免费99| 久久久午夜视频 | 91久久国产露脸精品国产闺蜜 | 91精品资源| 久久久官网 | 色婷在线 | 国产在线国偷精品产拍免费yy | 开心激情综合网 | 日韩av免费大片 | 欧美日韩性 | 国产在线91精品 | 六月丁香激情综合 | 国产人成一区二区三区影院 | 久九视频 | 国产日韩在线一区 | 欧美一二三区在线播放 | 久久久久久久久免费 | 免费福利视频导航 | av大片免费 | 在线国产能看的 | 玖玖在线观看视频 | 亚洲成a人片77777kkkk1在线观看 | 亚洲高清在线观看视频 | 久草com | 在线免费看黄网站 | 欧美成人黄色片 | 波多野结衣在线中文字幕 | 在线精品视频在线观看高清 | 在线视频第一页 | 国产亚洲一区二区在线观看 | 欧美日韩一区二区免费在线观看 | 啪啪凸凸 | 国产精品欧美一区二区 | 999热线在线观看 | 欧美日韩一区久久 | 天天射天天干天天爽 | 欧美日韩中文字幕在线视频 | 国产精品乱码一区二三区 | 99超碰在线观看 | 日韩av在线一区二区 | 久久免费看a级毛毛片 | 国产成本人视频在线观看 | 一区二区精 | 黄网站色成年免费观看 | 一区二区欧美在线观看 | 在线国产小视频 | 成人91在线| 亚洲精品久久久久久久不卡四虎 | 亚洲精品视频免费看 | avove黑丝 | 99免费精品视频 | 久草视频精品 | 深爱综合网 | 天天天天天天天操 | 日韩免费在线观看视频 | 国产精品久久一区二区三区, | 欧美一级片免费在线观看 | 激情视频国产 | www.久久色 | 国产999精品视频 | 久久久久久免费 | 欧美日韩在线观看一区 | 美女网站黄在线观看 | 亚洲精品小视频在线观看 | 国产亚洲精品电影 | 激情久久一区二区三区 | 国产97在线播放 | 蜜桃av人人夜夜澡人人爽 | 亚洲精品乱码白浆高清久久久久久 | 日本大片免费观看在线 | 玖玖视频免费在线 | 亚洲一区视频在线播放 | 96超碰在线 | 欧美激情精品久久久久久变态 | 久久久久电影 | 久久久久国产一区二区三区 | 亚洲国产成人av网 | 亚洲人xxx | 国产精品1区2区3区在线观看 | 国产91精品一区二区麻豆亚洲 | av三级在线看 | 欧美极品少妇xxxx | 久久久久国产成人免费精品免费 | 国产精品9999 | 色综合天天综合网国产成人网 | 日韩高清国产精品 | 欧美成人亚洲成人 | 久久综合九色九九 | 97在线观 | 国产成人精品亚洲 | 亚洲一片黄 | 99热精品视 | 四虎国产视频 | 亚洲丝袜中文 | 日韩精品一区在线观看 | 91精品免费在线 | 欧美日韩视频在线一区 | 久久久久久久久精 | 久久尤物电影视频在线观看 | 天天操天天舔天天爽 | 日韩av视屏在线观看 | 97福利社 | 亚洲成aⅴ人在线观看 | 夜夜躁狠狠躁日日躁视频黑人 | 91视频在线播放视频 | 婷婷丁香av| 久久a热6 | 日本久久精品 | 久久国产午夜精品理论片最新版本 | 亚洲日韩精品欧美一区二区 | 精品久久亚洲 | 国产91精品一区二区绿帽 | 在线观看的av网站 | 中文字幕a∨在线乱码免费看 | 日日狠狠 | 国产精品美女久久 | 97小视频 | 免费在线观看av网址 | wwxxx日本| av色综合| a级片网站 | 中文视频在线 | www.狠狠色.com| 日韩电影一区二区三区 | 人人射人人爱 | 香蕉视频导航 | 激情综合五月 | 国产三级视频 | 国产成人福利 | 青草草在线视频 | 久久久国产在线视频 | 久久久久久久福利 | 狠狠干激情 | 欧美巨乳波霸 | 久久久久久久久久久久久久免费看 | 国产精品 日韩精品 | 天天草综合网 | 激情开心色 | 午夜国产福利在线 | 久久色中文字幕 | 99久久精品久久久久久清纯 | 久久午夜免费观看 | 国产成人在线综合 | 亚洲香蕉在线观看 | 96亚洲精品久久 | 最近能播放的中文字幕 | 五月婷婷综合在线 | 免费观看一区 | 亚洲精品视频在线 | 在线观看一区二区视频 | 亚洲精品乱码久久久久久蜜桃动漫 | 午夜久久福利影院 | 国产精品黄色 | 精品国精品自拍自在线 | 午夜视频色 | 天天操天天操天天操天天操天天操天天操 | 日韩 在线a | 日韩区欧美久久久无人区 | 极品国产91在线网站 | 国产高清视频免费在线观看 | 国产高清在线a视频大全 | 国产综合精品一区二区三区 | 国产99久久久国产精品 | 青草草在线 | 欧美精品中文字幕亚洲专区 | 国产日产av | 欧美日韩精品在线免费观看 | 在线免费91 | 亚洲成av人片在线观看香蕉 | 国产黄色在线网站 | 激情视频91 | 九九九九九精品 | 黄色91在线观看 | 日韩欧美网站 | 日韩免费一区二区在线观看 | 中文字幕在线观看视频一区 | 天堂av网站 | 日韩理论片中文字幕 | 麻豆果冻剧传媒在线播放 | 最新国产一区二区三区 | 国产91欧美| 成人性生活大片 | 国产视频在线观看一区 | 视频国产在线 | 国产一区二区三区免费在线 | 久久久久久久久久久久久国产精品 | 91自拍成人 | 婷婷色网 | 欧美激情片在线观看 | 免费在线观看av网址 | 九九在线国产视频 | 国产一级大片免费看 | 99久久激情视频 | 成片免费| 欧美男女爱爱视频 | 亚洲五月婷| 99热99| 91尤物国产尤物福利在线播放 | 免费精品视频在线观看 | 欧美国产视频在线 | 亚洲精品国产自产拍在线观看 | 久久精品综合视频 | 国产精品欧美久久 | 亚洲免费小视频 | 精品国产色 | 黄色av一级片 | 国产91免费在线观看 | 正在播放国产一区 | 久久久午夜精品理论片中文字幕 | 成人午夜电影久久影院 | 91在线观看高清 | 日本中文字幕在线观看 | 国产成人一区二区在线观看 | 成人av电影在线观看 | 国产亚洲精品bv在线观看 | 96亚洲精品久久 | 深夜福利视频一区二区 | 99精品免费视频 | 成人av电影免费在线观看 | 欧美日韩精品在线一区二区 | 久久精品这里都是精品 | 久久艹免费 | 国产精品99久久99久久久二8 | 免费高清国产 | 日本久久久久久久久久久 | 91超级碰碰 | 一本一道久久a久久综合蜜桃 | 国产色视频网站 | 精品久久久久久久久久久院品网 | 天天干天天拍 | 国产精品淫 | 波多野结衣一区 | 亚洲欧美日本国产 | 91av电影网| 日韩精品视频第一页 | 视频福利在线观看 | 国产91aaa | 公开超碰在线 | 天天综合天天综合 | 国产精品久久久久久一二三四五 | 亚洲激情在线视频 | 在线成人一区二区 | 色网免费观看 | 国内视频在线 | 精品一区二区三区久久 | 欧美日韩亚洲精品在线 | 啪啪免费试看 | 夜夜骑天天操 | 一区二区三区高清在线观看 | 国产在线第三页 | 亚洲三级在线播放 | av一区在线 | 婷婷色吧 | 天天爱天天色 | 国产精选在线观看 | 亚洲理论在线观看电影 | 亚洲久在线| 免费碰碰 | 欧美99久久| 91视频在线观看免费 | 天天射网 | 91精品国产成人 | 亚洲欧美精品在线 | 美女视频一区二区 | 午夜视频在线观看一区 | 一区二区三区四区五区在线 | 日韩在线高清免费视频 | 丁香花在线视频观看免费 | 99久久夜色精品国产亚洲96 | 日韩免费久久 | 美女福利视频 | 亚洲在线成人精品 | 999在线视频 | 高清不卡一区二区在线 | 在线亚洲激情 | 中文字幕亚洲欧美 | 精品国产一区二区在线 | 中文在线8新资源库 | 久久影视中文字幕 | 人人超碰人人 | 久久免费电影网 | 视频在线亚洲 | 99国产精品视频免费观看一公开 | 91九色在线视频 | 视频在线观看日韩 | 亚洲午夜久久久久 | 99亚洲精品 | 久草干| a视频在线 | 久久超碰在线 | 特级黄色视频毛片 | 亚洲精品玖玖玖av在线看 | 中文在线a√在线 | 亚洲成aⅴ人在线观看 | av免费播放 | 亚洲精品ww | 久久精品看 | 国产精品女人久久久久久 | 狠狠色狠狠色综合日日92 | 69精品久久 | 青春草视频在线播放 | 国产在线精品一区二区三区 | 久久久福利 | 最新高清无码专区 | 国产视频一区二区在线 | 天天综合人人 | 999久久久精品视频 日韩高清www | 色在线免费观看 | av免费在线观 | 99精品热视频只有精品10 | 五月婷婷狠狠 | 亚洲丝袜中文 | 欧洲一区精品 | 免费男女羞羞的视频网站中文字幕 | 国产一级二级av | 国产男女无遮挡猛进猛出在线观看 | 久久国产精品久久精品国产演员表 | 欧美成天堂网地址 | 日韩电影精品一区 | 久久国内精品99久久6app | 黄视频网站大全 | 国产精品久久中文字幕 | 国产成人333kkk| 一区二区中文字幕在线 | 成人在线视频在线观看 | 久久久久中文 | 精品久久久久免费极品大片 | 嫩嫩影院理论片 | 韩国精品一区二区三区六区色诱 | 国产精品国产三级国产aⅴ无密码 | 在线免费观看视频一区二区三区 | 五月天丁香 | 久久av一区二区三区亚洲 | 久久久久久久久久久网站 | 国产原创在线 | 狠狠躁夜夜躁人人爽超碰91 | 亚洲最大av网 | 久久精品高清视频 | 国产精品 国内视频 | a在线观看免费视频 | 亚洲精品免费在线播放 | 久久好看免费视频 | 国产区在线看 | 97精品久久人人爽人人爽 | 日本女人的性生活视频 | 亚洲精品男女 | 97av.com| av黄色在线播放 | 国产成人一区二区三区免费看 | 亚洲欧美视频在线观看 | 国产黄色成人av | 国产不卡片 | 色欲综合视频天天天 | 久久国产品 | 夜夜嗨av色一区二区不卡 | 99久久这里有精品 | 欧美激情xxxx | 特级毛片aaa| 中文免费在线观看 | 99c视频在线| 二区视频在线 | 天天做天天干 | 成人精品视频 | 日韩中文在线视频 | 中文字幕色综合网 | 免费看污污视频的网站 | 欧美日韩精品影院 | 91九色视频在线 | 国产成人久久av977小说 | 国产日韩精品在线观看 | 亚洲天天综合 | 欧美日韩网址 | 亚洲一区精品二人人爽久久 | av怡红院 | 中文av不卡| a黄色一级| 福利一区二区在线 | 成人免费视频观看 | 国产丝袜美腿在线 | 日日色综合 | 亚洲视频免费在线观看 | 久久久久免费精品国产 | 久久九九影院 | 欧美激情视频免费看 | 国产高清在线观看av | 免费观看黄色av | 麻豆视频在线免费观看 | 日韩另类在线 | 91麻豆国产福利在线观看 | 日本护士三级少妇三级999 | 国内精品久久久久影院一蜜桃 | av免费在线观 | 欧美日韩精品免费观看视频 | 亚洲欧洲精品视频 | 久久久久久伊人 | 中文字幕在线观看完整版电影 | 亚洲精品国产成人 | 久久久九色精品国产一区二区三区 | 黄色毛片在线看 | 国产精品毛片久久 | 亚洲 欧美 综合 在线 精品 | 免费观看国产视频 | 丁香5月婷婷久久 | av在线播放中文字幕 | 天天弄天天操 | 香蕉精品视频在线观看 | 狠狠色噜噜狠狠狠狠2021天天 | www.国产在线视频 | 在线观看免费福利 | 国产精品99久久久精品免费观看 | 人人狠 | 国产精品综合在线 | 欧洲精品码一区二区三区免费看 | 91九色自拍 | 在线观看免费视频 | 91三级视频 | 成人免费在线播放视频 | 男女啪啪视屏 | 在线观看国产日韩 | 伊人五月综合 | 国产二区视频在线观看 | 欧美在线视频a | 色吧久久 | 日韩在线国产精品 | 四虎4hu永久免费 | 久久毛片高清国产 | 久久99久国产精品黄毛片入口 | 日韩av成人在线 | 亚欧洲精品视频在线观看 | 中文字幕成人网 | 狠狠做深爱婷婷综合一区 | 国产一级片久久 | 456成人精品影院 | 国内精品久久久久影院男同志 | 亚洲精品国精品久久99热一 | 日韩大陆欧美高清视频区 | 91视频在线国产 | 国产亚洲成人精品 | 日狠狠 | 91精品国产一区二区三区 | 久久色在线观看 | 午夜精品久久久久久久久久久 | 亚洲色图27p| 亚洲专区路线二 | 亚洲国产精品日韩 | 日韩中文字幕免费视频 | 亚洲五月婷 | 久九视频 | 免费成人av网站 | 国产午夜精品一区 | 日韩精选在线观看 | 国产精品成人自产拍在线观看 | 国产99久久久精品 | 久久97精品 | 色婷婷综合久久久中文字幕 | 狂野欧美激情性xxxx欧美 | 天堂av在线网站 | 伊人网av| 天天综合婷婷 | 日韩在线观看你懂的 | 亚洲欧美在线视频免费 | 国产精品久久久久久一二三四五 | 一区二区亚洲精品 | 日日麻批40分钟视频免费观看 | 日韩亚洲精品电影 | 亚洲成人在线免费 | 色婷婷免费视频 | 不卡电影免费在线播放一区 | 国产精品片 | 黄网站色成年免费观看 | 欧美日本一区 | 九色福利视频 | 婷婷五天天在线视频 | 在线观看日韩精品 | 深爱激情综合 | 欧美最新大片在线看 | 91av大全 | 国产一区在线观看视频 | 久久综合干 | 国产香蕉av | 国产99在线播放 | 国产精品黄色 | 国产精品久久99综合免费观看尤物 | 97超碰中文字幕 | 激情五月看片 | 美女黄视频免费 | 在线免费av观看 | 中文字幕在线观看视频一区 | 成人免费网站在线观看 | 99热这里只有精品国产首页 | 亚洲国产网址 | 天天操夜操视频 | 欧美影片| 国产在线一卡 | 99热国内精品 | 久久国产精品免费一区 | 日韩在线视频免费看 | 色婷婷中文 | 国产91对白在线播 | 久久开心激情 | 国产女人40精品一区毛片视频 | 国产精品一区二区中文字幕 | 人人舔人人 | 婷婷在线免费视频 | 五月婷婷丁香在线观看 | adc在线观看| 91porny九色91啦中文 | 日本三级中文字幕在线观看 | 91高清在线看 | 色噜噜狠狠色综合中国 | 美女一区网站 | 精品九九久久 | 免费在线观看午夜视频 | 国产精品自拍在线 | 日韩精品在线播放 | 日本公妇在线观看 | 欧美另类巨大 | 久久这里| 欧美最爽乱淫视频播放 | 久久伊人精品天天 | 久久亚洲免费视频 | 国产精品国产三级国产专区53 | 免费福利片2019潦草影视午夜 | 一级精品视频在线观看宜春院 | 一区二区三区四区五区在线 | 在线观看国产永久免费视频 | 中文字幕国产一区二区 | 国产精品美女久久久网av | 国产在线高清视频 | av免费福利 | 久久精品导航 | 亚洲精品欧洲精品 | 日韩精品免费一区二区 | 天天操天天色天天 | 狠狠干美女 | 色婷婷综合久久久中文字幕 | 亚洲片在线资源 | 超碰激情在线 | 色综合天天爱 | 天天色天天草天天射 | 国产日产精品一区二区三区四区 | 97av精品 | 国产最新视频在线观看 | 91国内在线 | 天天伊人狠狠 | 午夜视频一区二区三区 | 天天色天天骑天天射 | 日韩一二三区不卡 | 久草免费福利在线观看 | 天堂在线免费视频 | 免费在线| 国产亚洲在线视频 | 婷婷深爱激情 | 激情视频区 | 91精品国自产在线观看 | 97av在线视频 | 精品视频9999 | 亚洲精品国精品久久99热一 | 91精品视频免费在线观看 | 国产一性一爱一乱一交 | 精品自拍av| 成人午夜电影网站 | 婷婷爱五月天 | 日韩精品你懂的 | 国产精品欧美日韩在线观看 | a v在线观看 | 97香蕉视频 | 人人爽久久涩噜噜噜网站 | 一级片视频免费观看 | 日韩在线免费播放 | 国产一区在线播放 | 操操日日 | 亚洲一区二区精品3399 | 亚洲精品中文字幕在线 | 999久久久免费视频 午夜国产在线观看 | 毛片一二区| 欧美一级视频在线观看 | 九九一级片 | 国产黄色网 | 在线观看一区 | 91精品一区二区三区久久久久久 | 国产区免费在线 | 日韩成人在线一区二区 | av理论电影 | 亚洲欧美国产精品va在线观看 | 黄色亚洲大片免费在线观看 | 免费福利视频网 | 国产91精品一区二区绿帽 | 日韩精品久久中文字幕 | 久久久久久久久久久久电影 | 人人舔人人 | 精品999在线观看 | 欧美一二三专区 | 久久国产免费视频 | 婷婷视频导航 | 国产精品成人自产拍在线观看 | 日韩成人高清在线 | 久久久久免费精品国产小说色大师 | 日本精品一区二区三区在线观看 | 国产精品一区在线播放 | 狠狠狠狠狠色综合 | 色播六月天 | 国产成人精品综合久久久 | 亚洲天堂网视频 | 久草视频在线免费 | 夜夜夜草 | 国产九九热视频 | 91在线91| 精品欧美小视频在线观看 | 91日韩精品|