Skip to content

Commit 2a8e71d

Browse files
committed
Store the entire metadata into extended data, filter the extra data to reduce archive size because we already cache the image in disk cache.
1 parent c315c30 commit 2a8e71d

2 files changed

Lines changed: 27 additions & 12 deletions

File tree

SDWebImageLinkPlugin/Classes/LPLinkView+WebCache.m

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,14 @@ - (void)sd_setImageWithURL:(nullable NSURL *)url
6565
if (metadata) {
6666
// Already exist
6767
} else if (image) {
68-
// Re-generate the metadata from local information
69-
metadata = [[LPLinkMetadata alloc] init];
70-
metadata.originalURL = url;
71-
metadata.URL = imageURL;
7268
NSData *extendedData = image.sd_extendedData;
69+
// Re-generate the metadata from local information
7370
if (extendedData) {
74-
NSString *title = [[NSString alloc] initWithData:extendedData encoding:NSUTF8StringEncoding];
75-
if (title.length > 0) {
76-
metadata.title = title;
77-
}
71+
metadata = [NSKeyedUnarchiver unarchivedObjectOfClass:LPLinkMetadata.class fromData:extendedData error:nil];
72+
} else {
73+
metadata = [[LPLinkMetadata alloc] init];
74+
metadata.originalURL = url;
75+
metadata.URL = imageURL;
7876
}
7977
// LPLinkMetadata.imageProvider on iOS 13.1 contains bug which cause async query, and not compatible for cell-reusing. Radar FB7462933
8078
id<LPImageProtocol> linkImage = [[NSClassFromString(LPImageClass) alloc] initWithPlatformImage:image];

SDWebImageLinkPlugin/Classes/SDImageLinkLoader.m

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,11 @@ - (void)fetchImageDataWithProvider:(NSItemProvider *)imageProvider operation:(SD
155155
if (!image) {
156156
error = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:nil];
157157
} else {
158-
LPLinkMetadata *metadata = url.sd_linkMetadata;
159-
image.sd_extendedData = [metadata.title dataUsingEncoding:NSUTF8StringEncoding];
158+
// The original metadata contains image data and is large, we pick the metadata info only to avoid double cache of image
159+
LPLinkMetadata *metadata = [self.class strippedMetadata:url.sd_linkMetadata];
160+
// Save the metadata to extended data
161+
NSData *extendedData = [NSKeyedArchiver archivedDataWithRootObject:metadata requiringSecureCoding:YES error:nil];
162+
image.sd_extendedData = extendedData;
160163
}
161164
if (completedBlock) {
162165
dispatch_main_async_safe(^{
@@ -196,8 +199,11 @@ - (void)fetchImageWithProvider:(NSItemProvider *)imageProvider operation:(SDImag
196199
if (!image) {
197200
error = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:nil];
198201
} else {
199-
LPLinkMetadata *metadata = url.sd_linkMetadata;
200-
image.sd_extendedData = [metadata.title dataUsingEncoding:NSUTF8StringEncoding];
202+
// The original metadata contains image data and is large, we pick the metadata info only to avoid double cache of image
203+
LPLinkMetadata *metadata = [self.class strippedMetadata:url.sd_linkMetadata];
204+
// Save the metadata to extended data
205+
NSData *extendedData = [NSKeyedArchiver archivedDataWithRootObject:metadata requiringSecureCoding:YES error:nil];
206+
image.sd_extendedData = extendedData;
201207
}
202208
if (completedBlock) {
203209
dispatch_main_async_safe(^{
@@ -220,6 +226,17 @@ - (BOOL)shouldBlockFailedURLWithURL:(NSURL *)url error:(NSError *)error {
220226
return shouldBlockFailedURL;
221227
}
222228

229+
#pragma mark - Util
230+
+ (LPLinkMetadata *)strippedMetadata:(LPLinkMetadata *)originalMetadata {
231+
NSCParameterAssert(originalMetadata);
232+
LPLinkMetadata *metadata = [LPLinkMetadata new];
233+
metadata.URL = originalMetadata.URL;
234+
metadata.originalURL = originalMetadata.originalURL;
235+
metadata.title = originalMetadata.title;
236+
metadata.remoteVideoURL = originalMetadata.remoteVideoURL;
237+
return metadata;
238+
}
239+
223240
#pragma mark - KVO
224241

225242
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

0 commit comments

Comments
 (0)