Skip to content

Commit e424c80

Browse files
author
Mallory Paine
committed
When retrieving an image asynchronously, preheat the data so that the data is paged in and ready to go when the image is eventually drawn.
1 parent b38a0d8 commit e424c80

5 files changed

Lines changed: 22 additions & 5 deletions

File tree

FastImageCache/FICImageCache.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ - (BOOL)_retrieveImageForEntity:(id <FICEntity>)entity withFormatName:(NSString
163163
imageExists = YES;
164164

165165
dispatch_async([FICImageCache dispatchQueue], ^{
166-
UIImage *image = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID];
166+
UIImage *image = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID preheatData:YES];
167167

168168
if (completionBlock != nil) {
169169
dispatch_async(dispatch_get_main_queue(), ^{
@@ -172,7 +172,7 @@ - (BOOL)_retrieveImageForEntity:(id <FICEntity>)entity withFormatName:(NSString
172172
}
173173
});
174174
} else {
175-
UIImage *image = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID];
175+
UIImage *image = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID preheatData:NO];
176176
imageExists = image != nil;
177177

178178
dispatch_block_t completionBlockCallingBlock = ^{
@@ -338,7 +338,7 @@ - (void)_processImage:(UIImage *)image forEntity:(id <FICEntity>)entity imageTab
338338
dispatch_async([FICImageCache dispatchQueue], ^{
339339
[imageTable setEntryForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID imageDrawingBlock:imageDrawingBlock];
340340

341-
UIImage *resultImage = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID];
341+
UIImage *resultImage = [imageTable newImageForEntityUUID:entityUUID sourceImageUUID:sourceImageUUID preheatData:NO];
342342

343343
if (completionBlocks != nil) {
344344
dispatch_async(dispatch_get_main_queue(), ^{

FastImageCache/FICImageTable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ extern NSString *const FICImageTableScreenScaleKey;
119119
@note If either the entity UUID or the source image UUID doesn't match the corresponding UUIDs in the entry data, then something has changed. The entry data is deleted for the
120120
provided entity UUID, and `nil` is returned.
121121
*/
122-
- (UIImage *)newImageForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSString *)sourceImageUUID;
122+
- (UIImage *)newImageForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSString *)sourceImageUUID preheatData:(BOOL)preheatData;
123123

124124
/**
125125
Deletes image entry data in the image table.

FastImageCache/FICImageTable.m

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ - (void)setEntryForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSString *
299299
}
300300
}
301301

302-
- (UIImage *)newImageForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSString *)sourceImageUUID {
302+
- (UIImage *)newImageForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSString *)sourceImageUUID preheatData:(BOOL)preheatData {
303303
UIImage *image = nil;
304304

305305
if (entityUUID != nil && sourceImageUUID != nil) {
@@ -345,6 +345,10 @@ - (UIImage *)newImageForEntityUUID:(NSString *)entityUUID sourceImageUUID:(NSStr
345345
NSString *message = [NSString stringWithFormat:@"*** FIC Error: %s could not create a new CGImageRef for entity UUID %@.", __PRETTY_FUNCTION__, entityUUID];
346346
[[FICImageCache sharedImageCache] _logMessage:message];
347347
}
348+
349+
if (image != nil && preheatData) {
350+
[entryData preheat];
351+
}
348352
}
349353
}
350354

FastImageCache/FICImageTableEntry.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ typedef struct {
5454

5555
@property (nonatomic, readonly) FICImageTableChunk *imageTableChunk;
5656

57+
- (void)preheat;
58+
5759
///----------------------------------------
5860
/// @name Initializing an Image Table Entry
5961
///----------------------------------------

FastImageCache/FICImageTableEntry.m

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,4 +108,15 @@ - (void)flush {
108108
}
109109
}
110110

111+
- (void)preheat {
112+
int pageSize = [FICImageTable pageSize];
113+
void *bytes = [self bytes];
114+
NSUInteger length = [self length];
115+
116+
// Read a byte off of each VM page to force the kernel to page in the data
117+
for (NSUInteger i = 0; i < length; i += pageSize) {
118+
*((volatile uint8_t *)bytes + i);
119+
}
120+
}
121+
111122
@end

0 commit comments

Comments
 (0)