Fix imageView blinks with option 'SDImageCacheQueryDiskDataSync'
This commit is contained in:
parent
2c53f531f1
commit
8445f2b1a7
|
@ -552,16 +552,19 @@ static NSString * _defaultDiskCacheDirectory;
|
|||
// 2. in-memory cache miss & diskDataSync
|
||||
BOOL shouldQueryDiskSync = ((image && options & SDImageCacheQueryMemoryDataSync) ||
|
||||
(!image && options & SDImageCacheQueryDiskDataSync));
|
||||
void(^queryDiskBlock)(void) = ^{
|
||||
NSData* (^queryDiskDataBlock)(void) = ^NSData* {
|
||||
if (operation.isCancelled) {
|
||||
if (doneBlock) {
|
||||
doneBlock(nil, nil, SDImageCacheTypeNone);
|
||||
}
|
||||
return;
|
||||
return nil;
|
||||
}
|
||||
|
||||
return [self diskImageDataBySearchingAllPathsForKey:key];
|
||||
};
|
||||
|
||||
UIImage* (^queryDiskImageBlock)(NSData*) = ^UIImage*(NSData* diskData) {
|
||||
if (operation.isCancelled) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
@autoreleasepool {
|
||||
NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key];
|
||||
UIImage *diskImage;
|
||||
if (image) {
|
||||
// the image is from in-memory cache, but need image data
|
||||
|
@ -579,24 +582,30 @@ static NSString * _defaultDiskCacheDirectory;
|
|||
[self.memoryCache setObject:diskImage forKey:key cost:cost];
|
||||
}
|
||||
}
|
||||
|
||||
if (doneBlock) {
|
||||
if (shouldQueryDiskSync) {
|
||||
doneBlock(diskImage, diskData, SDImageCacheTypeDisk);
|
||||
} else {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
doneBlock(diskImage, diskData, SDImageCacheTypeDisk);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
return diskImage;
|
||||
};
|
||||
|
||||
// Query in ioQueue to keep IO-safe
|
||||
if (shouldQueryDiskSync) {
|
||||
dispatch_sync(self.ioQueue, queryDiskBlock);
|
||||
__block NSData* diskData;
|
||||
__block UIImage* diskImage;
|
||||
dispatch_sync(self.ioQueue, ^{
|
||||
diskData = queryDiskDataBlock();
|
||||
diskImage = queryDiskImageBlock(diskData);
|
||||
});
|
||||
if (doneBlock) {
|
||||
doneBlock(diskImage, diskData, SDImageCacheTypeDisk);
|
||||
}
|
||||
} else {
|
||||
dispatch_async(self.ioQueue, queryDiskBlock);
|
||||
dispatch_async(self.ioQueue, ^{
|
||||
NSData* diskData = queryDiskDataBlock();
|
||||
UIImage* diskImage = queryDiskImageBlock(diskData);
|
||||
if (doneBlock) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
doneBlock(diskImage, diskData, SDImageCacheTypeDisk);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return operation;
|
||||
|
|
Loading…
Reference in New Issue