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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SDWebImage源码阅读(九)SDWebImageDownloader

發(fā)布時(shí)間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SDWebImage源码阅读(九)SDWebImageDownloader 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  這篇學(xué)習(xí) SDWebImageDownloader 這個(gè)類。

  首先依然是看 SDWebImageDownloader.h:

  SDWebImageDownloaderOptions

1 typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { 2 SDWebImageDownloaderLowPriority = 1 << 0, 3 SDWebImageDownloaderProgressiveDownload = 1 << 1, 4 5 /** 6 * By default, request prevent the use of NSURLCache. With this flag, NSURLCache 7 * is used with default policies. 8 */ 9 SDWebImageDownloaderUseNSURLCache = 1 << 2, 10 11 /** 12 * Call completion block with nil image/imageData if the image was read from NSURLCache 13 * (to be combined with `SDWebImageDownloaderUseNSURLCache`). 14 */ 15 16 SDWebImageDownloaderIgnoreCachedResponse = 1 << 3, 17 /** 18 * In iOS 4+, continue the download of the image if the app goes to background. This is achieved by asking the system for 19 * extra time in background to let the request finish. If the background task expires the operation will be cancelled. 20 */ 21 22 SDWebImageDownloaderContinueInBackground = 1 << 4, 23 24 /** 25 * Handles cookies stored in NSHTTPCookieStore by setting 26 * NSMutableURLRequest.HTTPShouldHandleCookies = YES; 27 */ 28 SDWebImageDownloaderHandleCookies = 1 << 5, 29 30 /** 31 * Enable to allow untrusted SSL certificates. 32 * Useful for testing purposes. Use with caution in production. 33 */ 34 SDWebImageDownloaderAllowInvalidSSLCertificates = 1 << 6, 35 36 /** 37 * Put the image in the high priority queue. 38 */ 39 SDWebImageDownloaderHighPriority = 1 << 7, 40 41 /** 42 * Scale down the image 43 */ 44 SDWebImageDownloaderScaleDownLargeImages = 1 << 8, 45 };

  這是一個(gè) NS_OPTIONS 的枚舉,用來表示不同的下載選項(xiàng)。

  當(dāng)需要給某個(gè)功能添加 Options 的時(shí)候或者對(duì)不同的情況分類的時(shí)候,一般使用枚舉來實(shí)現(xiàn)。

  提供的了 9 種不同的情況,且他們都是可以根據(jù)不同的需求進(jìn)行匹配選擇。這里的給每一個(gè)選項(xiàng)賦值使用了掩碼,"<< " 表示左移操作,>> 表示右移操作。1<<0 ?表示把 1 轉(zhuǎn)化為二進(jìn)制然后整體左移 0 位,沒有變化當(dāng)然還是 1。1 << 1 則是把 1 轉(zhuǎn)化為二進(jìn)制是 0b0000 0001,把它整體左移 1 位是 0b0000 0010 它轉(zhuǎn)化為 10 進(jìn)制是 2,即左移一位表示在原來的值上乘以 2 。所以上面表示的枚舉值自上而下分別是 1 左移 0 位至 8 位,表示的 NSUInteger 分別是: 0b0000 0001、0b0000 0010、0b0000 0100、0b0000 1000、0b0001 0000、0b0010 0000、0b0100 0000、0b1000 000 ...

  所以在判斷 self.option 是否是某個(gè)枚舉值的時(shí)候,直接拿 self.option 與要判斷的枚舉值做 與 操作:

1 self.option & SDWebImageDownloaderIgnoreCacheResponse

?

  SDWebImageDownloaderExecutionOrder

1 typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { 2 /** 3 * Default value. All download operations will execute in queue style (first-in-first-out). 4 */ 5 SDWebImageDownloaderFIFOExecutionOrder, 6 7 /** 8 * All download operations will execute in stack style (last-in-first-out). 9 */ 10 SDWebImageDownloaderLIFOExecutionOrder 11 };

  這是一個(gè) NS_ENUM 的枚舉,用來表示下載時(shí)數(shù)據(jù)被調(diào)用的順序。

  FIFO (first-in-first-out 先進(jìn)先出)、LIFO (last-in-first-out 后進(jìn)先出),下載圖像一般按照放入隊(duì)列中的順序依次進(jìn)行,不過這里同時(shí)也支持后放入隊(duì)列任務(wù)的先下載的操作。

  一個(gè)下載管理器應(yīng)該這樣管理下載,肯定有一個(gè)下載列表,可以假定這個(gè)列表保存在一個(gè)數(shù)組中,正常情況下應(yīng)該每次取出數(shù)組中第1個(gè)元素來下載,這就是 FIFO (先進(jìn)先出)。那么要改為 LIFO (后進(jìn)先出),應(yīng)該是針對(duì)某一個(gè)下載的,不應(yīng)該是把取出數(shù)據(jù)的順序改為從數(shù)組的最后一個(gè)元素取出。

?

  SDWebImageDownloadStartNotification、

SDWebImageDownloadStopNotification

1 extern NSString * _Nonnull const SDWebImageDownloadStartNotification; 2 extern NSString * _Nonnull const SDWebImageDownloadStopNotification;

  它們兩個(gè)的賦值在 SDWebImageDownloaderOpertion.m 里面:

1 NSString *const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; 2 NSString *const SDWebImageDownloadStopNotification = @"SDWebImageDownloadStopNotification";

  

  SDWebImageDownloaderProgressBlock、

SDWebImageDownloaderCompletedBlock

1 typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL); 2 3 typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished);

  命名兩個(gè) block ,一個(gè)是下載進(jìn)度的 block,一個(gè)下載完成的 block。

?

  SDHTTPHeadersDictionary、

SDHTTPHeadersMutableDictionary

1 typedef NSDictionary<NSString *, NSString *> SDHTTPHeadersDictionary; 2 typedef NSMutableDictionary<NSString *, NSString *> SDHTTPHeadersMutableDictionary;

  命名兩個(gè) key 和 value 都是字符串,用于 SDHTTPHeaders 的字典。

?

  SDWebImageDownloaderHeadersFilterBlock

1 typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterBlock)(NSURL * _Nullable url, SDHTTPHeadersDictionary * _Nullable headers);

  這個(gè) block 用來自定義請(qǐng)求頭。

?

  SDWebImageDownloadToken

1 @interface SDWebImageDownloadToken : NSObject 2 3 @property (nonatomic, strong, nullable) NSURL *url; 4 @property (nonatomic, strong, nullable) id downloadOperationCancelToken; 5 6 @end

  這個(gè)類表示與每一個(gè)下載相關(guān)的?token,能用于取消一個(gè)下載。

  SDWebImageDownloadToken?作為每一個(gè)下載的唯一身份標(biāo)識(shí)。SDWebImageDownloader?和我們平時(shí)開發(fā)中的下載還是有不一樣的地方的,它弱化了下載過程,比較強(qiáng)調(diào)的是下載結(jié)果。不支持?jǐn)帱c(diǎn)下載(當(dāng)然這可能沒有必要)。?

  如果需要設(shè)計(jì)一個(gè)自己的下載管理者,就應(yīng)該設(shè)計(jì)一個(gè)類似 SDWebImageDownloadToken?這樣的下載對(duì)象封裝類,需要的所有信息,都能在這個(gè)對(duì)象中獲取。

  

  SDWebImageDownloader

1 /** 2 * Asynchronous downloader dedicated and optimized for image loading. 3 */ 4 @interface SDWebImageDownloader : NSObject

  異步下載專用的圖像加載優(yōu)化。

?

  shouldDecompressImages

1 /** 2 * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. 3 * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. 4 */ 5 @property (assign, nonatomic) BOOL shouldDecompressImages;

   是否解壓圖像,解壓下載和緩存的圖像可以提高性能,但是會(huì)消耗大量的內(nèi)存,默認(rèn)是 YES,如果因消耗內(nèi)存過大可以設(shè)置為 NO。

?

  maxConcurrentDownloads

1 /** 2 * The maximum number of concurrent downloads 3 */ 4 @property (assign, nonatomic) NSInteger maxConcurrentDownloads;

  表示并發(fā)下載的最大數(shù)量。

?

  currentDownloadCount

1 /** 2 * Shows the current amount of downloads that still need to be downloaded 3 */ 4 @property (readonly, nonatomic) NSUInteger currentDownloadCount;

  顯示當(dāng)前仍需要下載的下載量。

?

  downloadTimeout

1 /** 2 * The timeout value (in seconds) for the download operation. Default: 15.0. 3 */ 4 @property (assign, nonatomic) NSTimeInterval downloadTimeout;

  下載操作的超時(shí)時(shí)間,單位是秒。默認(rèn)是 15 秒。

?

  executionOrder

1 /** 2 * Changes download operations execution order. Default value is `SDWebImageDownloaderFIFOExecutionOrder`. 3 */ 4 @property (assign, nonatomic) SDWebImageDownloaderExecutionOrder executionOrder;

  更改下載操作的執(zhí)行順序。默認(rèn)是 FIFO。

?

  sharedDownloader

1 /** 2 * Singleton method, returns the shared instance 3 * 4 * @return global shared instance of downloader class 5 */ 6 + (nonnull instancetype)sharedDownloader;

  單例方法。

?

  urlCredential

1 /** 2 * Set the default URL credential to be set for request operations. 3 */ 4 @property (strong, nonatomic, nullable) NSURLCredential *urlCredential;

  設(shè)置默認(rèn)的 URL 憑據(jù),以設(shè)置請(qǐng)求操作。

?

  username、password

1 /** 2 * Set username 3 */ 4 @property (strong, nonatomic, nullable) NSString *username; 5 6 /** 7 * Set password 8 */ 9 @property (strong, nonatomic, nullable) NSString *password;

?

  headersFilter

1 /** 2 * Set filter to pick headers for downloading image HTTP request. 3 * 4 * This block will be invoked for each downloading image request, returned 5 * NSDictionary will be used as headers in corresponding HTTP request. 6 */ 7 @property (nonatomic, copy, nullable) SDWebImageDownloaderHeadersFilterBlock headersFilter;

  設(shè)置篩選器以選擇用于下載圖像 http 請(qǐng)求的標(biāo)頭。該 block 將被調(diào)用為每個(gè)下載圖像請(qǐng)求,返回一個(gè) NSDictionary 作為相應(yīng)的 http 請(qǐng)求頭。

  

  Method

1 /** 2 * Creates an instance of a downloader with specified session configuration. 3 * *Note*: `timeoutIntervalForRequest` is going to be overwritten. 4 * @return new instance of downloader class 5 */ 6 - (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration NS_DESIGNATED_INITIALIZER;

  使用一個(gè) NSURLSessionConfiguration 實(shí)例做參數(shù),創(chuàng)建一個(gè)具有指定的 NSURLSessionConfiguration ?的下載實(shí)例。

  使用 NS_DESIGNATED_INITIALIZER 表示指定的初始化方法。

?

1 /** 2 * Set a value for a HTTP header to be appended to each download HTTP request. 3 * 4 * @param value The value for the header field. Use `nil` value to remove the header. 5 * @param field The name of the header field to set. 6 */ 7 - (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field;

  設(shè)置附加到每個(gè)下載 HTTP 請(qǐng)求的 HTTP 頭的值。

?

1 /** 2 * Returns the value of the specified HTTP header field. 3 * 4 * @return The value associated with the header field field, or `nil` if there is no corresponding header field. 5 */ 6 - (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field;

  返回指定的 HTTP 頭字段的的值。

?

1 /** 2 * Sets a subclass of `SDWebImageDownloaderOperation` as the default 3 * `NSOperation` to be used each time SDWebImage constructs a request 4 * operation to download an image. 5 * 6 * @param operationClass The subclass of `SDWebImageDownloaderOperation` to set 7 * as default. Passing `nil` will revert to `SDWebImageDownloaderOperation`. 8 */ 9 - (void)setOperationClass:(nullable Class)operationClass;

?

1 /** 2 * Creates a SDWebImageDownloader async downloader instance with a given URL 3 * 4 * The delegate will be informed when the image is finish downloaded or an error has happen. 5 * 6 * @see SDWebImageDownloaderDelegate 7 * 8 * @param url The URL to the image to download 9 * @param options The options to be used for this download 10 * @param progressBlock A block called repeatedly while the image is downloading 11 * @note the progress block is executed on a background queue 12 * @param completedBlock A block called once the download is completed. 13 * If the download succeeded, the image parameter is set, in case of error, 14 * error parameter is set with the error. The last parameter is always YES 15 * if SDWebImageDownloaderProgressiveDownload isn't use. With the 16 * SDWebImageDownloaderProgressiveDownload option, this block is called 17 * repeatedly with the partial image object and the finished argument set to NO 18 * before to be called a last time with the full image and finished argument 19 * set to YES. In case of error, the finished argument is always YES. 20 * 21 * @return A token (SDWebImageDownloadToken) that can be passed to -cancel: to cancel this operation 22 */ 23 - (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url 24 options:(SDWebImageDownloaderOptions)options 25 progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock 26 completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock;

  使用指定的 URL 創(chuàng)建一個(gè) SDWebImageDownloader 異步下載實(shí)例。

  當(dāng)圖像下載完成和下載錯(cuò)誤時(shí),將通知代理。

?

1 /** 2 * Cancels a download that was previously queued using -downloadImageWithURL:options:progress:completed: 3 * 4 * @param token The token received from -downloadImageWithURL:options:progress:completed: that should be canceled. 5 */ 6 - (void)cancel:(nullable SDWebImageDownloadToken *)token;

  取消先前排隊(duì)使用的下載。

?

1 /** 2 * Sets the download queue suspension state 3 */ 4 - (void)setSuspended:(BOOL)suspended;

  設(shè)置下載隊(duì)列掛起狀態(tài)。

?

1 /** 2 * Cancels all download operations in the queue 3 */ 4 - (void)cancelAllDownloads;

  取消隊(duì)列中的所有下載操作。

?

  SDWebImageDownloader.m

  ?

1 @implementation SDWebImageDownloadToken 2 @end 3 4 5 @interface SDWebImageDownloader () <NSURLSessionTaskDelegate, NSURLSessionDataDelegate> 6 7 @property (strong, nonatomic, nonnull) NSOperationQueue *downloadQueue; 8 @property (weak, nonatomic, nullable) NSOperation *lastAddedOperation; 9 @property (assign, nonatomic, nullable) Class operationClass; 10 @property (strong, nonatomic, nonnull) NSMutableDictionary<NSURL *, SDWebImageDownloaderOperation *> *URLOperations; 11 @property (strong, nonatomic, nullable) SDHTTPHeadersMutableDictionary *HTTPHeaders; 12 // This queue is used to serialize the handling of the network responses of all the download operation in a single queue 13 @property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; 14 15 // The session in which data tasks will run 16 @property (strong, nonatomic) NSURLSession *session; 17 18 @end

  NSOperationQueue *downloadQueue 下載的隊(duì)列。

  NSOperation *lastAddedOperation 用于紀(jì)錄最后添加的操作。

  Class operationClass ?支持自定義的操作類。

  NSMutableDictionary<NSURL *, SDWebImageDownloaderOperation *> URLOperations 存放著所有的 operation。

  SDHTTPHeadersMutableDictionary *HTTPHeaders HTTP 請(qǐng)求頭。

  dispatch_queue_t barrierQueue 這個(gè)隊(duì)列是用于序列化所有下載操作的網(wǎng)絡(luò)響應(yīng)的處理在一個(gè)單一的隊(duì)列。

  NSURLSession *session 數(shù)據(jù)任務(wù)將運(yùn)行的的會(huì)話。

?

  initialize

1 + (void)initialize { 2 // Bind SDNetworkActivityIndicator if available (download it here: http://github.com/rs/SDNetworkActivityIndicator ) 3 // To use it, just add #import "SDNetworkActivityIndicator.h" in addition to the SDWebImage import 4 if (NSClassFromString(@"SDNetworkActivityIndicator")) { 5 6 #pragma clang diagnostic push 7 #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 8 id activityIndicator = [NSClassFromString(@"SDNetworkActivityIndicator") performSelector:NSSelectorFromString(@"sharedActivityIndicator")]; 9 #pragma clang diagnostic pop 10 11 // Remove observer in case it was previously added. 12 [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStartNotification object:nil]; 13 [[NSNotificationCenter defaultCenter] removeObserver:activityIndicator name:SDWebImageDownloadStopNotification object:nil]; 14 15 [[NSNotificationCenter defaultCenter] addObserver:activityIndicator 16 selector:NSSelectorFromString(@"startActivity") 17 name:SDWebImageDownloadStartNotification object:nil]; 18 [[NSNotificationCenter defaultCenter] addObserver:activityIndicator 19 selector:NSSelectorFromString(@"stopActivity") 20 name:SDWebImageDownloadStopNotification object:nil]; 21 } 22 }

?  initialize 和 load 這兩個(gè)方法:

  執(zhí)行時(shí)機(jī): load 在程序運(yùn)行后立即執(zhí)行 initialize 在類的方法第一次被調(diào)用時(shí)執(zhí)行

  若自身未定義,是否沿用父類的方法:load 否 initialize 是

  類別中的定義: load 全部執(zhí)行,但后于類中的方法,initialize 覆蓋類中的方法,只執(zhí)行一個(gè)

?

  上面 initialize 里面的方法實(shí)現(xiàn),是為了在圖片下載的時(shí)候綁定一個(gè) SDNetworkActivityIndicator,當(dāng)引入 SDNetworkActivityIndicator 類的時(shí)候,先獲得 SDNetworkActivityIndicator 的單例類,然后首先移除之前添加的?SDWebImageDownloadStartNotification、SDWebImageDownloadStopNotification?的通知,然后重新添加 Start 和 Stop 通知,當(dāng) Start 的時(shí)候執(zhí)行 startActivity 方法,當(dāng) Stop 的時(shí)候執(zhí)行 stopActivity 方法。

  sharedDownloader

1 + (nonnull instancetype)sharedDownloader { 2 static dispatch_once_t once; 3 static id instance; 4 dispatch_once(&once, ^{ 5 instance = [self new]; 6 }); 7 return instance; 8 }

  單例方法實(shí)現(xiàn)。

  init

1 - (nonnull instancetype)init { 2 return [self initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 3 } 4 5 - (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration { 6 if ((self = [super init])) { 7 _operationClass = [SDWebImageDownloaderOperation class]; 8 _shouldDecompressImages = YES; 9 _executionOrder = SDWebImageDownloaderFIFOExecutionOrder; 10 _downloadQueue = [NSOperationQueue new]; 11 _downloadQueue.maxConcurrentOperationCount = 6; 12 _downloadQueue.name = @"com.hackemist.SDWebImageDownloader"; 13 _URLOperations = [NSMutableDictionary new]; 14 #ifdef SD_WEBP 15 _HTTPHeaders = [@{@"Accept": @"image/webp,image/*;q=0.8"} mutableCopy]; 16 #else 17 _HTTPHeaders = [@{@"Accept": @"image/*;q=0.8"} mutableCopy]; 18 #endif 19 _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT); 20 _downloadTimeout = 15.0; 21 22 sessionConfiguration.timeoutIntervalForRequest = _downloadTimeout; 23 24 /** 25 * Create the session for this task 26 * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate 27 * method calls and completion handler calls. 28 */ 29 self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration 30 delegate:self 31 delegateQueue:nil]; 32 } 33 return self; 34 }

  自定義初始化方法實(shí)現(xiàn)。對(duì)上面提到的屬性默認(rèn)賦值。SDWebImageDownloaderOperation 為自定義類、默認(rèn)解壓、下載順序 FIFO、并發(fā)下載是 6、15 秒超時(shí)等等。

  _HTTPHeaders 比較特殊:  

  "image/webp,image/*;q=0.8"?是什么意思??image/webp?是 web 格式的圖片,q=0.8?指的是權(quán)重系數(shù)為0.8,q 的取值范圍是 0 - 1, 默認(rèn)值為 1,q 作用于它前邊分號(hào)(;)前邊的內(nèi)容。在這里,image/webp,image/*;q=0.8?表示優(yōu)先接受?image/webp,其次接受?image/*?的圖片。

  dealloc

1 - (void)dealloc { 2 [self.session invalidateAndCancel]; 3 self.session = nil; 4 5 [self.downloadQueue cancelAllOperations]; 6 SDDispatchQueueRelease(_barrierQueue); 7 }

  .h 里面的一堆 SET 和 GET 方法實(shí)現(xiàn)

1 - (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field { 2 if (value) { 3 self.HTTPHeaders[field] = value; 4 } 5 else { 6 [self.HTTPHeaders removeObjectForKey:field]; 7 } 8 } 9 10 - (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field { 11 return self.HTTPHeaders[field]; 12 } 13 14 - (void)setMaxConcurrentDownloads:(NSInteger)maxConcurrentDownloads { 15 _downloadQueue.maxConcurrentOperationCount = maxConcurrentDownloads; 16 } 17 18 - (NSUInteger)currentDownloadCount { 19 return _downloadQueue.operationCount; 20 } 21 22 - (NSInteger)maxConcurrentDownloads { 23 return _downloadQueue.maxConcurrentOperationCount; 24 } 25 26 - (void)setOperationClass:(nullable Class)operationClass { 27 if (operationClass && [operationClass isSubclassOfClass:[NSOperation class]] && [operationClass conformsToProtocol:@protocol(SDWebImageDownloaderOperationInterface)]) { 28 _operationClass = operationClass; 29 } else { 30 _operationClass = [SDWebImageDownloaderOperation class]; 31 } 32 }

  token

1 - (nullable SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock 2 completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock 3 forURL:(nullable NSURL *)url 4 createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { 5 // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. 6 if (url == nil) { 7 if (completedBlock != nil) { 8 completedBlock(nil, nil, nil, NO); 9 } 10 return nil; 11 } 12 13 __block SDWebImageDownloadToken *token = nil; 14 15 dispatch_barrier_sync(self.barrierQueue, ^{ 16 SDWebImageDownloaderOperation *operation = self.URLOperations[url]; 17 if (!operation) { 18 operation = createCallback(); 19 self.URLOperations[url] = operation; 20 21 __weak SDWebImageDownloaderOperation *woperation = operation; 22 operation.completionBlock = ^{ 23 SDWebImageDownloaderOperation *soperation = woperation; 24 if (!soperation) return; 25 if (self.URLOperations[url] == soperation) { 26 [self.URLOperations removeObjectForKey:url]; 27 }; 28 }; 29 } 30 id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; 31 32 token = [SDWebImageDownloadToken new]; 33 token.url = url; 34 token.downloadOperationCancelToken = downloadOperationCancelToken; 35 }); 36 37 return token; 38 }

  每一個(gè)圖片的 URL 都會(huì)被作為對(duì)應(yīng)的下載操作的唯一標(biāo)識(shí),每一個(gè)下載都會(huì)綁定一個(gè) progressBlock 和一個(gè) completeBlock,最后還用這個(gè) URL 與 SDWebImageDownloaderOperation 建立聯(lián)系。

  該 URL 將被作為回調(diào)字典的關(guān)鍵所以不能為 nil。如果是 nil 則直接調(diào)用沒有數(shù)據(jù)和 image 的完成的 block。

  定義一個(gè) __block 修飾的 SDWebImageDownloadToken 實(shí)例 token。

  在 self.barrierQueue 隊(duì)列中使用?dispatch_barrier_sync?同步執(zhí)行:

  使用 URL 從 self.URLOperations 中獲取指定的 SDWebImageDownloaderOperation。

  如果 operation 不存在:

  operation = createCallback(); 執(zhí)行這個(gè) block。

  把 operation 存入 self.URLOperations 字典里面。

  operation 的 ?completionBlock 的實(shí)現(xiàn),從 self.URLOperations 里面刪除 URL 對(duì)應(yīng)的 SDWebImageDownloaderOperation。

  把完成的 block 和 進(jìn)度的 block 添加進(jìn) operation 的 _callbackBlocks 里面。

  downloadOperationCancelToken 是一個(gè)存放了完成 block 和進(jìn)度 block 的字典。

  給 token 賦值。

  返回 token。

?

  創(chuàng)建 SDWebImageDownloaderOperation?

1 - (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url 2 options:(SDWebImageDownloaderOptions)options 3 progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock 4 completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { 5 __weak SDWebImageDownloader *wself = self; 6 7 return [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^SDWebImageDownloaderOperation *{ 8 __strong __typeof (wself) sself = wself; 9 NSTimeInterval timeoutInterval = sself.downloadTimeout; 10 if (timeoutInterval == 0.0) { 11 timeoutInterval = 15.0; 12 } 13 14 // In order to prevent from potential duplicate caching (NSURLCache + SDImageCache) we disable the cache for image requests if told otherwise 15 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:(options & SDWebImageDownloaderUseNSURLCache ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData) timeoutInterval:timeoutInterval]; 16 request.HTTPShouldHandleCookies = (options & SDWebImageDownloaderHandleCookies); 17 request.HTTPShouldUsePipelining = YES; 18 if (sself.headersFilter) { 19 request.allHTTPHeaderFields = sself.headersFilter(url, [sself.HTTPHeaders copy]); 20 } 21 else { 22 request.allHTTPHeaderFields = sself.HTTPHeaders; 23 } 24 SDWebImageDownloaderOperation *operation = [[sself.operationClass alloc] initWithRequest:request inSession:sself.session options:options]; 25 operation.shouldDecompressImages = sself.shouldDecompressImages; 26 27 if (sself.urlCredential) { 28 operation.credential = sself.urlCredential; 29 } else if (sself.username && sself.password) { 30 operation.credential = [NSURLCredential credentialWithUser:sself.username password:sself.password persistence:NSURLCredentialPersistenceForSession]; 31 } 32 33 if (options & SDWebImageDownloaderHighPriority) { 34 operation.queuePriority = NSOperationQueuePriorityHigh; 35 } else if (options & SDWebImageDownloaderLowPriority) { 36 operation.queuePriority = NSOperationQueuePriorityLow; 37 } 38 39 [sself.downloadQueue addOperation:operation]; 40 if (sself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) { 41 // Emulate LIFO execution order by systematically adding new operations as last operation's dependency 42 [sself.lastAddedOperation addDependency:operation]; 43 sself.lastAddedOperation = operation; 44 } 45 46 return operation; 47 }]; 48 }

  用 __weak 修飾 ?self。

  調(diào)用上面的返回 Token 的方法:

  主要看 createCallback 的實(shí)現(xiàn):

  在 block 內(nèi)部使用 __strong 修飾 self。

  設(shè)置超時(shí)時(shí)間。

  創(chuàng)建 request,主要注意緩存策略的選擇。

  給 ?request 的 ?HTTPShouldHandleCookies 和 HTTPShouldUsePipelining 賦值。

  設(shè)置請(qǐng)求頭。

  創(chuàng)建 SDWebImageDownloaderOperation。

  給 SDWebImageDownloaderOperation 設(shè)置 urlCredential。

  給 SDWebImageDownloaderOperation 設(shè)置操作的優(yōu)先級(jí)。

  把操作添加進(jìn)隊(duì)列里面。

  根據(jù) _executionOrder 是先進(jìn)先出還是先進(jìn)后出,給操作添加依賴。

?

  取消某個(gè)操作

1 - (void)cancel:(nullable SDWebImageDownloadToken *)token { 2 dispatch_barrier_async(self.barrierQueue, ^{ 3 SDWebImageDownloaderOperation *operation = self.URLOperations[token.url]; 4 BOOL canceled = [operation cancel:token.downloadOperationCancelToken]; 5 if (canceled) { 6 [self.URLOperations removeObjectForKey:token.url]; 7 } 8 }); 9 }

  

  設(shè)置隊(duì)列掛起

1 - (void)setSuspended:(BOOL)suspended { 2 (self.downloadQueue).suspended = suspended; 3 }

  

  全部操作取消

1 - (void)cancelAllDownloads { 2 [self.downloadQueue cancelAllOperations]; 3 }

  

  Helper methods

1 #pragma mark Helper methods 2 3 - (SDWebImageDownloaderOperation *)operationWithTask:(NSURLSessionTask *)task { 4 SDWebImageDownloaderOperation *returnOperation = nil; 5 for (SDWebImageDownloaderOperation *operation in self.downloadQueue.operations) { 6 if (operation.dataTask.taskIdentifier == task.taskIdentifier) { 7 returnOperation = operation; 8 break; 9 } 10 } 11 return returnOperation; 12 }

    

  NSURLSessionDataDelegate

  self.session 在初始化的時(shí)候把 delegate 設(shè)置為了當(dāng)前類,且 SDWebImageDownloader 遵守?NSURLSessionTaskDelegateNSURLSessionDataDelegate?協(xié)議,當(dāng)使用 self.session 請(qǐng)求數(shù)據(jù),收到響應(yīng)的的時(shí)候,會(huì)調(diào)用 SDWebImageDownloader.m 里面實(shí)現(xiàn)的代理方法,然后在調(diào)用 SDWebImageDownloaderOperation 里面的代理方法。第一次見這樣的設(shè)計(jì),作者的目的是為了共用一個(gè) URLSession。

1 - (void)URLSession:(NSURLSession *)session 2 dataTask:(NSURLSessionDataTask *)dataTask 3 didReceiveResponse:(NSURLResponse *)response 4 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { 5 6 // Identify the operation that runs this task and pass it the delegate method 7 SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; 8 9 [dataOperation URLSession:session dataTask:dataTask didReceiveResponse:response completionHandler:completionHandler]; 10 } 11 12 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { 13 14 // Identify the operation that runs this task and pass it the delegate method 15 SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; 16 17 [dataOperation URLSession:session dataTask:dataTask didReceiveData:data]; 18 } 19 20 - (void)URLSession:(NSURLSession *)session 21 dataTask:(NSURLSessionDataTask *)dataTask 22 willCacheResponse:(NSCachedURLResponse *)proposedResponse 23 completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { 24 25 // Identify the operation that runs this task and pass it the delegate method 26 SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; 27 28 [dataOperation URLSession:session dataTask:dataTask willCacheResponse:proposedResponse completionHandler:completionHandler]; 29 }

  

  NSURLSessionDataDelegate

1 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 2 // Identify the operation that runs this task and pass it the delegate method 3 SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; 4 5 [dataOperation URLSession:session task:task didCompleteWithError:error]; 6 } 7 8 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler { 9 10 completionHandler(request); 11 } 12 13 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { 14 15 // Identify the operation that runs this task and pass it the delegate method 16 SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; 17 18 [dataOperation URLSession:session task:task didReceiveChallenge:challenge completionHandler:completionHandler]; 19 }

?

參考鏈接:http://www.jianshu.com/p/8411e4645f0d

END

?

轉(zhuǎn)載于:https://www.cnblogs.com/chmhml/p/6956727.html

總結(jié)

以上是生活随笔為你收集整理的SDWebImage源码阅读(九)SDWebImageDownloader的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

亚洲成人精品影院 | 久久五月天色综合 | 亚洲精品乱码久久久一二三 | 亚洲美女精品 | 国产91免费观看 | 成人免费大片黄在线播放 | 国产精品h在线观看 | 欧美精品做受xxx性少妇 | 黄色成人影视 | 中文字幕亚洲综合久久五月天色无吗'' | 97超碰在线视 | 中文有码在线 | 最新av在线播放 | 深爱激情婷婷网 | 99久久久国产精品免费观看 | 国产高清视频免费最新在线 | 日韩色中色 | 天堂av在线网 | 97人人模人人爽人人少妇 | 成年性视频 | 综合天堂av久久久久久久 | 99久久国产免费免费 | 高清不卡一区二区三区 | 久久综合综合久久综合 | 一区二区三区四区久久 | 日韩久久精品一区二区三区 | 天天插综合 | 免费观看版 | 日韩三级av | 久久久 激情 | 欧美福利网址 | 九九热免费在线视频 | 天天爱天天操 | 人人爽爽人人 | 色婷婷综合在线 | 亚洲三级黄色 | 久久爱综合 | 久久久久久蜜av免费网站 | 成人网中文字幕 | 99视频在线观看一区三区 | 欧美一二三区在线播放 | 日本久久精 | 99久久日韩精品免费热麻豆美女 | 色婷婷啪啪免费在线电影观看 | 国产精品专区一 | 91av成人 | 99久久爱 | 久草在线免费色站 | 中文字幕免费不卡视频 | 日韩成人邪恶影片 | 国产精品一区二区三区四 | 亚洲成人资源在线观看 | 国产精品嫩草55av | 国产精品久久久久久五月尺 | 免费视频你懂的 | 成人福利在线播放 | 人人爽影院 | 丁香伊人网 | 久久久亚洲电影 | 国产精品女| 免费高清在线观看成人 | 久久久久久久久久久免费视频 | 很黄很污的视频网站 | av.com在线 | 国产va精品免费观看 | 国产乱对白刺激视频不卡 | 午夜电影久久久 | 久久九精品 | 亚洲免费视频在线观看 | 国产日韩精品视频 | 日韩特黄一级欧美毛片特黄 | 国产99区| 久久久精品视频网站 | 99高清视频有精品视频 | 久碰视频在线观看 | 麻花传媒mv免费观看 | 91免费观看 | 久久超碰网 | 成人精品99 | 一区二区 不卡 | 国产精品成人国产乱一区 | 久久精品视频在线 | 欧美日韩大片在线观看 | 欧美一级日韩三级 | 久久成人亚洲欧美电影 | 日本成人中文字幕在线观看 | 国产一卡二卡在线 | 超碰公开在线 | 国产不卡一二三区 | 最新极品jizzhd欧美 | 中文字幕精品视频 | 色多多视频在线 | 国产99色 | 国产91小视频| 欧美精品免费在线观看 | 麻豆久久久久久久 | 狠狠的操狠狠的干 | 日本中文字幕视频 | 天天做天天爱天天爽综合网 | 久久免费观看视频 | 日韩中文在线电影 | 久久精品国产精品亚洲 | 久久精品一二三区 | 一本一道久久a久久精品蜜桃 | 欧美久久精品 | 久久久网址 | 久久精品伊人 | 在线观看精品黄av片免费 | 午夜资源站 | 久久中文视频 | 69国产成人综合久久精品欧美 | 日韩在线视频观看免费 | 2023国产精品自产拍在线观看 | 亚洲夜夜网 | 国产不卡免费视频 | 夜夜操狠狠干 | 成人精品一区二区三区中文字幕 | 国产黄色片在线免费观看 | 欧美日韩性视频在线 | 天天干天天操天天干 | 一级特黄aaa大片在线观看 | 久久久五月天 | 91精品免费在线 | 欧美另类z0zx | 国模一二三区 | 在线中文字幕观看 | 色婷婷福利视频 | 亚洲欧美日韩精品久久奇米一区 | 人人草在线视频 | 久久久久久看片 | 久久久精品久久 | 亚洲va欧洲va国产va不卡 | 黄色一集片 | 黄色网在线免费观看 | 中文字幕亚洲精品在线观看 | 国产色资源 | 日本中文字幕在线 | 91亚洲精品久久久蜜桃借种 | 国产精品99久久久久久小说 | 亚洲黄色成人 | 国产精品成人久久 | 2024国产精品视频 | 99久久久久免费精品国产 | 91精品国产自产在线观看永久 | 欧美日韩一区二区久久 | 99久久久国产精品免费观看 | 天堂av在线免费 | 中文在线中文a | 在线观看亚洲精品 | 国产精品亚州 | 久久免费片 | 91热爆视频| 天天操天 | 国内精品久久久久影院一蜜桃 | 久久久久国产成人免费精品免费 | 亚洲视频axxx | 国产精品黄色在线观看 | 日韩欧美在线高清 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国产情侣一区 | 一区二区理论片 | 国产中文在线观看 | 超碰激情在线 | 国产 欧美 日本 | 亚洲视频在线免费看 | 国产h在线播放 | 久久网站最新地址 | www亚洲国产 | 黄色美女免费网站 | 成人av地址| 中文字幕在线观看第三页 | 欧美精品国产精品 | 992tv在线观看 | 国产一区二区三区午夜 | 午夜精品婷婷 | 免费在线一区二区三区 | 精品久久九九 | 91麻豆高清视频 | 色www精品视频在线观看 | 天天插天天射 | 欧美性护士 | 网站在线观看日韩 | 亚洲国产午夜精品 | 蜜臀av性久久久久蜜臀av | 超碰人人av | 日本 在线 视频 中文 有码 | 日本在线免费看 | 久久婷婷精品视频 | 国产免费专区 | 国产精品久久久久久久久久久免费看 | 四虎在线永久免费观看 | 午夜色影院 | 亚洲 欧洲 国产 日本 综合 | 激情喷水 | 亚洲午夜久久久综合37日本 | 在线观看免费高清视频大全追剧 | 婷婷开心久久网 | 久久高清毛片 | 亚洲国产网站 | 黄色特一级片 | 99中文字幕视频 | 久久久国产网站 | 久久久久久久久毛片精品 | 六月激情网 | 欧美日韩1区2区 | 中文字幕91在线 | 久久艹免费| 久久中文字幕导航 | 菠萝菠萝蜜在线播放 | 麻豆91小视频 | 狠狠干.com| 午夜视频一区二区三区 | 色视频网站免费观看 | 天天躁天天狠天天透 | 久久精品欧美日韩精品 | 亚洲首页| 亚洲五月婷| 亚洲乱码在线观看 | 久久久久国产精品一区二区 | 麻豆国产精品一区二区三区 | 中文字幕在线观看网址 | 日日爽视频 | 日韩电影中文字幕在线 | 久久久久免费精品视频 | 久久免费视频在线观看30 | 免费看的黄色录像 | 91精品国自产在线观看 | 欧美性久久久久久 | 1000部国产精品成人观看 | 中文字幕一区二区三区四区视频 | 伊人看片| 四虎国产精 | 国产精品久久久久一区二区 | 久久成人国产精品 | 2019免费中文字幕 | 久久久精品一区二区三区 | 天天操人人干 | 激情久久综合网 | 在线观看网站你懂的 | 久久午夜鲁丝片 | 久久视频中文字幕 | 国产大陆亚洲精品国产 | 香蕉网在线 | 亚州精品国产 | 国产 字幕 制服 中文 在线 | 黄色小说18| 国产精品久久久久久久久久久久午夜 | 久久久久亚洲精品男人的天堂 | 国产伦理一区二区三区 | 免费观看国产成人 | 国产午夜小视频 | 成人黄色av免费在线观看 | 粉嫩av一区二区三区四区五区 | 国产精品日韩在线播放 | 男女免费视频观看 | 欧美一区二区三区激情视频 | 久草网站在线 | 亚洲黄色片 | 手机色在线 | 久久综合免费视频 | 精品国产资源 | 亚洲最新视频在线播放 | 亚洲综合成人av | 久久新视频 | 中文字幕在线观看免费高清电影 | 国内久久看 | 天天干夜夜想 | 欧美日在线 | 久草网在线| 亚洲 欧洲av| 五月色婷| 国产婷婷视频在线 | 黄色资源在线观看 | 欧美国产精品久久久久久免费 | 波多野结衣视频一区二区 | 激情综合亚洲精品 | 欧美综合色在线图区 | 欧美日韩久久不卡 | 黄色三级网站 | 992tv在线成人免费观看 | 欧美日韩免费看 | ww视频在线观看 | 99在线观看 | 亚洲精品在线播放视频 | 国产亚洲久一区二区 | 永久免费在线 | 国产精品一区二 | 久久好看免费视频 | 欧美a级在线播放 | 久久视频99| 欧美精品久久久久久久久久丰满 | 日批网站免费观看 | av综合在线观看 | 日韩二区三区 | 中国精品少妇 | 伊人久操 | 国产免费视频在线 | 免费在线看v | 亚洲精品男人天堂 | 日韩在线视频精品 | 色播亚洲婷婷 | 99久高清在线观看视频99精品热在线观看视频 | 97视频在线免费 | 精品国产伦一区二区三区观看体验 | 能在线观看的日韩av | 最新一区二区三区 | 精品亚洲一区二区 | 久久久久亚洲国产精品 | 亚洲成av人影院 | 国产无限资源在线观看 | 奇米四色影狠狠爱7777 | 婷婷综合久久 | 亚洲精品在线免费 | 中文字幕乱在线伦视频中文字幕乱码在线 | 97人人添人澡人人爽超碰动图 | 五月色丁香 | 日韩三级在线 | 视频 天天草 | 操操日 | 国内免费的中文字幕 | 91麻豆精品国产午夜天堂 | 少妇按摩av | 国产中文a| 成人av中文字幕在线观看 | avove黑丝| 九色视频网 | 少妇bbb| 天天插天天干天天操 | 久久视频在线观看免费 | 亚洲天堂网视频 | 久久99精品一区二区三区三区 | 91高清一区 | 香蕉免费 | 色先锋资源网 | 亚洲成人高清在线 | 日韩高清在线看 | 黄色官网在线观看 | 国产午夜精品一区二区三区欧美 | 日韩电影黄色 | 精品一区二区三区久久 | www婷婷 | 欧美另类xxx | 99视频久| 日韩中文字幕免费在线播放 | 黄色免费电影网站 | 97视频在线免费观看 | 在线观看视频你懂的 | 91视频91自拍| 五月天六月婷婷 | 日韩精品视频在线免费观看 | 亚洲在线成人精品 | 亚洲伊人av | 中文字幕一区在线观看视频 | a v在线观看| 看片一区二区三区 | 中文视频在线 | 久草香蕉在线视频 | 久久黄色免费视频 | 99热高清 | 久久久亚洲影院 | 韩日精品中文字幕 | 在线成人小视频 | 99久高清在线观看视频99精品热在线观看视频 | 国产精品高清免费在线观看 | 色94色欧美 | 夜夜操夜夜干 | 美女视频永久黄网站免费观看国产 | 国产在线1区 | 久一在线 | 成人在线免费av | 麻豆精品视频在线观看免费 | 日韩激情网 | 丁香激情五月婷婷 | 国产精品片| 午夜精品视频一区二区三区在线看 | 亚洲精品在线观看中文字幕 | 亚洲精品国产综合久久 | 国精产品999国精产品视频 | 欧美视频日韩 | 2021av在线 | 中文字幕在线观看国产 | 日韩高清dvd | 二区精品视频 | 色欧美日韩| 深夜免费小视频 | 97人人人| 日本乱码在线 | 色综合久久中文字幕综合网 | 久久久久久国产精品999 | 成人av电影免费在线播放 | 亚洲精品国产精品国自产在线 | 欧美成人精品欧美一级乱黄 | 区一区二区三在线观看 | 精产嫩模国品一二三区 | 亚洲日韩欧美一区二区在线 | 欧美坐爱视频 | 天天操夜夜干 | 欧美三级高清 | 激情五月av| 91视频91蝌蚪 | 欧美一级黄色片 | 伊甸园av在线 | 久久综合导航 | www在线观看国产 | 精品国产一区二区三区在线观看 | av免费在线播放 | 91精品蜜桃 | 一区二区三区电影大全 | 男女啪啪网站 | 在线电影 一区 | 91中文字幕永久在线 | 久久久久亚洲精品成人网小说 | 在线观看视频中文字幕 | 成年人在线免费看视频 | 黄色aaa毛片| av在线一二三区 | 狠狠干狠狠色 | 18pao国产成视频永久免费 | 91看片在线免费观看 | 国产精品手机在线观看 | 人人人爽| 美女黄视频免费看 | 午夜a区 | 日本中文一区二区 | 欧美日韩在线视频免费 | 99精品国自产在线 | 欧美日本不卡视频 | 激情深爱 | 国产精品免费观看国产网曝瓜 | 99久久久免费视频 | 国产成人在线观看 | 国产亚洲精品xxoo | 亚洲一区二区三区毛片 | 精品国内自产拍在线观看视频 | 91精品啪在线观看国产81旧版 | 五月婷婷六月综合 | 国产在线永久 | 国产精品videossex国产高清 | av片中文字幕 | www.伊人网| 在线 高清 中文字幕 | 夜夜澡人模人人添人人看 | 99精品视频在线观看视频 | 亚洲精品videossex少妇 | 日本中文字幕在线免费观看 | 一级免费黄视频 | 亚洲精品国产高清 | 亚洲人视频在线 | 欧美另类成人 | 亚洲欧美在线观看视频 | 色天天综合久久久久综合片 | 国产99爱| 91传媒在线播放 | 久久高清国产 | 在线成人一区 | 色婷婷丁香| 99精品免费久久久久久日本 | 九九久| 在线观看日韩精品 | 日日操日日干 | 欧美天天综合 | 波多野结衣资源 | 欧美日韩国产综合一区二区 | 国产精品丝袜久久久久久久不卡 | 91成人免费看 | 激情五月开心 | 日韩四虎 | 免费av观看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 久久免费国产电影 | 黄色小网站免费看 | 96亚洲精品久久久蜜桃 | 91精品在线观看视频 | 国产精品毛片久久久久久久久久99999999 | 日韩专区中文字幕 | 久久视频| 午夜av电影| 色综合久久88色综合天天人守婷 | 96av麻豆蜜桃一区二区 | 久久草| 国产成人精品久久久 | 久久尤物电影视频在线观看 | 免费精品国产va自在自线 | 99re国产| 日韩免费高清在线 | 午夜视频一区二区 | 色偷偷网站视频 | 国产美女黄网站免费 | 日韩欧美国产精品 | 伊人久久在线观看 | 99久久久| 手机av在线免费观看 | 五月婷婷色丁香 | 91精品爽啪蜜夜国产在线播放 | 91人人澡| 国产一级二级在线 | 久久黄网站 | 日韩精品一区在线观看 | 视频一区二区视频 | 久草电影免费在线观看 | 久久国语露脸国产精品电影 | 四虎8848免费高清在线观看 | 中文字幕 第二区 | 日韩久久片 | 99人久久精品视频最新地址 | 日批视频在线播放 | 国精产品999国精产 久久久久 | 日韩网站在线免费观看 | 成人av在线影视 | 在线观看国产www | 在线视频a| 国产精品99久久久久 | 日韩精品免费在线视频 | 久久国色夜色精品国产 | 精品国产一区二区三区久久久久久 | 中文字幕亚洲综合久久五月天色无吗'' | 在线精品亚洲一区二区 | 99久久久国产精品免费99 | 日韩一二区在线观看 | 精品99在线观看 | 免费在线激情视频 | 在线观看视频福利 | 日日夜夜人人天天 | 久久夜靖品 | 色婷婷啪啪免费在线电影观看 | 婷婷香蕉 | 91最新网址在线观看 | 日韩高清免费无专码区 | 久久久亚洲国产精品麻豆综合天堂 | 欧美黑人猛交 | 久久久久久久久久伊人 | 午夜影院一级片 | 久久成人综合 | 狠狠色网| 国产精品电影一区二区 | 久久一区91 | 成人网在线免费视频 | 99re8这里有精品热视频免费 | 黄色av免费电影 | 人人干人人艹 | 国产精品麻豆一区二区三区 | 欧美日韩在线视频一区 | 五月婷婷一级片 | 亚洲成人精品 | 五月的婷婷 | 不卡的av在线播放 | 成人在线观看免费视频 | 日本成人a | 特级黄色一级 | 高清av网 | 中文在线8资源库 | 亚洲欧美日本一区二区三区 | 成人综合日日夜夜 | 国精产品999国精产 久久久久 | 日韩美女免费线视频 | 欧美日韩在线免费视频 | 狠狠狠干狠狠 | 天天想夜夜操 | 日本中文不卡 | 99久久久国产精品美女 | 亚洲国内精品视频 | 精品视频网站 | 免费av成人在线 | 98精品国产自产在线观看 | 最近高清中文在线字幕在线观看 | 91九色蝌蚪国产 | 国产精品视频专区 | 国产色影院 | 日韩无在线 | 国产精品久久久久婷婷二区次 | 久久99精品波多结衣一区 | 娇妻呻吟一区二区三区 | 99热日本 | 狠狠色伊人亚洲综合网站野外 | 国产精品第二十页 | 97香蕉久久国产在线观看 | 欧美日韩精品在线观看视频 | 国产午夜亚洲精品 | 玖玖爱国产在线 | av免费线看 | 在线观看色网 | 精品国产一区二区三区久久久蜜臀 | 成人动漫视频在线 | 黄色软件视频网站 | 色99中文字幕 | 日韩动漫免费观看高清完整版在线观看 | 日韩v在线 | 久久在线精品 | 99精品视频99 | 精品国产电影一区 | 中文一区在线观看 | 精品在线免费视频 | 手机成人在线电影 | 午夜精品久久久久久99热明星 | 国产精品青青 | 六月丁香婷婷网 | 久久香蕉国产精品麻豆粉嫩av | 丁香婷婷激情网 | 在线观看日韩 | 久久亚洲精品国产亚洲老地址 | 日韩精品久久久久久中文字幕8 | 黄色国产在线 | 三级av免费看 | www.天天射.com | 婷婷色视频 | 欧美精品资源 | 国产亚洲高清视频 | 久久视频这里有久久精品视频11 | 人人狠狠综合久久亚洲婷 | 东方av免费在线观看 | 激情视频亚洲 | 99视频播放 | 在线激情av电影 | 夜夜骑天天操 | 亚洲高清视频在线 | 亚洲视频在线免费看 | 色大片免费看 | 91在线播放视频 | 国产精品18久久久 | 五月天综合婷婷 | 国产精品观看 | 国产va在线观看免费 | 六月丁香婷婷网 | 国产精品视频地址 | 在线免费观看亚洲视频 | 久久精品伊人 | 91成人精品一区在线播放69 | 精品高清美女精品国产区 | 操处女逼 | 国产精品九九热 | 亚洲国产成人久久 | 国产又粗又长又硬免费视频 | 中文字幕在线观看网 | 激情五月亚洲 | 久久久久国产精品一区二区 | 久久不射影院 | 久久精品国产第一区二区三区 | 国产精品精品国产 | 中文字幕资源网 国产 | 国产视频1区2区3区 久久夜视频 | 在线看的av网站 | 97在线观看视频免费 | 欧美日韩亚洲在线观看 | 欧美激情精品久久久 | 深爱激情婷婷网 | 精品国产一区二区三区不卡 | 欧美坐爱视频 | 99草在线视频 | 欧美天天综合 | 97在线视频免费 | 国产伦理精品一区二区 | 免费a v在线 | 97在线公开视频 | 极品国产91在线网站 | 伊人超碰在线 | 中文av影院 | 国产色婷婷在线 | 日韩高清免费电影 | 99精品视频一区二区 | 精品久久久久久电影 | 极品中文字幕 | 久久99久久99精品中文字幕 | 在线观看免费一级片 | 国产精品不卡在线播放 | 国产一级不卡视频 | 久久香蕉一区 | 国产黄视频在线观看 | 日韩在线三区 | 97av在线视频 | 狠狠狠色狠狠色综合 | 日本黄区免费视频观看 | 免费高清看电视网站 | 久久99久久99精品免费看小说 | 亚洲精品黄 | 国产系列在线观看 | 天天色天天射天天综合网 | 亚洲黄色小说网 | 国产精品久久人 | 日韩在线免费高清视频 | 色吊丝在线永久观看最新版本 | 亚洲丁香久久久 | 一二三久久久 | 国产精品一区二区你懂的 | 在线观看电影av | 精品999久久久 | 日日日视频 | 免费国产在线精品 | 天天躁天天躁天天躁婷 | 国产精品久久久久婷婷二区次 | 成人动漫视频在线 | 欧美性生爱| 午夜久久久久久久久久久 | 色综合 久久精品 | 天天干天天干天天操 | 精品国产乱码久久久久久浪潮 | 日韩免费电影一区二区 | 在线va视频 | 午夜精品一区二区三区四区 | 麻豆91精品 | 黄色成人影视 | 色婷婷伊人 | 狠狠操综合 | 国产精成人品免费观看 | 日本黄色大片免费 | 九九热在线观看 | 久久美女电影 | 日韩免费一级a毛片在线播放一级 | 亚欧洲精品视频在线观看 | 久久久免费精品 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 亚洲激精日韩激精欧美精品 | 99国内精品 | 免费看麻豆 | 国产精品一区二区三区视频免费 | 免费的国产精品 | 亚洲视频www | 亚洲最新在线 | 91最新网址 | 狠狠操天天干 | 亚洲精品视频观看 | 日韩在线观看你懂的 | 成年人视频在线 | 99热这里只有精品8 久久综合毛片 | 久久手机视频 | 免费视频成人 | 五月天激情综合网 | 欧美在线视频日韩 | 久久网页 | 亚洲精品成人在线 | 国产精品激情偷乱一区二区∴ | 免费在线成人 | 99免费在线视频 | 丁香六月国产 | 高潮毛片无遮挡高清免费 | 狠狠干我 | 超碰在线人人草 | 欧美精品久久久久a | 日日日操| 激情综合狠狠 | 超碰人人射 | 特级黄色视频毛片 | 国产视频91在线 | 日韩色综合 | 97品白浆高清久久久久久 | 伊人小视频 | 在线你懂 | 日韩在线理论 | 亚洲高清视频在线 | 黄色一级免费 | 久久激情婷婷 | 国产91探花| 成人午夜电影久久影院 | 黄色一二级片 | 中文字幕av日韩 | 欧美综合色在线图区 | 五月综合激情网 | 天天射,天天干 | 久久国产亚洲精品 | 久久91久久久久麻豆精品 | 国产精品视屏 | 久久艹久久 | 夜夜爽www| 久热国产视频 | 一区二区三区免费在线播放 | 在线看成人av | avv天堂| 日韩三区在线观看 | 美女黄频视频大全 | 久久好看免费视频 | 亚洲天堂免费视频 | 在线免费黄网站 | 久久综合久色欧美综合狠狠 | 97精品国自产拍在线观看 | 久久亚洲综合色 | 不卡的av中文字幕 | 色就色,综合激情 | 精品久久一 | 国产精品久久久久久久av电影 | 黄色影院在线观看 | 精品国产乱码久久久久久1区二区 | 91福利视频网站 | 高清国产一区 | 久久激情精品 | 天堂av在线7| 亚洲影视九九影院在线观看 | 国产精品成人免费 | 97精品久久人人爽人人爽 | 色视频在线免费 | 免费看的黄色的网站 | 九九久久电影 | 日韩av手机在线观看 | 国产剧情一区在线 | 在线精品视频免费观看 | 在线看一级片 | 亚洲欧美国产精品va在线观看 | 久久精品久久久精品美女 | 伊人狠狠色丁香婷婷综合 | 国产麻豆精品久久 | 在线观看欧美成人 | av电影免费在线播放 | 91插插影库 | 亚洲欧美日韩一区二区三区在线观看 | 一级黄色毛片 | 久久久久激情电影 | 国产一在线精品一区在线观看 | 黄色在线观看免费网站 | 欧美色黄 | av片子在线观看 | 精品电影一区二区 | 国产黄色片在线免费观看 | av成人在线观看 | 免费看的黄色小视频 | 天天操比 | 在线观看一级 | 亚洲精品国产精品国自产观看浪潮 | 免费看片网址 | 丁香六月婷婷开心 | 玖玖国产精品视频 | 国产二区视频在线观看 | 在线观看国产高清视频 | 久久视频二区 | 亚洲国产精品传媒在线观看 | www.伊人网 | 国产女教师精品久久av | 亚洲人成综合 | 免费在线国产精品 | 亚洲国产一区二区精品专区 | 97超碰免费在线观看 | 天天射综合网站 | 一级欧美黄 | 日韩丝袜在线观看 | 狠狠色丁香婷婷综合久小说久 | 亚洲经典视频 | 久久成人国产精品入口 | 综合色中色 | 日韩美视频 | 欧美一区影院 | 丁香视频 | 在线观看免费高清视频大全追剧 | 国产一区二区电影在线观看 | 精品国产电影一区二区 | 日韩动态视频 | 欧美 激情在线 | 最新午夜 | 日韩免费一区 | 日本资源中文字幕在线 | 久久午夜国产 | 成人av.com| 九色精品在线 | 亚洲 中文 在线 精品 | 成人国产精品一区二区 | 欧美在线视频一区二区三区 | 久久中文字幕导航 | 视频在线精品 | 一区二区三区三区在线 | 六月丁香综合 | 91九色porn在线资源 | 亚洲精品视频免费在线观看 | 午夜91视频| 久久夜色精品国产欧美乱 | 奇米影音四色 | 亚洲欧洲精品一区二区 | 香蕉视频最新网址 | 中文字幕在线视频免费播放 | 精品国产伦一区二区三区观看方式 | 一区二区中文字幕在线播放 | 国产黄大片在线观看 | 精品久久久久一区二区国产 | 亚洲精品一区二区三区新线路 | 日韩欧美视频二区 | 国产99一区视频免费 | 91av免费在线观看 | 久久久久亚洲精品成人网小说 | 狠狠干激情 | 国产精品1区2区 | 日日操操操| 97成人精品区在线播放 | av电影免费在线播放 | 在线日韩亚洲 | 夜夜嗨av色一区二区不卡 | 成人一区二区三区中文字幕 | 97av视频| 人人插人人射 | 久久伦理影院 | 韩国三级av在线 | 国产黄色免费电影 | 日日夜夜网站 | 久久久久网址 | 久在线观看视频 | 久久专区 | 精品视频123区在线观看 | 国产免费区 | 91亚洲精品国偷拍自产在线观看 | 中文字幕在线观看完整 | 在线观看亚洲精品视频 | 探花视频免费在线观看 | 精品一区二区免费视频 | 久久99国产综合精品免费 | 超碰人人草 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 中文字幕一区二区三区久久 | 久久成人午夜视频 | 久草在线视频免费资源观看 | 蜜臀精品久久久久久蜜臀 | 在线观看免费黄视频 | 天天艹天天爽 | 国产欧美日韩精品一区二区免费 | 天天操天天干天天操天天干 | 69精品| 中文亚洲欧美日韩 | 精品国产伦一区二区三区观看体验 | 国产精品久久久久久久久婷婷 | 五月在线 | 国产精久久久久久久 | 日韩乱码在线 | 久久字幕 | 精品美女在线视频 | 亚洲欧洲一区二区在线观看 | www.99久久.com | 国产色久 | 在线观看欧美成人 | 久久久久久久久久久福利 | 在线观看国产中文字幕 | av电影一区二区 | 91视频高清免费 | 欧美精品中文在线免费观看 | 成人福利在线观看 | 欧美激情精品久久久久久免费 | 天天操天天插 | 国产中文字幕视频在线观看 | 九九热免费在线观看 | 国产精品久久久久久欧美 | 美女免费电影 | 波多野结衣电影一区二区三区 | 久久久久久久久黄色 | 99亚洲国产 | 精品999国产| 超碰人在线 | 国产视频在线一区二区 | 亚洲精品乱码久久久久久9色 | 处女av在线 | 国产在线视频在线观看 | 中文字幕在线免费观看视频 | 天天干天天操天天做 | 国产视频 亚洲视频 | 亚洲成人在线免费 | 热久久这里只有精品 | 日本深夜福利视频 | 人人玩人人添人人澡超碰 | 一区二区观看 | 国产精品久久久久一区二区三区 | 久久欧美在线电影 | 丁香激情综合 | 国产精品欧美 | 天天色 天天| 激情综合五月天 | 天天干天天操天天操 | 三级黄色免费片 | 国产v欧美| 8x成人在线| 91精品国产91p65 | 激情综合五月 | 久久99日韩| 成人午夜剧场在线观看 | 日本精品久久久久影院 | 91人人插| 国产精品九九视频 | 麻豆国产在线播放 | 日韩电影久久 | 狠狠操欧美 | 超碰97在线看 | 五月天婷婷在线播放 | 久久亚洲免费视频 | 精品电影一区二区 | 成人在线免费视频观看 | 国产精品mm | 亚洲免费观看视频 | 日韩免费看 | www在线观看国产 | 91av社区| 国产成人高清av | 九热精品 | 激情欧美一区二区三区免费看 | 欧美另类成人 | 国色天香在线观看 | 国产特级毛片aaaaaaa高清 | 国产亚洲在线 | 欧美日韩二三区 | 国产欧美日韩一区 | 在线免费观看视频a | 正在播放 久久 | 国产中文字幕一区二区三区 | 久久激情视频 久久 | 在线免费性生活片 | 在线免费观看涩涩 | 日韩免费久久 | 免费一级特黄毛大片 | 久久久久久欧美二区电影网 |