Skip to content

Commit abe1290

Browse files
committed
Change the design, do not bind anything on the NSURL. Just pass the metadata as context option, to simplify the issue of weak reference
1 parent 7aef24a commit abe1290

8 files changed

Lines changed: 21 additions & 74 deletions

File tree

SDWebImageLinkPlugin.xcodeproj/project.pbxproj

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,12 @@
1010
3253E0BB2387DCB2007ACAD8 /* SDWebImageLinkPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 3253E0B92387DCB2007ACAD8 /* SDWebImageLinkPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; };
1111
3253E0CB2387E6B4007ACAD8 /* SDImageLinkLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 3253E0C22387E6B4007ACAD8 /* SDImageLinkLoader.m */; };
1212
3253E0CC2387E6B4007ACAD8 /* SDWebImageLinkDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 3253E0C32387E6B4007ACAD8 /* SDWebImageLinkDefine.m */; };
13-
3253E0CE2387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 3253E0C52387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; };
1413
3253E0CF2387E6B4007ACAD8 /* SDWebImageLinkError.h in Headers */ = {isa = PBXBuildFile; fileRef = 3253E0C62387E6B4007ACAD8 /* SDWebImageLinkError.h */; settings = {ATTRIBUTES = (Public, ); }; };
1514
3253E0D02387E6B4007ACAD8 /* SDImageLinkLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3253E0C72387E6B4007ACAD8 /* SDImageLinkLoader.h */; settings = {ATTRIBUTES = (Public, ); }; };
16-
3253E0D12387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 3253E0C82387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.m */; };
1715
3253E0D22387E6B4007ACAD8 /* SDWebImageLinkDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 3253E0C92387E6B4007ACAD8 /* SDWebImageLinkDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
1816
3253E0D32387E6B4007ACAD8 /* SDWebImageLinkError.m in Sources */ = {isa = PBXBuildFile; fileRef = 3253E0CA2387E6B4007ACAD8 /* SDWebImageLinkError.m */; };
1917
3253E0D62387E8C5007ACAD8 /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3253E0D52387E8C5007ACAD8 /* SDWebImage.framework */; };
2018
3253E0E72387E900007ACAD8 /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3253E0E62387E900007ACAD8 /* SDWebImage.framework */; };
21-
3253E0EA2387E94D007ACAD8 /* NSURL+SDWebImageLinkPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 3253E0C52387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; };
22-
3253E0EB2387E94D007ACAD8 /* NSURL+SDWebImageLinkPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 3253E0C82387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.m */; };
2319
3253E0EC2387E94D007ACAD8 /* SDImageLinkLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3253E0C72387E6B4007ACAD8 /* SDImageLinkLoader.h */; settings = {ATTRIBUTES = (Public, ); }; };
2420
3253E0ED2387E94D007ACAD8 /* SDImageLinkLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 3253E0C22387E6B4007ACAD8 /* SDImageLinkLoader.m */; };
2521
3253E0EE2387E94D007ACAD8 /* SDWebImageLinkDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 3253E0C92387E6B4007ACAD8 /* SDWebImageLinkDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -43,10 +39,8 @@
4339
3253E0BA2387DCB2007ACAD8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Module/Info.plist; sourceTree = "<group>"; };
4440
3253E0C22387E6B4007ACAD8 /* SDImageLinkLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDImageLinkLoader.m; sourceTree = "<group>"; };
4541
3253E0C32387E6B4007ACAD8 /* SDWebImageLinkDefine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageLinkDefine.m; sourceTree = "<group>"; };
46-
3253E0C52387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSURL+SDWebImageLinkPlugin.h"; sourceTree = "<group>"; };
4742
3253E0C62387E6B4007ACAD8 /* SDWebImageLinkError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageLinkError.h; sourceTree = "<group>"; };
4843
3253E0C72387E6B4007ACAD8 /* SDImageLinkLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDImageLinkLoader.h; sourceTree = "<group>"; };
49-
3253E0C82387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSURL+SDWebImageLinkPlugin.m"; sourceTree = "<group>"; };
5044
3253E0C92387E6B4007ACAD8 /* SDWebImageLinkDefine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDWebImageLinkDefine.h; sourceTree = "<group>"; };
5145
3253E0CA2387E6B4007ACAD8 /* SDWebImageLinkError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDWebImageLinkError.m; sourceTree = "<group>"; };
5246
3253E0D52387E8C5007ACAD8 /* SDWebImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDWebImage.framework; path = Carthage/Build/iOS/SDWebImage.framework; sourceTree = "<group>"; };
@@ -113,8 +107,6 @@
113107
3253E12E23882AD5007ACAD8 /* LPLinkView+WebCache.m */,
114108
3253E1252387EDE7007ACAD8 /* NSImage+SDWebImageLinkPlugin.h */,
115109
3253E1242387EDE7007ACAD8 /* NSImage+SDWebImageLinkPlugin.m */,
116-
3253E0C52387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.h */,
117-
3253E0C82387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.m */,
118110
3253E0C72387E6B4007ACAD8 /* SDImageLinkLoader.h */,
119111
3253E0C22387E6B4007ACAD8 /* SDImageLinkLoader.m */,
120112
3253E0C92387E6B4007ACAD8 /* SDWebImageLinkDefine.h */,
@@ -143,7 +135,6 @@
143135
files = (
144136
3253E1282387EDE7007ACAD8 /* NSImage+SDWebImageLinkPlugin.h in Headers */,
145137
3253E0D02387E6B4007ACAD8 /* SDImageLinkLoader.h in Headers */,
146-
3253E0CE2387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.h in Headers */,
147138
3253E0D22387E6B4007ACAD8 /* SDWebImageLinkDefine.h in Headers */,
148139
3253E13223882AD5007ACAD8 /* LPLinkView+WebCache.h in Headers */,
149140
3253E0BB2387DCB2007ACAD8 /* SDWebImageLinkPlugin.h in Headers */,
@@ -158,7 +149,6 @@
158149
3253E1292387EDE7007ACAD8 /* NSImage+SDWebImageLinkPlugin.h in Headers */,
159150
3253E0EE2387E94D007ACAD8 /* SDWebImageLinkDefine.h in Headers */,
160151
3253E0EC2387E94D007ACAD8 /* SDImageLinkLoader.h in Headers */,
161-
3253E0EA2387E94D007ACAD8 /* NSURL+SDWebImageLinkPlugin.h in Headers */,
162152
3253E13323882AD5007ACAD8 /* LPLinkView+WebCache.h in Headers */,
163153
3253E0F02387E94D007ACAD8 /* SDWebImageLinkError.h in Headers */,
164154
3253E0F22387E951007ACAD8 /* SDWebImageLinkPlugin.h in Headers */,
@@ -267,7 +257,6 @@
267257
3253E13023882AD5007ACAD8 /* LPLinkView+WebCache.m in Sources */,
268258
3253E1262387EDE7007ACAD8 /* NSImage+SDWebImageLinkPlugin.m in Sources */,
269259
3253E0CB2387E6B4007ACAD8 /* SDImageLinkLoader.m in Sources */,
270-
3253E0D12387E6B4007ACAD8 /* NSURL+SDWebImageLinkPlugin.m in Sources */,
271260
);
272261
runOnlyForDeploymentPostprocessing = 0;
273262
};
@@ -276,7 +265,6 @@
276265
buildActionMask = 2147483647;
277266
files = (
278267
3253E0F12387E94D007ACAD8 /* SDWebImageLinkError.m in Sources */,
279-
3253E0EB2387E94D007ACAD8 /* NSURL+SDWebImageLinkPlugin.m in Sources */,
280268
3253E13123882AD5007ACAD8 /* LPLinkView+WebCache.m in Sources */,
281269
3253E1272387EDE7007ACAD8 /* NSImage+SDWebImageLinkPlugin.m in Sources */,
282270
3253E0EF2387E94D007ACAD8 /* SDWebImageLinkDefine.m in Sources */,

SDWebImageLinkPlugin/Classes/LPLinkView+WebCache.m

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
*/
88

99
#import "LPLinkView+WebCache.h"
10-
#import "NSURL+SDWebImageLinkPlugin.h"
11-
#import "NSImage+SDWebImageLinkPlugin.h"
10+
#import "SDWebImageLinkDefine.h"
1211

1312
#define LPImageClass @"LPImage"
1413
@protocol LPImageProtocol <NSObject>
@@ -61,7 +60,7 @@ - (void)sd_setImageWithURL:(nullable NSURL *)url
6160
__weak typeof(self) wself = self;
6261
[self sd_internalSetImageWithURL:url placeholderImage:placeholder options:options context:context setImageBlock:^(UIImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
6362
__strong typeof(self) sself = wself;
64-
LPLinkMetadata *metadata = imageURL.sd_linkMetadata;
63+
LPLinkMetadata *metadata = context[SDWebImageContextLinkMetadata];
6564
if (metadata) {
6665
// Already exist
6766
} else if (image) {

SDWebImageLinkPlugin/Classes/NSURL+SDWebImageLinkPlugin.h

Lines changed: 0 additions & 17 deletions
This file was deleted.

SDWebImageLinkPlugin/Classes/NSURL+SDWebImageLinkPlugin.m

Lines changed: 0 additions & 28 deletions
This file was deleted.

SDWebImageLinkPlugin/Classes/SDImageLinkLoader.m

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#import "SDWebImageLinkDefine.h"
1111
#import "SDWebImageLinkError.h"
1212
#import "NSImage+SDWebImageLinkPlugin.h"
13-
#import "NSURL+SDWebImageLinkPlugin.h"
1413
#import <LinkPresentation/LinkPresentation.h>
1514
#if SD_UIKIT
1615
#import <MobileCoreServices/MobileCoreServices.h>
@@ -75,7 +74,7 @@ - (BOOL)canRequestImageForURL:(NSURL *)url {
7574
- (id<SDWebImageOperation>)requestImageWithURL:(NSURL *)url options:(SDWebImageOptions)options context:(SDWebImageContext *)context progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDImageLoaderCompletedBlock)completedBlock {
7675
SDImageLinkLoaderOperation *operation = [SDImageLinkLoaderOperation new];
7776
// Let's check wether input URL already have an associated LPLinkMetadata
78-
LPLinkMetadata *metadata = url.sd_linkMetadata;
77+
LPLinkMetadata *metadata = context[SDWebImageContextLinkMetadata];
7978
if (metadata) {
8079
[self fetchImageWithMetadata:metadata operation:operation url:url options:options context:context progress:progressBlock completed:completedBlock];
8180
} else {
@@ -85,12 +84,12 @@ - (BOOL)canRequestImageForURL:(NSURL *)url {
8584
[provider startFetchingMetadataForURL:url completionHandler:^(LPLinkMetadata * _Nullable metadata, NSError * _Nullable error) {
8685
if (error) {
8786
if (completedBlock) {
88-
completedBlock(nil, nil, error, YES);
87+
dispatch_main_async_safe(^{
88+
completedBlock(nil, nil, error, YES);
89+
});
8990
}
9091
return;
9192
}
92-
// Associated the link metadata to URL, weak reference
93-
url.sd_linkMetadata = metadata;
9493
[self fetchImageWithMetadata:metadata operation:operation url:url options:options context:context progress:progressBlock completed:completedBlock];
9594
}];
9695
operation.provider = provider;
@@ -121,15 +120,15 @@ - (void)fetchImageWithMetadata:(LPLinkMetadata *)metadata operation:(SDImageLink
121120
}
122121
if (requestData) {
123122
// Request the image data and decode
124-
[self fetchImageDataWithProvider:imageProvider operation:operation url:url options:options context:context progress:progressBlock completed:completedBlock];
123+
[self fetchImageDataWithProvider:imageProvider metadata:metadata operation:operation url:url options:options context:context progress:progressBlock completed:completedBlock];
125124
} else {
126125
// Only request the image object, faster
127-
[self fetchImageWithProvider:imageProvider operation:operation url:url progress:progressBlock completed:completedBlock];
126+
[self fetchImageWithProvider:imageProvider metadata:metadata operation:operation url:url progress:progressBlock completed:completedBlock];
128127
}
129128
}
130129

131130
// Fetch image and data with `loadDataRepresentationForTypeIdentifier` API
132-
- (void)fetchImageDataWithProvider:(NSItemProvider *)imageProvider operation:(SDImageLinkLoaderOperation *)operation url:(NSURL *)url options:(SDWebImageOptions)options context:(SDWebImageContext *)context progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDImageLoaderCompletedBlock)completedBlock {
131+
- (void)fetchImageDataWithProvider:(NSItemProvider *)imageProvider metadata:(LPLinkMetadata *)metadata operation:(SDImageLinkLoaderOperation *)operation url:(NSURL *)url options:(SDWebImageOptions)options context:(SDWebImageContext *)context progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDImageLoaderCompletedBlock)completedBlock {
133132
SDImageLinkLoaderContext *loaderContext = [SDImageLinkLoaderContext new];
134133
loaderContext.url = url;
135134
loaderContext.progressBlock = progressBlock;
@@ -156,9 +155,9 @@ - (void)fetchImageDataWithProvider:(NSItemProvider *)imageProvider operation:(SD
156155
error = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:nil];
157156
} else {
158157
// 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];
158+
LPLinkMetadata *strippedMetadata = [self.class strippedMetadata:metadata];
160159
// Save the metadata to extended data
161-
image.sd_extendedObject = metadata;
160+
image.sd_extendedObject = strippedMetadata;
162161
}
163162
if (completedBlock) {
164163
dispatch_main_async_safe(^{
@@ -173,7 +172,7 @@ - (void)fetchImageDataWithProvider:(NSItemProvider *)imageProvider operation:(SD
173172
}
174173

175174
// Fetch image with `loadObjectOfClass` API
176-
- (void)fetchImageWithProvider:(NSItemProvider *)imageProvider operation:(SDImageLinkLoaderOperation *)operation url:(NSURL *)url progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDImageLoaderCompletedBlock)completedBlock {
175+
- (void)fetchImageWithProvider:(NSItemProvider *)imageProvider metadata:(LPLinkMetadata *)metadata operation:(SDImageLinkLoaderOperation *)operation url:(NSURL *)url progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDImageLoaderCompletedBlock)completedBlock {
177176
SDImageLinkLoaderContext *loaderContext = [SDImageLinkLoaderContext new];
178177
loaderContext.url = url;
179178
loaderContext.progressBlock = progressBlock;
@@ -199,9 +198,9 @@ - (void)fetchImageWithProvider:(NSItemProvider *)imageProvider operation:(SDImag
199198
error = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:nil];
200199
} else {
201200
// The original metadata contains image data and is large, we pick the metadata info only to avoid double cache of image
202-
LPLinkMetadata *metadata = [self.class strippedMetadata:url.sd_linkMetadata];
201+
LPLinkMetadata *strippedMetadata = [self.class strippedMetadata:metadata];
203202
// Save the metadata to extended data
204-
image.sd_extendedObject = metadata;
203+
image.sd_extendedObject = strippedMetadata;
205204
}
206205
if (completedBlock) {
207206
dispatch_main_async_safe(^{

SDWebImageLinkPlugin/Classes/SDWebImageLinkDefine.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88

99
@import SDWebImage;
1010

11+
/**
12+
A `LPLinkMetadata` object used to fetch image/icon for website. If you provide this value, we don't use `LPMetadataProvider` to fetch the website's metadata again, directlly use your prefetched metadata instead.
13+
@note If the provided `LPLinkMetadata` does not have any `imageProvider` or `iconProvider`, a error with code `SDWebImageLinkErrorNoImageProvider` will be returned. (`LPLinkMetadata`)
14+
*/
15+
FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextLinkMetadata;
16+
1117
/**
1218
A Bool value specify whether or not, to request the metadata's image, with the Data representation. But default we do not keep data by using `loadObjectOfClass` API. If enable, we'll use `loadDataRepresentationForTypeIdentifier` API instead, and decode the data into image object.
1319
@note Current implementation, LinkPresentation can retrive UIImage object 5x faster than the Data, so by default, we only request the image object witthout data. But it depends on your own usage, you can trun this on. (NSNumber *)

SDWebImageLinkPlugin/Classes/SDWebImageLinkDefine.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88

99
#import "SDWebImageLinkDefine.h"
1010

11+
SDWebImageContextOption _Nonnull const SDWebImageContextLinkMetadata = @"linkMetadata";
1112
SDWebImageContextOption _Nonnull const SDWebImageContextLinkRequestImageData = @"linkRequestImageData";

SDWebImageLinkPlugin/Module/SDWebImageLinkPlugin.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,5 @@ FOUNDATION_EXPORT const unsigned char SDWebImageLinkPluginVersionString[];
1919
#import <SDWebImageLinkPlugin/SDImageLinkLoader.h>
2020
#import <SDWebImageLinkPlugin/SDWebImageLinkDefine.h>
2121
#import <SDWebImageLinkPlugin/SDWebImageLinkError.h>
22-
#import <SDWebImageLinkPlugin/NSURL+SDWebImageLinkPlugin.h>
2322
#import <SDWebImageLinkPlugin/NSImage+SDWebImageLinkPlugin.h>
2423
#import <SDWebImageLinkPlugin/LPLinkView+WebCache.h>

0 commit comments

Comments
 (0)