From 21ff7bd6ff6e66f6135f0337f72f3f89f9babac0 Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Mon, 10 Dec 2012 15:08:56 +0100 Subject: [PATCH] Do not use GCD barrier for reading --- SDWebImage/SDWebImageDownloader.m | 38 ++++++++++++++++--------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/SDWebImage/SDWebImageDownloader.m b/SDWebImage/SDWebImageDownloader.m index ea44690..a436943 100644 --- a/SDWebImage/SDWebImageDownloader.m +++ b/SDWebImage/SDWebImageDownloader.m @@ -107,7 +107,7 @@ static NSString *const kCompletedCallbackKey = @"completed"; { if (!wself) return; SDWebImageDownloader *sself = wself; - NSArray *callbacksForURL = [sself callbacksForURL:url remove:NO]; + NSArray *callbacksForURL = [sself callbacksForURL:url]; for (NSDictionary *callbacks in callbacksForURL) { SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey]; @@ -118,7 +118,11 @@ static NSString *const kCompletedCallbackKey = @"completed"; { if (!wself) return; SDWebImageDownloader *sself = wself; - NSArray *callbacksForURL = [sself callbacksForURL:url remove:finished]; + NSArray *callbacksForURL = [sself callbacksForURL:url]; + if (finished) + { + [sself removeCallbacksForURL:url]; + } for (NSDictionary *callbacks in callbacksForURL) { SDWebImageDownloaderCompletedBlock callback = callbacks[kCompletedCallbackKey]; @@ -129,7 +133,8 @@ static NSString *const kCompletedCallbackKey = @"completed"; { if (!wself) return; SDWebImageDownloader *sself = wself; - [sself callbacksForURL:url remove:YES]; + [sself callbacksForURL:url]; + [sself removeCallbacksForURL:url]; }]; [self.downloadQueue addOperation:operation]; }]; @@ -163,25 +168,22 @@ static NSString *const kCompletedCallbackKey = @"completed"; }); } -- (NSArray *)callbacksForURL:(NSURL *)url remove:(BOOL)remove +- (NSArray *)callbacksForURL:(NSURL *)url { __block NSArray *callbacksForURL; - if (remove) + dispatch_sync(self.barrierQueue, ^ { - dispatch_barrier_sync(self.barrierQueue, ^ - { - callbacksForURL = self.URLCallbacks[url]; - [self.URLCallbacks removeObjectForKey:url]; - }); - } - else - { - dispatch_sync(self.barrierQueue, ^ - { - callbacksForURL = self.URLCallbacks[url]; - }); - } + callbacksForURL = self.URLCallbacks[url]; + }); return callbacksForURL; } +- (void)removeCallbacksForURL:(NSURL *)url +{ + dispatch_barrier_async(self.barrierQueue, ^ + { + [self.URLCallbacks removeObjectForKey:url]; + }); +} + @end