Skip to content

Commit 0071cb2

Browse files
authored
Merge pull request #4 from SDWebImage/project_compatible_sdwebimage
Update to fix the compatible with SDWebImage 5.4.0
2 parents 094ce6e + c6ddebf commit 0071cb2

File tree

7 files changed

+132
-62
lines changed

7 files changed

+132
-62
lines changed

Cartfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
github "SDWebImage/SDWebImage" ~> 5.0
1+
github "SDWebImage/SDWebImage" ~> 5.4
22
github "ibireme/YYCache" ~> 1.0
33
github "ibireme/YYImage" ~> 1.0

Cartfile.resolved

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
github "SDWebImage/SDWebImage" "5.0.0"
1+
github "SDWebImage/SDWebImage" "5.4.0"
22
github "ibireme/YYCache" "1.0.4"
33
github "ibireme/YYImage" "1.0.4"

Example/Podfile.lock

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
PODS:
22
- Expecta (1.0.6)
3-
- SDWebImage/Core (5.0.2)
4-
- SDWebImageYYPlugin (0.2.0):
5-
- SDWebImage/Core (~> 5.0)
6-
- SDWebImageYYPlugin/YYCache (= 0.2.0)
7-
- SDWebImageYYPlugin/YYImage (= 0.2.0)
8-
- SDWebImageYYPlugin/YYCache (0.2.0):
9-
- SDWebImage/Core (~> 5.0)
3+
- SDWebImage/Core (5.4.0)
4+
- SDWebImageYYPlugin (0.3.0):
5+
- SDWebImage/Core (~> 5.4)
6+
- SDWebImageYYPlugin/YYCache (= 0.3.0)
7+
- SDWebImageYYPlugin/YYImage (= 0.3.0)
8+
- SDWebImageYYPlugin/YYCache (0.3.0):
9+
- SDWebImage/Core (~> 5.4)
1010
- YYCache
11-
- SDWebImageYYPlugin/YYImage (0.2.0):
12-
- SDWebImage/Core (~> 5.0)
11+
- SDWebImageYYPlugin/YYImage (0.3.0):
12+
- SDWebImage/Core (~> 5.4)
1313
- YYImage/Core
1414
- YYCache (1.0.4)
1515
- YYImage/Core (1.0.4)
@@ -22,7 +22,7 @@ DEPENDENCIES:
2222
- YYImage/WebP
2323

2424
SPEC REPOS:
25-
https://github.com/cocoapods/specs.git:
25+
trunk:
2626
- Expecta
2727
- SDWebImage
2828
- YYCache
@@ -34,11 +34,11 @@ EXTERNAL SOURCES:
3434

3535
SPEC CHECKSUMS:
3636
Expecta: 3b6bd90a64b9a1dcb0b70aa0e10a7f8f631667d5
37-
SDWebImage: 6764b5fa0f73c203728052955dbefa2bf1f33282
38-
SDWebImageYYPlugin: 3398b1f1016cd30d8fdb857226c254a0da8b1a11
37+
SDWebImage: 5bf6aec6481ae2a062bdc59f9d6c1d1e552090e0
38+
SDWebImageYYPlugin: f6c1af162fb075efe5918d8caedee1f3d17c197e
3939
YYCache: 8105b6638f5e849296c71f331ff83891a4942952
4040
YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54
4141

4242
PODFILE CHECKSUM: 32dbc66eefdcad7b9f59a52aa756b4f862c6b1c4
4343

44-
COCOAPODS: 1.6.1
44+
COCOAPODS: 1.8.4

Example/SDWebImageYYPlugin/SDViewController.m

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,16 @@ - (void)viewDidLoad
2525
SDWebImageManager.defaultImageCache = [[YYCache alloc] initWithName:@"YYCache"];
2626

2727
[self.view addSubview:self.imageView];
28+
[SDWebImageManager.sharedManager.imageCache clearWithCacheType:SDImageCacheTypeAll completion:nil];
29+
SDWebImageManager.sharedManager.cacheSerializer = [SDWebImageCacheSerializer cacheSerializerWithBlock:^NSData * _Nullable(UIImage * _Nonnull image, NSData * _Nullable data, NSURL * _Nullable imageURL) {
30+
image.sd_extendedObject = @"Extended Data Here";
31+
return data;
32+
}];
2833

2934
NSURL *url = [NSURL URLWithString:@"http://apng.onevcat.com/assets/elephant.png"];
3035
[self.imageView sd_setImageWithURL:url completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
31-
NSLog(@"%@", error);
36+
NSString *extentedObject = (NSString *)image.sd_extendedObject;
37+
NSLog(@"%@", extentedObject);
3238
}];
3339
}
3440

SDWebImageYYPlugin.podspec

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
Pod::Spec.new do |s|
1010
s.name = 'SDWebImageYYPlugin'
11-
s.version = '0.2.1'
11+
s.version = '0.3.0'
1212
s.summary = 'A SDWebImage plugin to integrate YYImage & YYCache for image rendering & caching.'
1313

1414
# This description is used to generate tags and improve search results.
@@ -22,18 +22,16 @@ TODO: Add long description of the pod here.
2222
DESC
2323

2424
s.homepage = 'https://github.com/SDWebImage/SDWebImageYYPlugin'
25-
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
2625
s.license = { :type => 'MIT', :file => 'LICENSE' }
2726
s.author = { 'DreamPiggy' => '[email protected]' }
2827
s.source = { :git => 'https://github.com/SDWebImage/SDWebImageYYPlugin.git', :tag => s.version.to_s }
29-
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
3028

3129
s.ios.deployment_target = '8.0'
3230

3331
s.source_files = 'SDWebImageYYPlugin/Module/SDWebImageYYPlugin.h'
3432
s.module_map = 'SDWebImageYYPlugin/Module/SDWebImageYYPlugin.modulemap'
3533

36-
s.dependency 'SDWebImage/Core', '~> 5.0'
34+
s.dependency 'SDWebImage/Core', '~> 5.4'
3735

3836
s.subspec 'YYCache' do |ss|
3937
ss.dependency 'YYCache'

SDWebImageYYPlugin/Classes/YYCache/YYCacheBridge/YYCache+SDAdditions.m

Lines changed: 96 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,35 @@ @implementation YYCache (SDAdditions)
3636
return nil;
3737
}
3838

39-
if ([context valueForKey:SDWebImageContextImageTransformer]) {
39+
id<SDImageTransformer> transformer = context[SDWebImageContextImageTransformer];
40+
if (transformer) {
4041
// grab the transformed disk image if transformer provided
41-
id<SDImageTransformer> transformer = [context valueForKey:SDWebImageContextImageTransformer];
4242
NSString *transformerKey = [transformer transformerKey];
4343
key = SDTransformedKeyForKey(key, transformerKey);
4444
}
4545

4646
// First check the in-memory cache...
4747
UIImage *image = [self.memoryCache objectForKey:key];
4848

49-
if ((options & SDImageCacheDecodeFirstFrameOnly) && image.sd_isAnimated) {
49+
if (image) {
50+
if (options & SDImageCacheDecodeFirstFrameOnly) {
51+
// Ensure static image
52+
Class animatedImageClass = image.class;
53+
if (image.sd_isAnimated || ([animatedImageClass isSubclassOfClass:[UIImage class]] && [animatedImageClass conformsToProtocol:@protocol(SDAnimatedImage)])) {
5054
#if SD_MAC
51-
image = [[NSImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:kCGImagePropertyOrientationUp];
55+
image = [[NSImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:kCGImagePropertyOrientationUp];
5256
#else
53-
image = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:image.imageOrientation];
57+
image = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:image.imageOrientation];
5458
#endif
59+
}
60+
} else if (options & SDImageCacheMatchAnimatedImageClass) {
61+
// Check image class matching
62+
Class animatedImageClass = image.class;
63+
Class desiredImageClass = context[SDWebImageContextAnimatedImageClass];
64+
if (desiredImageClass && ![animatedImageClass isSubclassOfClass:desiredImageClass]) {
65+
image = nil;
66+
}
67+
}
5568
}
5669

5770
BOOL shouldQueryMemoryOnly = (image && !(options & SDImageCacheQueryMemoryData));
@@ -69,22 +82,48 @@ @implementation YYCache (SDAdditions)
6982
// 2. in-memory cache miss & diskDataSync
7083
BOOL shouldQueryDiskSync = ((image && options & SDImageCacheQueryMemoryDataSync) ||
7184
(!image && options & SDImageCacheQueryDiskDataSync));
72-
void(^queryDiskBlock)(NSData *) = ^(NSData *diskData){
85+
void(^queryDiskBlock)(NSData *) = ^(NSData *diskData) {
7386
if (operation.isCancelled) {
74-
// do not call the completion if cancelled
87+
if (doneBlock) {
88+
doneBlock(nil, nil, SDImageCacheTypeNone);
89+
}
7590
return;
7691
}
7792

7893
@autoreleasepool {
7994
UIImage *diskImage;
80-
SDImageCacheType cacheType = SDImageCacheTypeDisk;
95+
SDImageCacheType cacheType = SDImageCacheTypeNone;
8196
if (image) {
8297
// the image is from in-memory cache, but need image data
8398
diskImage = image;
8499
cacheType = SDImageCacheTypeMemory;
85100
} else if (diskData) {
101+
cacheType = SDImageCacheTypeDisk;
86102
// decode image data only if in-memory cache missed
87103
diskImage = SDImageCacheDecodeImageData(diskData, key, options, context);
104+
if (diskImage) {
105+
// Check extended data
106+
NSData *extendedData = [YYDiskCache getExtendedDataFromObject:diskData];
107+
if (extendedData) {
108+
id extendedObject;
109+
if (@available(iOS 11, tvOS 11, macOS 10.13, watchOS 4, *)) {
110+
NSError *error;
111+
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:extendedData error:&error];
112+
unarchiver.requiresSecureCoding = NO;
113+
extendedObject = [unarchiver decodeTopLevelObjectForKey:NSKeyedArchiveRootObjectKey error:&error];
114+
if (error) {
115+
NSLog(@"NSKeyedUnarchiver unarchive failed with error: %@", error);
116+
}
117+
} else {
118+
@try {
119+
extendedObject = [NSKeyedUnarchiver unarchiveObjectWithData:extendedData];
120+
} @catch (NSException *exception) {
121+
NSLog(@"NSKeyedUnarchiver unarchive failed with exception: %@", exception);
122+
}
123+
}
124+
diskImage.sd_extendedObject = extendedObject;
125+
}
126+
}
88127
if (diskImage) {
89128
NSUInteger cost = diskImage.sd_memoryCost;
90129
[self.memoryCache setObject:diskImage forKey:key cost:cost];
@@ -108,7 +147,7 @@ @implementation YYCache (SDAdditions)
108147
queryDiskBlock(diskData);
109148
} else {
110149
// YYDiskCache's completion block is called in the global queue
111-
[self.diskCache objectForKey:key withBlock:^(NSString * _Nonnull key, NSObject<NSCoding> * _Nullable object) {
150+
[self.diskCache objectForKey:key withBlock:^(NSString * _Nonnull key, id<NSObject, NSCoding> _Nullable object) {
112151
NSData *diskData = nil;
113152
if ([object isKindOfClass:[NSData class]]) {
114153
diskData = (NSData *)object;
@@ -120,6 +159,49 @@ @implementation YYCache (SDAdditions)
120159
return operation;
121160
}
122161

162+
- (void)storeImageToDisk:(UIImage *)image imageData:(NSData *)imageData forKey:(NSString *)key completion:(SDWebImageNoParamsBlock)completionBlock {
163+
NSData *data = SDYYPluginCacheDataWithImageData(image, imageData);
164+
if (!data) {
165+
// SDImageCache does not remove object if `data` is nil
166+
if (completionBlock) {
167+
dispatch_async(dispatch_get_main_queue(), ^{
168+
completionBlock();
169+
});
170+
}
171+
return;
172+
}
173+
if (image) {
174+
// Check extended data
175+
id extendedObject = image.sd_extendedObject;
176+
if ([extendedObject conformsToProtocol:@protocol(NSCoding)]) {
177+
NSData *extendedData;
178+
if (@available(iOS 11, tvOS 11, macOS 10.13, watchOS 4, *)) {
179+
NSError *error;
180+
extendedData = [NSKeyedArchiver archivedDataWithRootObject:extendedObject requiringSecureCoding:NO error:&error];
181+
if (error) {
182+
NSLog(@"NSKeyedArchiver archive failed with error: %@", error);
183+
}
184+
} else {
185+
@try {
186+
extendedData = [NSKeyedArchiver archivedDataWithRootObject:extendedObject];
187+
} @catch (NSException *exception) {
188+
NSLog(@"NSKeyedArchiver archive failed with exception: %@", exception);
189+
}
190+
}
191+
if (extendedData) {
192+
[YYDiskCache setExtendedData:extendedData toObject:data];
193+
}
194+
}
195+
}
196+
[self.diskCache setObject:data forKey:key withBlock:^{
197+
if (completionBlock) {
198+
dispatch_async(dispatch_get_main_queue(), ^{
199+
completionBlock();
200+
});
201+
}
202+
}];
203+
}
204+
123205
- (void)storeImage:(UIImage *)image imageData:(NSData *)imageData forKey:(NSString *)key cacheType:(SDImageCacheType)cacheType completion:(SDWebImageNoParamsBlock)completionBlock {
124206
switch (cacheType) {
125207
case SDImageCacheTypeNone: {
@@ -131,49 +213,22 @@ - (void)storeImage:(UIImage *)image imageData:(NSData *)imageData forKey:(NSStri
131213
case SDImageCacheTypeMemory: {
132214
NSUInteger cost = image.sd_memoryCost;
133215
[self.memoryCache setObject:image forKey:key cost:cost];
216+
if (completionBlock) {
217+
completionBlock();
218+
}
134219
}
135220
break;
136221
case SDImageCacheTypeDisk: {
137222
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
138-
NSData *data = SDYYPluginCacheDataWithImageData(image, imageData);
139-
if (!data) {
140-
// SDImageCache does not remove object if `data` is nil
141-
if (completionBlock) {
142-
dispatch_async(dispatch_get_main_queue(), ^{
143-
completionBlock();
144-
});
145-
}
146-
}
147-
[self.diskCache setObject:data forKey:key withBlock:^{
148-
if (completionBlock) {
149-
dispatch_async(dispatch_get_main_queue(), ^{
150-
completionBlock();
151-
});
152-
}
153-
}];
223+
[self storeImageToDisk:image imageData:imageData forKey:key completion:completionBlock];
154224
});
155225
}
156226
break;
157227
case SDImageCacheTypeAll: {
158228
NSUInteger cost = image.sd_memoryCost;
159229
[self.memoryCache setObject:image forKey:key cost:cost];
160230
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
161-
NSData *data = SDYYPluginCacheDataWithImageData(image, imageData);
162-
if (!data) {
163-
// SDImageCache does not remove object if `data` is nil
164-
if (completionBlock) {
165-
dispatch_async(dispatch_get_main_queue(), ^{
166-
completionBlock();
167-
});
168-
}
169-
}
170-
[self.diskCache setObject:data forKey:key withBlock:^{
171-
if (completionBlock) {
172-
dispatch_async(dispatch_get_main_queue(), ^{
173-
completionBlock();
174-
});
175-
}
176-
}];
231+
[self storeImageToDisk:image imageData:imageData forKey:key completion:completionBlock];
177232
});
178233
}
179234
break;

SDWebImageYYPlugin/Classes/YYCache/YYCacheBridge/YYDiskCache+SDAdditions.m

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ - (BOOL)containsDataForKey:(NSString *)key {
4242
}
4343

4444
- (NSData *)dataForKey:(NSString *)key {
45-
NSObject<NSCoding> *object = (NSObject<NSCoding> *)[self objectForKey:key];
45+
id<NSObject, NSCoding> object = [self objectForKey:key];
4646
if ([object isKindOfClass:[NSData class]]) {
4747
return (NSData *)object;
4848
} else {
@@ -58,6 +58,17 @@ - (void)setData:(NSData *)data forKey:(NSString *)key {
5858
[self setObject:data forKey:key];
5959
}
6060

61+
- (NSData *)extendedDataForKey:(NSString *)key {
62+
id<NSObject, NSCoding> object = [self objectForKey:key];
63+
return [self.class getExtendedDataFromObject:object];
64+
}
65+
66+
- (void)setExtendedData:(NSData *)extendedData forKey:(NSString *)key {
67+
id<NSObject, NSCoding> object = [self objectForKey:key];
68+
[self.class setExtendedData:nil toObject:object];
69+
[self setObject:object forKey:key];
70+
}
71+
6172
- (void)removeDataForKey:(NSString *)key {
6273
[self removeObjectForKey:key];
6374
}

0 commit comments

Comments
 (0)