From f024890ba7461d2a868c67c80e97b586efcaca3f Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Sun, 17 Feb 2013 03:02:04 +0100 Subject: [PATCH] Add (kinda) LIFO queue mode support for image downloading (fix #294) --- Examples/SDWebImage Demo/MasterViewController.m | 1 + SDWebImage/SDWebImageDownloader.h | 11 +++++++++++ SDWebImage/SDWebImageDownloader.m | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/Examples/SDWebImage Demo/MasterViewController.m b/Examples/SDWebImage Demo/MasterViewController.m index b3624ba..6c0a14e 100644 --- a/Examples/SDWebImage Demo/MasterViewController.m +++ b/Examples/SDWebImage Demo/MasterViewController.m @@ -333,6 +333,7 @@ nil]; } [SDWebImageManager.sharedManager.imageDownloader setValue:@"SDWebImage Demo" forHTTPHeaderField:@"AppName"]; + SDWebImageManager.sharedManager.imageDownloader.queueMode = SDWebImageDownloaderLIFOQueueMode; return self; } diff --git a/SDWebImage/SDWebImageDownloader.h b/SDWebImage/SDWebImageDownloader.h index dce4841..ffc929e 100644 --- a/SDWebImage/SDWebImageDownloader.h +++ b/SDWebImage/SDWebImageDownloader.h @@ -16,6 +16,12 @@ typedef enum SDWebImageDownloaderProgressiveDownload = 1 << 1 } SDWebImageDownloaderOptions; +typedef enum +{ + SDWebImageDownloaderFILOQueueMode, + SDWebImageDownloaderLIFOQueueMode +} SDWebImageDownloaderQueueMode; + extern NSString *const SDWebImageDownloadStartNotification; extern NSString *const SDWebImageDownloadStopNotification; @@ -29,6 +35,11 @@ typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage *image, NSData *data, @property (assign, nonatomic) NSInteger maxConcurrentDownloads; +/** + * Changes download operations unqueue mode. Default value is `SDWebImageDownloaderFILOQueueMode`. + */ +@property (assign, nonatomic) SDWebImageDownloaderQueueMode queueMode; + + (SDWebImageDownloader *)sharedDownloader; /** diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index b52d38c..e8176ea 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -19,6 +19,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; @interface SDWebImageDownloader () @property (strong, nonatomic) NSOperationQueue *downloadQueue; +@property (weak, nonatomic) NSOperation *lastAddedOperation; @property (strong, nonatomic) NSMutableDictionary *URLCallbacks; @property (strong, nonatomic) NSMutableDictionary *HTTPHeaders; // This queue is used to serialize the handling of the network responses of all the download operation in a single queue @@ -66,6 +67,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; { if ((self = [super init])) { + _queueMode = SDWebImageDownloaderFILOQueueMode; _downloadQueue = NSOperationQueue.new; _downloadQueue.maxConcurrentOperationCount = 2; _URLCallbacks = NSMutableDictionary.new; @@ -156,6 +158,12 @@ static NSString *const kCompletedCallbackKey = @"completed"; [sself removeCallbacksForURL:url]; }]; [wself.downloadQueue addOperation:operation]; + if (wself.queueMode == SDWebImageDownloaderLIFOQueueMode) + { + // Emulate LIFO queue mode by systematically adding new operations as last operation's dependency + [wself.lastAddedOperation addDependency:operation]; + wself.lastAddedOperation = operation; + } }]; return operation;