Skip to content

Commit 5e9c688

Browse files
author
Mallory Paine
committed
Run deallocBlocks on the FIC dispatch queue so the main thread won't get blocked trying to acquire the FIC lock as an image is deallocated.
1 parent 9a44792 commit 5e9c688

3 files changed

Lines changed: 14 additions & 9 deletions

File tree

FastImageCache/FICImageCache.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ typedef void (^FICImageRequestCompletionBlock)(UIImage *sourceImage);
4545
*/
4646
+ (instancetype)sharedImageCache;
4747

48+
+ (dispatch_queue_t)dispatchQueue;
49+
4850
///---------------------------------
4951
/// @name Working with Image Formats
5052
///---------------------------------

FastImageCache/FICImageCache.m

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ - (void)setDelegate:(id<FICImageCacheDelegate>)delegate {
5353
}
5454

5555
static FICImageCache *__imageCache = nil;
56-
static dispatch_queue_t __imageCacheDispatchQueue = NULL;
5756

5857
#pragma mark - Object Lifecycle
5958

@@ -68,15 +67,19 @@ + (instancetype)sharedImageCache {
6867
return __imageCache;
6968
}
7069

70+
+ (dispatch_queue_t)dispatchQueue {
71+
static dispatch_queue_t __imageCacheDispatchQueue = NULL;
72+
static dispatch_once_t onceToken;
73+
dispatch_once(&onceToken, ^{
74+
__imageCacheDispatchQueue = dispatch_queue_create("com.path.FastImageCacheQueue", NULL);
75+
});
76+
return __imageCacheDispatchQueue;
77+
}
78+
7179
- (id)init {
7280
self = [super init];
7381

7482
if (self != nil) {
75-
static dispatch_once_t onceToken;
76-
dispatch_once(&onceToken, ^{
77-
__imageCacheDispatchQueue = dispatch_queue_create("com.path.FastImageCacheQueue", NULL);
78-
});
79-
8083
_formats = [[NSMutableDictionary alloc] init];
8184
_imageTables = [[NSMutableDictionary alloc] init];
8285
_requests = [[NSMutableDictionary alloc] init];
@@ -159,7 +162,7 @@ - (BOOL)_retrieveImageForEntity:(id <FICEntity>)entity withFormatName:(NSString
159162
if (loadSynchronously == NO && [imageTable entryExistsForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID]) {
160163
imageExists = YES;
161164

162-
dispatch_async(__imageCacheDispatchQueue, ^{
165+
dispatch_async([FICImageCache dispatchQueue], ^{
163166
UIImage *image = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID];
164167

165168
if (completionBlock != nil) {
@@ -332,7 +335,7 @@ - (void)_processImage:(UIImage *)image forEntity:(id <FICEntity>)entity imageTab
332335
NSString *imageFormatName = [imageFormat name];
333336
FICEntityImageDrawingBlock imageDrawingBlock = [entity drawingBlockForImage:image withFormatName:imageFormatName];
334337

335-
dispatch_async(__imageCacheDispatchQueue, ^{
338+
dispatch_async([FICImageCache dispatchQueue], ^{
336339
[imageTable setEntryForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID imageDrawingBlock:imageDrawingBlock];
337340

338341
UIImage *resultImage = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID];

FastImageCache/FICImageTableEntry.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ - (void)executeBlockOnDealloc:(dispatch_block_t)block {
7777

7878
- (void)dealloc {
7979
for (dispatch_block_t block in _deallocBlocks) {
80-
block();
80+
dispatch_async([FICImageCache dispatchQueue], block);
8181
}
8282
}
8383

0 commit comments

Comments
 (0)