Commit ca5150a01ffcf8352d8c4b68a87d15b55f41eff4

Authored by liushiyu
1 parent 32c18d0c

3.1.1

Showing 84 changed files with 3468 additions and 1922 deletions
Example/Podfile
1 1 use_frameworks!
2 2 inhibit_all_warnings!
3 3  
4   -platform :ios, '8.0'
  4 +platform :ios, '9.0'
5 5  
6 6 target 'YBImageBrowser_DSCnliveShop_Example' do
7 7 pod 'YBImageBrowser_DSCnliveShop', :path => '../'
... ... @@ -9,8 +9,8 @@ target 'YBImageBrowser_DSCnliveShop_Example' do
9 9 target 'YBImageBrowser_DSCnliveShop_Tests' do
10 10 inherit! :search_paths
11 11  
12   - pod 'SDWebImage', '~> 5.2.3'
13   - pod 'YYKit', '1.0.9'
  12 + pod 'SDWebImage'
  13 + pod 'YYKit'
14 14  
15 15 end
16 16 end
... ...
Example/Podfile.lock
1 1 PODS:
2   - - SDWebImage (5.2.5):
3   - - SDWebImage/Core (= 5.2.5)
4   - - SDWebImage/Core (5.2.5)
5   - - YBImageBrowser_DSCnliveShop (3.0.9):
6   - - SDWebImage (~> 5.2.3)
7   - - YYKit (= 1.0.9)
  2 + - SDWebImage (5.8.4):
  3 + - SDWebImage/Core (= 5.8.4)
  4 + - SDWebImage/Core (5.8.4)
  5 + - YBImageBrowser_DSCnliveShop (3.1.0):
  6 + - SDWebImage
  7 + - YYKit
8 8 - YYKit (1.0.9):
9 9 - YYKit/no-arc (= 1.0.9)
10 10 - YYKit/no-arc (1.0.9)
11 11  
12 12 DEPENDENCIES:
13   - - SDWebImage (~> 5.2.3)
  13 + - SDWebImage
14 14 - YBImageBrowser_DSCnliveShop (from `../`)
15   - - YYKit (= 1.0.9)
  15 + - YYKit
16 16  
17 17 SPEC REPOS:
18 18 trunk:
... ... @@ -24,10 +24,10 @@ EXTERNAL SOURCES:
24 24 :path: "../"
25 25  
26 26 SPEC CHECKSUMS:
27   - SDWebImage: 4eabf2fa6695c95c47724214417a9c036c965e4a
28   - YBImageBrowser_DSCnliveShop: d0c9a392dfbe4bb714362583bb802d1773a30f7b
  27 + SDWebImage: cf6922231e95550934da2ada0f20f2becf2ceba9
  28 + YBImageBrowser_DSCnliveShop: beca1a333282098979595a7eae0a73a4805d14a5
29 29 YYKit: 7cda43304a8dc3696c449041e2cb3107b4e236e7
30 30  
31   -PODFILE CHECKSUM: aa7918fac921745501ebebac2b1a743aa1d31095
  31 +PODFILE CHECKSUM: 1c9382532bba4c074f5c669a65132a33e0cc5171
32 32  
33 33 COCOAPODS: 1.9.1
... ...
Example/Pods/Local Podspecs/YBImageBrowser_DSCnliveShop.podspec.json
1 1 {
2 2 "name": "YBImageBrowser_DSCnliveShop",
3   - "version": "3.0.9",
  3 + "version": "3.1.0",
4 4 "summary": "YBImageBrowser改依赖为YYKit",
5 5 "homepage": "http://bj.gitlab.cnlive.com/DSIOSTeam",
6 6 "authors": {
... ... @@ -9,7 +9,7 @@
9 9 "license": "MIT",
10 10 "source": {
11 11 "git": "http://bj.gitlab.cnlive.com/DSIOSTeam/YBImageBrowser_DSCnliveShop.git",
12   - "tag": "3.0.9"
  12 + "tag": "3.1.0"
13 13 },
14 14 "platforms": {
15 15 "ios": "9.0"
... ... @@ -21,10 +21,10 @@
21 21 ],
22 22 "dependencies": {
23 23 "SDWebImage": [
24   - "~> 5.2.3"
  24 +
25 25 ],
26 26 "YYKit": [
27   - "1.0.9"
  27 +
28 28 ]
29 29 }
30 30 }
... ...
Example/Pods/Manifest.lock
1 1 PODS:
2   - - SDWebImage (5.2.5):
3   - - SDWebImage/Core (= 5.2.5)
4   - - SDWebImage/Core (5.2.5)
5   - - YBImageBrowser_DSCnliveShop (3.0.9):
6   - - SDWebImage (~> 5.2.3)
7   - - YYKit (= 1.0.9)
  2 + - SDWebImage (5.8.4):
  3 + - SDWebImage/Core (= 5.8.4)
  4 + - SDWebImage/Core (5.8.4)
  5 + - YBImageBrowser_DSCnliveShop (3.1.0):
  6 + - SDWebImage
  7 + - YYKit
8 8 - YYKit (1.0.9):
9 9 - YYKit/no-arc (= 1.0.9)
10 10 - YYKit/no-arc (1.0.9)
11 11  
12 12 DEPENDENCIES:
13   - - SDWebImage (~> 5.2.3)
  13 + - SDWebImage
14 14 - YBImageBrowser_DSCnliveShop (from `../`)
15   - - YYKit (= 1.0.9)
  15 + - YYKit
16 16  
17 17 SPEC REPOS:
18 18 trunk:
... ... @@ -24,10 +24,10 @@ EXTERNAL SOURCES:
24 24 :path: "../"
25 25  
26 26 SPEC CHECKSUMS:
27   - SDWebImage: 4eabf2fa6695c95c47724214417a9c036c965e4a
28   - YBImageBrowser_DSCnliveShop: d0c9a392dfbe4bb714362583bb802d1773a30f7b
  27 + SDWebImage: cf6922231e95550934da2ada0f20f2becf2ceba9
  28 + YBImageBrowser_DSCnliveShop: beca1a333282098979595a7eae0a73a4805d14a5
29 29 YYKit: 7cda43304a8dc3696c449041e2cb3107b4e236e7
30 30  
31   -PODFILE CHECKSUM: aa7918fac921745501ebebac2b1a743aa1d31095
  31 +PODFILE CHECKSUM: 1c9382532bba4c074f5c669a65132a33e0cc5171
32 32  
33 33 COCOAPODS: 1.9.1
... ...
Example/Pods/Pods.xcodeproj/project.pbxproj
... ... @@ -8,65 +8,71 @@
8 8  
9 9 /* Begin PBXBuildFile section */
10 10 0060D0002F5404112A217929E462A1E3 /* NSString+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = FD46990B6EBC034765E7F896D7692AF0 /* NSString+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
  11 + 010A21434427A1E7CE25060BA3A66A61 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 618EA55D0CE2B6CFE74715E49A256295 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; };
  12 + 013FB3424E97C9CBA093B58F3FF74537 /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D239E8639A886939B6B5EB58FC27342 /* SDImageLoadersManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
11 13 0272570CDAD7111506606BBA6F85A080 /* NSDictionary+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = ACDDD031AB39EE10A73CBCA382968C97 /* NSDictionary+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
12 14 029C5740548FC68443365660D8ABA6F9 /* UIColor+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 2058F8BF3995BDEFE75215FA94771AA0 /* UIColor+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
  15 + 02A4C8ABD5DCC501DE7A6CE19B398E14 /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 968801418C5808212099C7AAECFD942F /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
  16 + 02B6598C52131C10E3CA344FB49B87FA /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 060133C4A0CD84D7E43EA5A6AE35A7BA /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; };
13 17 02C881CC8FD4159AA03D68B194FD365B /* YYAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = DEAEE433C1A4AC2340AD30180CD833DE /* YYAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
  18 + 033813F58E3D20FA511AF1B5C3D58FA7 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 64D193C84163B92004E21BE9A8A13B71 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
14 19 048D7570F580B28F3DF0FC0B2AA930EF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 666F2A06D9CC71D500B577D3F48163AF /* Foundation.framework */; };
15 20 04ADC5DD2971F1A73C00ADF4C40439EB /* YYTextContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 666CEBB485FC6B4BC1861FC6F4EE5093 /* YYTextContainerView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
16   - 06012BECF3390F6D209D81ABC29DEE7F /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 03917DDCF8C121DD56B0AD9B603C2B9D /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; };
17 21 0678C6B089EDAAEBF0ABD11243A753A3 /* YYDispatchQueuePool.h in Headers */ = {isa = PBXBuildFile; fileRef = E467579343CF6E084F5AF44750D3B054 /* YYDispatchQueuePool.h */; settings = {ATTRIBUTES = (Public, ); }; };
18   - 06EF6A665BCC7FDFD85BD8ABD55A3959 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4532E0D4D1C1FCB630416F347E791110 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
19 22 0751F49015B77B3FB215DB3AD60A231D /* YBIBCopywriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 33DBCD81CD9E79FBDBDD1041BC653A17 /* YBIBCopywriter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
20 23 0755CF3A071367BA31851EB62D5B2A60 /* NSObject+YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = FC399F5E175605828984C7E67A02DD73 /* NSObject+YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
21   - 07ECBE230ADCE64A5E565EAC5608FE06 /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E9E88F1E31A013B69A717855A9A782E /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
22 24 083BF8C20CE1E1F3773EE3C5536D0B0C /* YBIBImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 97A38E03511200872A6CE102D312DA97 /* YBIBImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
23   - 0897E820C9A330AEE938549F3A202047 /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C6338E013B6CE8A040D3B94EC208F53 /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
24   - 09291E0580080AF730970F2DE20C6F2F /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FB82601936A52D10C46ABDED4C4D68E /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
25 25 098E4E9C697F092846351BE92E971CCB /* YYDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 95F7B5AB059394D73D87262D3556EB78 /* YYDiskCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
26   - 0A12ECF7CCD9D053812435656179FE07 /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EE818633CBD870C5763EC5A7DEEFEBB /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  26 + 09EB95CBDF8D54EB05C26A5196EBBB65 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = CD970A6F82F507060C225F86F7A3F410 /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Private, ); }; };
27 27 0A29B5E3535A71017ED3189727F50C85 /* YYThreadSafeDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F091181C07B3942FF0C12310A2FD678 /* YYThreadSafeDictionary.h */; settings = {ATTRIBUTES = (Public, ); }; };
28 28 0C2C51B9FDB2D20A15B32D15242BFBEA /* YBIBCellProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = A483F09FE887E66A6F02B7FCBE79F846 /* YBIBCellProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
29 29 0CCE71ACEC301683C4A76B510BF57603 /* YBIBTopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 96371E9C734320A546704E45E02ED3DE /* YBIBTopView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  30 + 0CD7B135FD4B84BDB1FB8727A2F85550 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DF00E591E4B26D6D1D35456AAE90B1C1 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
30 31 0D11DEFCE2724FE3C96AC4EE40F55DDF /* YBIBUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B794942CBB5B6C0D1CF9F241EB18B3C /* YBIBUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
31 32 0E1842A4AB5D622772AEB9F4B6287A8D /* YYImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 563F4DAD613D6C00571FC9D44766124D /* YYImageCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
32 33 0E5602930F727902D8CBC2F207D498D4 /* YBIBToolViewHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = A1341A583321F6A80299E2B2D53093F0 /* YBIBToolViewHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
33 34 0F1D2464A4C6139BB34E7B6E6E39023B /* NSObject+YYAddForKVO.m in Sources */ = {isa = PBXBuildFile; fileRef = E1EF95E26F5A8BC0AD3CEC7DE8D50611 /* NSObject+YYAddForKVO.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
34 35 0F4E5CD38D18F2E3E75AC64F03934E98 /* YYKitMacro.h in Headers */ = {isa = PBXBuildFile; fileRef = AC5675312A245FA26DAC5D3DA60C6060 /* YYKitMacro.h */; settings = {ATTRIBUTES = (Public, ); }; };
35 36 0FC30F9DC8F64DC4B502B719869ED79C /* YYTextUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = B335348A63303EE2CF47F0FB10EC9122 /* YYTextUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
36   - 11631B3F15728204C488D6CF17DA63BF /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = DDF0A0D18F37DBE6D852FCEA2251F1C1 /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Public, ); }; };
  37 + 104CBAC9F34C7B8475A096C4B0ACA3A0 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 91C17D860CA95052284F7C9198001DC9 /* SDImageLoader.h */; settings = {ATTRIBUTES = (Public, ); }; };
  38 + 1201437E196032353D4D2B2DF8206775 /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C2170C0DA7F6751732A3F6F2D3304C /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
37 39 122BD5442BBECACB54A06747DED37B0F /* YYWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FC526297A9617C4BE9A6F090BD02A7EC /* YYWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
38 40 1238CAAE4120F0A66FDD66BC8ECA2418 /* YYWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = FDAB2149ED799695566D25A14612AFD4 /* YYWeakProxy.h */; settings = {ATTRIBUTES = (Public, ); }; };
39   - 130C29DD67F0DACDAA2E6A57DA2422D7 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D8872339E7C6C556DCFC2B144D97747 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; };
  41 + 12A76A691E704E6EBE12CC888639C31A /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = EF282CB27CB176AE4D81EB193162E61C /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  42 + 1367682CED02F22D43F248A0E36CC17B /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EB5FC7AFB1E5240D21A6FE7DF89E87C /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Private, ); }; };
40 43 137968123E34895CA083FE3FE12F8F57 /* YYAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A297B0A3BB16024B6497BE64883F91E7 /* YYAsyncLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
41   - 13B7C26AFEF7B9A9BB71D6340836C1D2 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B758940E94222028625182D6DD5C48 /* NSButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
42 44 14958A9E9713112DA8B0BDD453321168 /* YYTextSelectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BB872492D04CC4C2B83ACB1537BCB51 /* YYTextSelectionView.h */; settings = {ATTRIBUTES = (Public, ); }; };
43   - 16EBE72F21A776BA4F5FA1B43DA0D550 /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7DC9E6937FC0DCAFBFE9BC1CC778D6C9 /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  45 + 14C2D66D5EC7A892325562A7830E78D4 /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = 608E04456BC00743986E00E4A8181EA3 /* NSBezierPath+SDRoundedCorners.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  46 + 14E9103FD1B1EFBE7BA8EE1137810EB2 /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA5120287BD232F4C4CECF7D74E0104 /* SDImageCachesManagerOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  47 + 16B189FD50EB941DDBCEF3718C511381 /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 5573ECAD013B67C3DCA80D7EFBDE031B /* UIView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
44 48 16F21DD55C514011E36EDA191BC47CE3 /* YBIBCollectionViewLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 4600030B461C937CF76ADA334E8D6F1B /* YBIBCollectionViewLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };
  49 + 183F84DC6D79A0F93AE6C13F2EDDDCD8 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = F37753D5DA03467158CF8F3BFA52E460 /* SDmetamacros.h */; settings = {ATTRIBUTES = (Private, ); }; };
45 50 192CE67469A2B7BAD4691D712B2C9D13 /* YYMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AF2E5796402740EB5340B609872DBEA /* YYMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
46   - 1A645DC3F75D98F78F685E7E8172E6C4 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = B93B5CB4F97B4C63233C9781D9074385 /* SDWebImageError.h */; settings = {ATTRIBUTES = (Public, ); }; };
47   - 1A696C66B1AD121F4D74F70046E722BE /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = BF2240205CFBA63D171F27ED059DA17F /* SDImageIOAnimatedCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  51 + 198D45399940A52F6AD442B5F96A24A1 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 232C7410166470C58B9D7DD4BEE465D6 /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  52 + 19BA863C27D0A5BBD664CB1ABDA03238 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = C8D85332D2674E584830AC6CFE3141FE /* SDInternalMacros.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  53 + 1A04C35F3E2D85CFCAFC9934EAC8E033 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DED8461605A23446E943D5B44AC07FB /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
48 54 1B3F4D1188B463D85D392E89DABCDE88 /* Pods-YBImageBrowser_DSCnliveShop_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B4FF6780DBBE60AA8EAACC09BD33F72 /* Pods-YBImageBrowser_DSCnliveShop_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
49 55 1B529361E5652CD292D14F89C9D29ED3 /* UIGestureRecognizer+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = B4A1D7FB30E0B1322F08017865D3AED6 /* UIGestureRecognizer+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
50 56 1B8FD7D8E9EDF9BBA7ACD5FB448BE517 /* UIButton+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = E97D1AED9A06E626CDC89DE4248FA2DF /* UIButton+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
51 57 1D457A5D62A3B26C40A0BF028086C923 /* YYAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = BAC4F1096AC0661BCC97A1690D41356F /* YYAnimatedImageView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
52   - 1D8DC86B542A5C7B185D576593BFEF08 /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EF4C3869889BF6E0FB48DB6D3E50C42B /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
53 58 204561FFAF8A0B7292A4045AFA3E6C96 /* NSThread+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 2083BC9AABD59C97DC155E29DC3E9A9F /* NSThread+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
54   - 21C54761AEC4B6FF8F628CF62503856C /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = C8CF816C63E5B6559556C778BE819AF4 /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Public, ); }; };
  59 + 21C120EDFCE3F1B685833EAE2F088998 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B17144987DDC3673503BAA63081322E /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
55 60 22759285C81AA923E5863F79F180DBF7 /* YYWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = B0715021BC19551B9A5D5CB2408E7E2B /* YYWebImageOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
56 61 2294C9BC0119442FE4F0EE31CCD819F7 /* UIControl+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = E20C5E35E7CBCF4496931DDD69C93799 /* UIControl+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
57   - 22AC8168428AA91CEFCC4A1EE18C61A1 /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A2C5A33CC842DF0109E16A40FED6D58 /* SDWebImageOptionsProcessor.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
58 62 22DB5291728E37A7B7580BA838C1A746 /* UIDevice+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A25BC91CE33678DD088B666A283A44A /* UIDevice+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
59 63 24437A6D0EA45A0A7D4D93972E399050 /* YYThreadSafeDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 57EF9F7EACD9A4EA29C6C7519AC29E42 /* YYThreadSafeDictionary.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
60 64 24EE4728E0D8DCB91B7E600CD3618A99 /* CALayer+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 586579D8B562F5F100F35D60CADAF40B /* CALayer+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
61 65 258DB6DA0945B112C39132D5F2B71ECE /* YBIBVideoCell+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = F48485AE0CAFC4B57A15BC09F76DF01F /* YBIBVideoCell+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; };
62   - 27117846D36D17C67AD6B0BC49819C2E /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D82E5E2C22405F57D03467E23EA118F /* SDWebImageError.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  66 + 271841B1A02A31A896499240CC233E7A /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = D99CAD8BB03A1ED3ACC306DE0083743C /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
63 67 271D732A36C08FBFA8BDDFF597300081 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E326D6F0395EE4BAE670CD855A8D0176 /* SystemConfiguration.framework */; };
  68 + 27E23C72CC1BAD100D8F8E52A77E0DED /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = FE71B363E5C4B1A08ED28F0F030C3610 /* SDAnimatedImageRep.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
64 69 27E9D86EE4DB53E0619552A3D32CC2C5 /* YBIBVideoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ED618A61344837183008AF1693E8716 /* YBIBVideoView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
65   - 2987181816CE330B8D8C8011A163DED5 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FD9BD14816B4B34D6B032B14FCBCD17 /* SDImageCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  70 + 285BB197A61A0553905D872B6E4F6BA1 /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = CF05C25EE17396B80BB50C70733D2421 /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
  71 + 28B63809D42D68F3E44A2012695EC8E8 /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = D137AC86EF60C0DD4725A67DBED5F6EC /* SDAnimatedImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  72 + 292DFB006819CC5C457430933E9DF2CC /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 54932F1D65D4CE3969AD7014585252E6 /* SDDeviceHelper.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
66 73 299334502C7E8A552B093FA1252592E1 /* YBIBImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = CA7D546D1F3F75461DF8423D2BF90D68 /* YBIBImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
67 74 2ACB60B84B7C79A7739A5B0E44D4C65D /* NSObject+YBImageBrowser.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DEA694BF89E27C54D37D6453687E87A /* NSObject+YBImageBrowser.h */; settings = {ATTRIBUTES = (Public, ); }; };
68 75 2AF4B545058531DE31545B25783DD75D /* YBIBDataMediator.m in Sources */ = {isa = PBXBuildFile; fileRef = AFF0F50B5FE26ED59651D7C8D462D48E /* YBIBDataMediator.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
69   - 2BB48CC4F4CCB6ED239A7116C1399192 /* NSBezierPath+RoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = 480531E7E6576BA8EBC67D80A2410524 /* NSBezierPath+RoundedCorners.h */; settings = {ATTRIBUTES = (Private, ); }; };
70 76 2C74C620DEC4D8EF9E821945D942E42B /* YYTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ABDD0D167F87048EDFBCF3A1E54B781 /* YYTextView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
71 77 2C9826C18088A3500C545761C905F0F7 /* YYTextParser.m in Sources */ = {isa = PBXBuildFile; fileRef = D27CB4C11DD858E2346FCDB108967EE5 /* YYTextParser.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
72 78 2E0043CD33920B9F3E512FFD04E64A5D /* UIDevice+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D83880B681055CB94822859FFC3C2B6 /* UIDevice+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
... ... @@ -74,63 +80,65 @@
74 80 2FB2D48CEC9FA3F13FE4C8FB20322356 /* YYReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 784B89EF43D57599270D1491D222B2BF /* YYReachability.h */; settings = {ATTRIBUTES = (Public, ); }; };
75 81 2FF328BC76D267CD2BD2464A76F1BE7B /* YYGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = B3EE8BE60AF36139B6E231F4FA722917 /* YYGestureRecognizer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
76 82 313A089C34F2ECEB35BC86470ADC5FE9 /* YBIBImageCell+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 268BFC97CAD611337B98EA380097C255 /* YBIBImageCell+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; };
77   - 31486EEF2AE7067DC3FB4C41D8B06044 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = AD998B4EBF0CD700BD542833326015DB /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
78   - 31C885C264ACBC869D0C15774FEEEE91 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B836409E7407CD373408BBEE6FB78A56 /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
79 83 326ACB0AEC6F7BDDCD287D41EEB15F06 /* YBIBVideoData+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = F5670120F17DFEC029094ABAC2358C59 /* YBIBVideoData+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; };
80 84 32E6EAEE45FAFBCC7363F8DA2D5ECE30 /* YYTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 29A3DA3355DD6482745F7763E549FDEC /* YYTimer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
81 85 33284B411935766A4D23A0AF0419392F /* YBIBVideoActionBar.h in Headers */ = {isa = PBXBuildFile; fileRef = ADE583D4B2310B6AB0833BF354A6DC60 /* YBIBVideoActionBar.h */; settings = {ATTRIBUTES = (Public, ); }; };
82   - 3402867F1DCE2F01EE152BE666D15391 /* SDImageHEICCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = E1824D23FFCDBDE557E8BCF4A5D1EB64 /* SDImageHEICCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
83 86 34B96FCCC06C1D11BC31E63DBDE184E7 /* YBIBVideoTopBar.h in Headers */ = {isa = PBXBuildFile; fileRef = ACD89195E78715E8E03598ED048B1DB6 /* YBIBVideoTopBar.h */; settings = {ATTRIBUTES = (Public, ); }; };
  87 + 34E8A42A4CD18CF55A1C5CBD1F222D71 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C7A36D864638BFBD8FEE3A451FAC9B3 /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
84 88 34ED3A525719FD3EE9F2A7789D12D7D7 /* YYFileHash.h in Headers */ = {isa = PBXBuildFile; fileRef = B9AB8CA329AC9F81339A2A1B4F0266FE /* YYFileHash.h */; settings = {ATTRIBUTES = (Public, ); }; };
  89 + 3526C8C7BD0C5256C819AEB8DE26BC80 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 61733D38B2BF61692321B0EAD6CE7AAC /* SDWebImage-dummy.m */; };
85 90 35E986B3D2EF9589EDA6898E692750A1 /* UIGestureRecognizer+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = A182794A8F3D76711F0E02DA7FF03E94 /* UIGestureRecognizer+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
86 91 36B94DF1E7E7776212429AE5CF1456B6 /* YBIBOperateBrowserProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = AFB40C28BD8BD37F15B50CB7E6A20928 /* YBIBOperateBrowserProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
87   - 3768A48148C1A559EFA6857AEE21499C /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A7213E5D815346B024AC2C78B59AE7E /* SDWebImageDownloaderRequestModifier.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
88 92 37E4FA1562451631BA152EDCB15710CF /* Pods-YBImageBrowser_DSCnliveShop_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F170A24D4E53C3C47A8CE99795457D6A /* Pods-YBImageBrowser_DSCnliveShop_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
89 93 384E30CBBBD2B4A155A989F32F982BEC /* YBImageBrowser_DSCnliveShop-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C705108BAA5E0F79A36A255F671FD73C /* YBImageBrowser_DSCnliveShop-dummy.m */; };
90 94 3951BC1F545F8733CBFC8E36CD6EC461 /* YYThreadSafeArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F23CF51EA97FF806B2D6A43C0B0AD50 /* YYThreadSafeArray.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
91 95 398ECA87D5BDB9FAAC6424101D8C1DB3 /* YYImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 13FA3D010FCAB935A4C1E9CC535A7D28 /* YYImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
92   - 3A717A936244852C7999DF2ACDD3EBA4 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = DD7EB188DA7D4BC587FE249FF628B51C /* UIImage+ForceDecode.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
93 96 3B365E37B4FC771DA78CDE4C81E9ACC2 /* YBIBInteractionProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = EC297FCDA53117783E423EFCF34C4C6C /* YBIBInteractionProfile.h */; settings = {ATTRIBUTES = (Public, ); }; };
94 97 3B697DC46854D39C5E029789A7EB60CF /* NSNotificationCenter+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 39721DF1E2941C5B4B819BD85F2AA60E /* NSNotificationCenter+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
95   - 3B9737EB4BDEA61D7A6D7C2F83ADE16B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 666F2A06D9CC71D500B577D3F48163AF /* Foundation.framework */; };
  98 + 3BAC7E6B28028F929677080D34286C9A /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = 57001503938AEFE09B39A90CD56CF65A /* SDDisplayLink.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
96 99 3C1845A20677487130FEEB952FB3743C /* YYThreadSafeArray.h in Headers */ = {isa = PBXBuildFile; fileRef = C95F8792B9A29FF9F37927E606871D5B /* YYThreadSafeArray.h */; settings = {ATTRIBUTES = (Public, ); }; };
97 100 3CA5A2706484756D1BA83EFE6B50B63F /* YBIBSheetView.h in Headers */ = {isa = PBXBuildFile; fileRef = 13EFE3DD1D702D85B36FB7D106BC163F /* YBIBSheetView.h */; settings = {ATTRIBUTES = (Public, ); }; };
98   - 3CBE3496D679F3CAC215C24E124CEF20 /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AA629F1636B9E5C1E7779416F41894F /* SDImageLoader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
99 101 3CECF913D9FE0F03BD7228B4E1C9EF71 /* YBIBTopView.h in Headers */ = {isa = PBXBuildFile; fileRef = 01925082D3D68AFAC34FD497668DDF52 /* YBIBTopView.h */; settings = {ATTRIBUTES = (Public, ); }; };
100 102 3D05DA022EDD102E5514E769E47AE751 /* YYTextInput.m in Sources */ = {isa = PBXBuildFile; fileRef = E30659E8DA748D0CF9EA5E88C15DA2DA /* YYTextInput.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  103 + 3D269D2B6E70D5134F84F471FA897C1D /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = 20421D13A41D462848F051647414A829 /* UIImage+ExtendedCacheData.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
101 104 3D454A471582F13942DB598AE5959B34 /* NSThread+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = FA31B22A4EC7CB38F40BE6C28871B56C /* NSThread+YYAdd.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; };
102   - 3F1C17F8ED3A2719985697A88379D691 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B5F772E2006AB9FCF216A22126D6D46F /* SDImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  105 + 3E404F1C1EF06355EBCAD17AAA6A7655 /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D6746DFA44B1641AE23A50377370530 /* NSImage+Compatibility.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
103 106 3F6CD94029B30B62256BEE04B742944E /* NSKeyedUnarchiver+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 09D461072FB1F94116B94C3D35ADC919 /* NSKeyedUnarchiver+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  107 + 3FE529AB19EA206854B9668E508D927B /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F7D6860C305EDC74687492EDEFC2325 /* SDImageCachesManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
104 108 406944DED312A7E5BA1B0003EECEA947 /* NSTimer+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 96B1B4E18C7313B870A3AECA294EED03 /* NSTimer+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
105 109 40802954DE9E2C6E621F0A6C52ECF32A /* UIButton+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = D696C9B3DB7929040B3B11E0888CE4D6 /* UIButton+YYWebImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
106 110 40B5E49E3E7BA95180F22F1F19BC719C /* YBIBImageData.h in Headers */ = {isa = PBXBuildFile; fileRef = CC069742328B0F99B589CD1E88042C72 /* YBIBImageData.h */; settings = {ATTRIBUTES = (Public, ); }; };
  111 + 40DD3721BA61598A56ECF57BB1C45EE8 /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = AF3424AF58293B7AECCBA5ADAE1E90EB /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
107 112 40F884DA82F3490D28EE4A18D067133D /* YBIBImageCell.h in Headers */ = {isa = PBXBuildFile; fileRef = F95AF0A9B4FD11599AC907D5ED78047F /* YBIBImageCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
108 113 41CB6255FC0ABB5BBFAED4A0F704DD47 /* NSAttributedString+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 99C3520C09D1B40E7E268FF0D9C55D3A /* NSAttributedString+YYText.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
109   - 41D2B74D60CECB9A13273FEA70EB0853 /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 5820AFD9CB1F531DEEEA85AE53BA9FB1 /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
110   - 43367367332A88EC53B2BEA287BAA3DD /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = CF824EAADAAA9D61882AC1E95A4FAAC5 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
111   - 43413AE961CEDF130DB347D12953F90F /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 14AEC03CE74FA3C1ED22FD08ACDC489F /* SDImageCachesManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  114 + 41E823881385B837FA086E301CBBB87C /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DD82D69E6F6CA677C0FD0DB1910BEEB /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Private, ); }; };
  115 + 42BB3098DC0E47748C6AD61A10575859 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C6064257443573B6B4428384FE55B429 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  116 + 4458F0F06DDB8ED606F8089B51DE2857 /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EADB1874F009D5810228B521E808F8C /* SDAnimatedImageView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  117 + 449AF3A1E1DEFBD47B2411DAD0E5D6CC /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C1B3FCC15992E25641767F7CD50BAA99 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  118 + 44F7C039A4502CB6ABFE93BC1626ADAF /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = 13211B603D4A4D4D2724F2C5BB4407D3 /* SDImageGraphics.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
112 119 450020EF80EE2190F959859B70A7200C /* NSNotificationCenter+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = ECF2A1D940AD2ABA3D907CE415109326 /* NSNotificationCenter+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
  120 + 451775744CDDD8A2805CCC5FAAE96FE6 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 36C8C2D7C7ACA9C26136F7A7D1154082 /* SDImageCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  121 + 461394E1264BA539807AE22B6681037D /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C550536A6B0FFCC49930C911A1A845CA /* SDWebImageOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  122 + 46E5579E12DEE8B0B0E8B4BD484303AF /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EA2BCD717BF8B6108E49F1344996DCF /* SDWebImageCacheSerializer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  123 + 477600BAE7223A59EC2D341F7EAA0C5B /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1072A8A4B2B89ECA95DD401CFB50F108 /* SDImageAPNGCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  124 + 47CFA5C583D7B3BFD0FBAD1F1A474913 /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D0DD7284FE8B0C78E070E9DA2D0C46E2 /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
113 125 48021E999B1E5F973788B56CCA965E25 /* YYTextRunDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B1F78325C1CF3117C990E0DBB1443AC4 /* YYTextRunDelegate.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
114 126 48229CDD5F7F0027AD9E4156B76F2761 /* YYTextLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E718C6C13FF741C9062C0F849A452F2 /* YYTextLine.h */; settings = {ATTRIBUTES = (Public, ); }; };
115 127 4823FF271BD5BF673DC75142A9C9E387 /* UIScreen+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = B664849B9E38756422D4E0F139369652 /* UIScreen+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
116 128 4A0AF19D46BA2F0FD4AF851196B38EF2 /* YYSentinel.h in Headers */ = {isa = PBXBuildFile; fileRef = 47EBB445DD9ED1E0006BD00439ED755A /* YYSentinel.h */; settings = {ATTRIBUTES = (Public, ); }; };
117   - 4A295CDE35C0C3A0C3BDC83BAEEBC8D1 /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C7DA27208415129BC75A3AE0EC610D /* UIImage+Transform.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
118 129 4A5A8FC3C886ED3C64CED4D130FE0F03 /* YBIBDefaultWebImageMediator.h in Headers */ = {isa = PBXBuildFile; fileRef = 68D2A3CB6FA504A7585BD0C033C2860D /* YBIBDefaultWebImageMediator.h */; settings = {ATTRIBUTES = (Public, ); }; };
119   - 4A63641D8EA2784EA3ED6DE31D3EEE7B /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 880ED7B5A8CB58EE4EE46F97AAFC7934 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
120   - 4B010F01929654CD157576546C2CA5E5 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D4F696743A974B8507BEF6FB323BB62 /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
121 130 4B3B7BFD84DD51A967904785A38307B7 /* YBIBContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 101F73BF4899F419E3CC133F2A9180D4 /* YBIBContainerView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
122 131 4B8C95CC6A366A73C4F26F2448899292 /* YBIBLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = F0C1D31C0ED9EAF5880440E2214DFB67 /* YBIBLoadingView.h */; settings = {ATTRIBUTES = (Public, ); }; };
123 132 4B993FDB4652EC183C92386AD8A826F4 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA809AC31169252E62703BD0FBD06EE5 /* AssetsLibrary.framework */; };
124 133 4DE3E72DC3D3D19FF35127E11FACFC2C /* NSData+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D09FF329509C51C099F07C2BA4EF7A6 /* NSData+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
125 134 4E113F880A8F4186232B79C088D5B228 /* YYTextLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BE5EE0D085B4C8EE2CDD27B25526D0D /* YYTextLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };
126   - 4E303A392C14264AF2A7846A47904C0E /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F679F8EE0717580BF2DF10529B314ED /* SDImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
127   - 4E5C5A91108AA66D06C8D32C62266D23 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E907072812DC6E02160321606CBFFD2 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  135 + 4F227430C16CAB3FF65A1488229BF46A /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E02A020962AA8A983BE9DEF489D5CC5 /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
128 136 4FB4BD99B28E8CFEA3F95747EF6CEF79 /* YBIBSentinel.m in Sources */ = {isa = PBXBuildFile; fileRef = 13CCFEB0FA63FC0D2DCDF8E5B3E3CC33 /* YBIBSentinel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
129   - 4FB58F2A627219E59C6002407BA17370 /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 74C01AF8051358A2AD340A5AB3505F28 /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
130 137 4FEFE33A7E35A2D1C37A49A938DEA3BF /* YBIBToolViewHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = DF010552264134747196B93F7030F079 /* YBIBToolViewHandler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
131 138 511503F829FAA5EC9610F4443E3D2847 /* YYTextArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 9126743F263F9F3BED4DDDB5EFF3F2C8 /* YYTextArchiver.h */; settings = {ATTRIBUTES = (Public, ); }; };
132 139 5170A333176FE316425BF9199E723910 /* YYTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = B4632D2A423ADC26289A01B226F70E28 /* YYTimer.h */; settings = {ATTRIBUTES = (Public, ); }; };
133 140 517A0598B2C0EA7B8F5C74D34845F0D5 /* YYClassInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 55FA14C2DEAB1ED0438F36B2AF930CC1 /* YYClassInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
  141 + 521A2AB2326986DDA7210B222799D82D /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 102A8609FE38B44A4F04554766133491 /* SDImageIOCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
134 142 52EB680BFBB3E4C3F09C36F423DF2CC8 /* YYDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 28231517D2EC4777AA0E1F8613912A64 /* YYDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
135 143 538760AA208FF206F3BF4156545C0AEC /* YBIBSheetView.m in Sources */ = {isa = PBXBuildFile; fileRef = A8AF070443791A87599C26E1E46E74B1 /* YBIBSheetView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
136 144 54B786B4C13CB1CF2A1D5BFA8E223872 /* YBImageBrowser.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 7A2AD834B988AB862338A88298281712 /* YBImageBrowser.bundle */; };
... ... @@ -138,23 +146,23 @@
138 146 54F83939D254C814BD261C4F9067EE45 /* YYImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = C805133F6D3AF69C8994E6375F7B7155 /* YYImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
139 147 54F962BB1E3633A8CE3CD524A2A091EC /* NSObject+YBImageBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 1238AEB9DF5C8189A50C5E4E0B74DC2E /* NSObject+YBImageBrowser.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
140 148 5551655EE581057624E66895BC5A99EF /* YYTextLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B4A7C95058000CD832DBF4537DCFBA4 /* YYTextLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
141   - 55F81E8A4E05DCEA1424C070100D7A08 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0027B01676377B9218BE8AA537BDAA8A /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  149 + 561EAFCC4AA4A4FFA55319ACF371D31C /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ECDD31DCADBB91FE191C953267FFF2D /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Private, ); }; };
142 150 565EE0410B39DE584B5CB1DC63FF74A9 /* YBIBDataMediator.h in Headers */ = {isa = PBXBuildFile; fileRef = 80A4A26F23AC2E0F4F5EBC0F4B53543D /* YBIBDataMediator.h */; settings = {ATTRIBUTES = (Public, ); }; };
143   - 56D932D22CCE25078DDC72863C793EB6 /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = CA2F973E303B162092C59FA182AC2842 /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
144   - 571964893E54957A53F88749EA22E79B /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6076834A27CA897C42FFDA170BDE4715 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
  151 + 56D4C3BEBAF6D7B57123C4A919EDFC4D /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = D1A63106E180D500BA4681CBFF159C50 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; };
145 152 572FF20566D47336C057266897DE4592 /* YBIBVideoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3378EC961A947D7584285C497BA5C833 /* YBIBVideoCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
146 153 57AA56BCB8A92A8D90C5BA695D8E8FC8 /* UIApplication+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 03021F927B254ED434510FB85A91E7DE /* UIApplication+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
147   - 584691DE6F6DC43CCB28E2164DDD65C5 /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C0EBBBE53B935FF0453555166C8BD82 /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
  154 + 580A58EB2DC597145BE726FF15B7B980 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F204DC3ADE5CAA2617773E3A9EFDDBB /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
148 155 588A0B34308F4D28990E6B5C34B14E57 /* YYTextInput.h in Headers */ = {isa = PBXBuildFile; fileRef = E7A8CFE58CA45BE0CF414ED53D7E9831 /* YYTextInput.h */; settings = {ATTRIBUTES = (Public, ); }; };
149   - 5B6E86C662422D902876E9564F7D0D62 /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = CCFF6195D3943C3B2EE93D641F705287 /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
150   - 5BB4DED775A9AB9259E214C9543F2409 /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = AD9AD3087AA0C54D99784B1E96B8F385 /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
  156 + 5BCB8102AFF58BDD96E0C059F9B88BB5 /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6016CD6764077B1F107BD22483AA7D14 /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; };
  157 + 5C11EACACCF1A59EC89E212517D471D2 /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = F73E603FC59F5282264218DA84C3E5B7 /* SDImageHEICCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  158 + 5C5058FC446A9C6C4F3FA70C2121A267 /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = C43DE0B9900A2DBDABA15312032D955B /* SDImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; };
151 159 5CE0FBC3853B89C290600C1D8FAA316D /* YBIBAuxiliaryViewHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 618A21680667BDF2F6B320EC659C0C8A /* YBIBAuxiliaryViewHandler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
152 160 5D2EAD73E6A402F5BFED5E1899810342 /* NSData+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = B63F966DDF9161A1C29525E49D01A94F /* NSData+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
153   - 5D93304CCA386D1CA921179A22788088 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3977DF74625040A3E0128C656F9FA8D0 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
154 161 5DADAC8CF846B868BB1435BA03B14CB9 /* YBIBWebImageMediator.h in Headers */ = {isa = PBXBuildFile; fileRef = E11C276295B8B9FBB66B8CFCEDD10534 /* YBIBWebImageMediator.h */; settings = {ATTRIBUTES = (Public, ); }; };
155 162 5E21A134F5D88BEDF281002DBB92E3F7 /* YYTextEffectWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = D12BADAA1C1EED1E8EFC4C3B586A68EF /* YYTextEffectWindow.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
156 163 5E2CDADC7CCD44D0C28AB2517341C12F /* MKAnnotationView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9505B72CDB9E287780696B552708241D /* MKAnnotationView+YYWebImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
157   - 5F7825DA2B38AE6F113742CD8640B6A5 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C0F853EDBA5EE0AFD5FF80DF4E069774 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  164 + 5E96F449788433CD16C308CA4C4974AB /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 9915D39521761F821273ED4AD94F462B /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Private, ); }; };
  165 + 5EC0E24AEBC97BED8827D6824B20AEA3 /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 5566B7FA1592DB68F47F538060773A34 /* SDWebImageDownloaderDecryptor.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
158 166 5FF823B0C133DC09A947E1EEA83AE787 /* YBImageBrowser+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 05B6665B0FCAC9FA4988670409B6B9EF /* YBImageBrowser+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; };
159 167 604E401B7BD596E58D52BD8C3439E285 /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F0A032626FFA7C226DF55204CF32C5A /* CoreImage.framework */; };
160 168 608BA5B01D1787C25CE77E5A4B61010C /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E1DF05D31C52BDD36D3C352B6D38143 /* MobileCoreServices.framework */; };
... ... @@ -162,112 +170,124 @@
162 170 613F0D98262025998DBC67A9DD29438C /* YYKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = E1789ACB2E0A630C9C7419690313D4BD /* YYKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; };
163 171 623635ED16355C8405DDCCEE7E014476 /* YBIBVideoView.h in Headers */ = {isa = PBXBuildFile; fileRef = ED78F9035D62E00668B4A848571B55C4 /* YBIBVideoView.h */; settings = {ATTRIBUTES = (Public, ); }; };
164 172 62EE7A80845DFDB75A9E1F0ABEE8A761 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = F23B513D9D8F0D3A6E0802706EAAE0A0 /* YYClassInfo.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
165   - 637C07DAF593E361026C13455CED3356 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7492D3D26ACA17BE066949BC5402EFA6 /* SDImageIOCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
166   - 6419E84A00BD1CC2D89FBD11DBA95B35 /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 95D767BEAA3A22D8C4B4F881F593EA55 /* SDAsyncBlockOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
167   - 642B272637AFE100C01566715BE9A90E /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 994DDB7514B65007DB23743EE9419955 /* SDAnimatedImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  173 + 64CB4C39356EDD005F3104B820F4B299 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = EFBE035B06C6B5FC5316B23AA385AEB7 /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
168 174 64CE031D05AF0C7617076D3ADD88DCB8 /* YBIBImageLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 375D9DE1B1D8EB4B9968FB74F25DE792 /* YBIBImageLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
169   - 66ABFE235C4A3EE1284E40B26EC06E50 /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 26EEACAD4CFF038839E5CAE01FC51426 /* SDImageAssetManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
170   - 66E7DB4A06FD62E3319504FA066A159D /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = FBAFB1147F9F60F82F67F2F93767AEA8 /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
  175 + 64F3EB426774D6F1D593DBFAFFBF6791 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 467332BA4DF047A604E2AD170D2A9A6C /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
  176 + 66794E1E249B57756C75632B1CF7AA7A /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 4423F2AF5E01BBBB5F27784F5DA57247 /* UIImage+ForceDecode.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
171 177 66EEEC491B30074BACEFD2257033864B /* YBImageBrowser_DSCnliveShop-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 30A5E7177537475E2A71D3D8A0E4C58F /* YBImageBrowser_DSCnliveShop-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
172 178 6711B19F0807169D6079C83D4BFDF7D2 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 027369B6DC1B43C3102AE522A00B351F /* CoreGraphics.framework */; };
173 179 676B7D9D11B4F2687F9B296CC9950AA7 /* YYTextMagnifier.m in Sources */ = {isa = PBXBuildFile; fileRef = B436707B203DBCBB754448AF3071705A /* YYTextMagnifier.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
174 180 67992FD17748FE24783B25E1BF320274 /* YYLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = C183149AE26EC946A2F3DEA358713217 /* YYLabel.h */; settings = {ATTRIBUTES = (Public, ); }; };
175 181 68F3A40EADC0AF71E41CC70C36F6976E /* YYFrameImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 410FD0E1E2173C4AFCCB371FC6932374 /* YYFrameImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
176 182 696CD1B74C639EE917E0D2A956F50935 /* YYTextUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = B5AA17CCA3C4553252CF80AEF70404A8 /* YYTextUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  183 + 69979E7EF7E1322AF64B9D04EC5DC4FC /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 1249E97F29FD39E6B5CA9DD3D122921C /* SDImageCacheDefine.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
177 184 69B6CA397711950A1FB1F7159D8C730D /* YBIBCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 09FA23E05944FF1B0AD4A1CAE80AE86E /* YBIBCollectionView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
178   - 69B78205FADBA6F82DD7D8842E744559 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = FF96D9B286912D2041A6038E44BF9D78 /* SDWeakProxy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  185 + 69FC796803AADF6F7D78E034F759E07A /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F25D99C7ED5F7ECE058950E756B815B /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Private, ); }; };
179 186 6AFF36353F18609B9EBF04EEFFF0AB4B /* YBIBPhotoAlbumManager.h in Headers */ = {isa = PBXBuildFile; fileRef = ACB2C18C7F7569D6D85619691655DB76 /* YBIBPhotoAlbumManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
180   - 6B841305B372900E43EAD6CF233EA695 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 397498F9C1EC4E17B000928E2E9A2551 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  187 + 6B8E9A4250E31C61FFB2FA44B1ED587D /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = FDF39D0D9A539DD852E83070D546838D /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
181 188 6BACCB1BBF481BA828D7226094996218 /* UIBezierPath+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = AF18321586C240857382009824EBDB64 /* UIBezierPath+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
182 189 6C294CB68EBA0C3F43058CCA6D0629DF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 666F2A06D9CC71D500B577D3F48163AF /* Foundation.framework */; };
183   - 6C9E415ACF9DBBF5276A439ECA83FF41 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A3758E1F2262F48C18DEA44579E7F23 /* SDImageCodersManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
184 190 6DCEAB9BC2D35D749577C700151E76BE /* YYCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BA7CBEA43C737A330D9608FE7806297 /* YYCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
185   - 6E23CCE1DD2C5694FB3733EF5969C2BA /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 843DE7A9D5751B6D1E4B542142E88BE5 /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
  191 + 6F14B66A0031F8CD2DBD49D05F285A5A /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B374325A4827DE6AA8D86E8A4CA0C0E /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  192 + 6F52C02EB7BEBB28BEF797764940E83D /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 115DF10AB89F4BD3959B0760E6FF7F5A /* SDImageTransformer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
186 193 6FFF65E8EF55589DBF7739C2B3C0C408 /* YYTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 74C9F42DE0F28AF77F3789C8BD0F8A78 /* YYTransaction.h */; settings = {ATTRIBUTES = (Public, ); }; };
187 194 7100C768AE648D8FF211D24F285AF3F7 /* YYTextRunDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 89E1C94E51AFCA8ADEB14A14D7E5C910 /* YYTextRunDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
  195 + 71C055BCF544D98F47CCFB404A9157A0 /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = DF0BE15112187DE13F59F20FD37196BF /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
188 196 71F103B56B2BE2EED9760CB429416EC9 /* NSArray+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = EF5D08601B4B637FF284E68A8EEC858C /* NSArray+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
189   - 720BDB7561A9BF9FAA229655BF6BAACB /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = A2EE608D10670E27D666BCB148BE76A8 /* SDImageCachesManagerOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
190 197 7239A93C05A719FEA5955CA08CACD819 /* NSBundle+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 43D073BDA908719B072B9A52BECCED3D /* NSBundle+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
191   - 7296ED68E239CF8323284C327EFD34DB /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB1475C6AAE3E931553C57D2012437B /* SDWebImage-dummy.m */; };
  198 + 725C541DA4309D9A2CE04EA1BAC9DB05 /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DB88B001512FB115B60C0A194FAB687 /* SDGraphicsImageRenderer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  199 + 7320BE37CC5564C9200656A346D16D7C /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ECCFB33F5B2FAFCB9059F1EA4872AD5E /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
192 200 74A52BA6F30673465B7D46D9C0D589DF /* NSObject+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = FF1FC22A806424A9D295AA3C1785B496 /* NSObject+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  201 + 758D45C8E630A9B2A29746AFAB257929 /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = 885401F9AE5B59CB193871CFBB1551CC /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Public, ); }; };
193 202 75EFCC25F3AB66922773B08B40ACB930 /* YBIBImageCache+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 327DD14828A174C897406BB7ACBB30E7 /* YBIBImageCache+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; };
194   - 765CF9D27014B63D63045C295D14D47F /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 106CDD63C990007C4EBED229576FD0E6 /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
195   - 768B0529984555456940B969FB3B0C5B /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B9F2CAB3EBC390CC9C5DF6FEB4AE54E /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
196 203 771B60C15778D6A1F7F9EBA03217C0FE /* YBIBSentinel.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1FEAA05AC81F62B91CF98EA70351DD /* YBIBSentinel.h */; settings = {ATTRIBUTES = (Public, ); }; };
197   - 773F599C7937832DC3E3C3F5FC41A2BF /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = E6AC77D76359DA3AB60BBECA32896CFA /* SDWebImageCacheSerializer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  204 + 7829F86094FA530717C4AF09DFA1FCB7 /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = A86C89F5D3FD68F631C6AAB3E9FFDB67 /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Public, ); }; };
198 205 783E03543353E623E739BE78A5929AF8 /* YBIBLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 45819A3D4F8AF3FCF1D0D1AF84EADC51 /* YBIBLoadingView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
199 206 78425788741B147A8800D730F768DDC9 /* UITableView+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = DD5396322ED69A5415D1CCD0B6393CA3 /* UITableView+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
200 207 7854082241AE68119F337D38216F3C71 /* YBIBCopywriter.h in Headers */ = {isa = PBXBuildFile; fileRef = B693FD0CA179F7A03CC3787C32366CA7 /* YBIBCopywriter.h */; settings = {ATTRIBUTES = (Public, ); }; };
201   - 78C4797B83602657490272FB5AC87882 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 159B608142C5AD0E99E00479F64CDAFE /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
  208 + 78A8F86E5996E580294B65E304C65F6A /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = F3FA042CB9FEAE916F9354DD0FFDC410 /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
202 209 7906BC8879E295E9832A8668BEDAD6E9 /* YBIBDefaultWebImageMediator.m in Sources */ = {isa = PBXBuildFile; fileRef = 60FC5BFD7F334913232A59633DEE5138 /* YBIBDefaultWebImageMediator.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
203   - 7AA1932AD1AADADB7084C1120E353441 /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = C343BEA71DA4406F27A27215550DB0CA /* SDWebImageIndicator.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
204   - 7BE352AC96A490424A89542C59B92D27 /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2594CEE3269A686FE6A32ADF1ACDA903 /* SDAnimatedImageView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  210 + 79140F3DB1DFA9969EF7EA809862461B /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CA02462DD9F35B55FD8C20DC0A0CDBC /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  211 + 7A39F3B62173880BC1A1E872B2B0DE19 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 7136C53C3E86DF97021DEAC46C3AF414 /* SDWebImageTransition.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  212 + 7BDCFF16AD5094651DDF91E007A194A1 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = 1780A6FB6896D6EE58CA176A32A91167 /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; };
205 213 7BFB921FDAB6E3FE9ECDECF872C8E101 /* NSObject+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = B1A650BD7991FDA4D59B763DC0B897B5 /* NSObject+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
  214 + 7C9BCCE2BE2AB0F74617E9638E8383E2 /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 14EF33DBBD181973544221E30D2DC4B9 /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
  215 + 7CB9508A6133F4674F3358339F62CF03 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 03A09A7D80E19CC940BE2323D0536D61 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
206 216 7D3C72B253473131AA5D6B75A4044A4D /* YYTextLine.m in Sources */ = {isa = PBXBuildFile; fileRef = CAF78B066BA4AA1500A5DFC15357B69A /* YYTextLine.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
207 217 7E798DEF60E5AB2D32D36B2604826737 /* YBIBImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 849AFCF98DA4C75651F5D475A19348D0 /* YBIBImageCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  218 + 7F47C6E48CDC5A9B788F8EB05D826BE6 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9EF0789AEFDBB03D69E8BF132003277 /* ImageIO.framework */; };
208 219 7F779583472271986B6B9AFE3C708D20 /* CALayer+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = FAAA1659DC5FA259CDDED68F436C2BF1 /* CALayer+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
209   - 8095235275C7774DBD0439AEBF02EBF9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = C2DE3B8DDA43BF244A83FA3A8E49B9C4 /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
210 220 8162CC737D0F996DB7986B1B89C50B29 /* NSParagraphStyle+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 0501ADF2BFD7B3CD05199AEA120542A3 /* NSParagraphStyle+YYText.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  221 + 826CC80A43888E4B01B8C0F546CCEB4C /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = E6B26DB6EEA41E128F36B8CCD8BA6C90 /* SDAnimatedImagePlayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
211 222 82B7DA9954D4613DC589CF3A6D681E3A /* YBIBInteractionProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = AA0DFD4E17C227B014108A94D20370E6 /* YBIBInteractionProfile.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
212 223 82F9FC32B8CEFF860D7AF3ED3D109D79 /* YBIBUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 33F8253486294181F468179983E49503 /* YBIBUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
213 224 831E7B86A0A02A8B9099B742E8B9F365 /* NSObject+YYAddForARC.h in Headers */ = {isa = PBXBuildFile; fileRef = E6549BAAE978C54E9943845A282B7887 /* NSObject+YYAddForARC.h */; settings = {ATTRIBUTES = (Public, ); }; };
214   - 83A3C38994C1BE0F1B3FDC74FF3EB86E /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 631A43488B8C087EA660030CD2484EA9 /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; };
  225 + 84996105619FE8603B904EBD8CAF4650 /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CB6206FBA44F9BD5BB69EB2338D24399 /* SDAnimatedImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
215 226 85433B42BB6C81E20A75F25805D4BCDB /* YYTextSelectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C9EBF2F4721D7796CABB86E57141312 /* YYTextSelectionView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
216 227 856B3588D32C1F7B1F12D7EFEB3E6F0B /* YYCGUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = C67FA1CF5455B750586F3E50B4AEE6B5 /* YYCGUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
217 228 858027A29B152077943E0A28CE622EB5 /* YYLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = B24C89AA8E69F17D8867CB8BAF8453DA /* YYLabel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  229 + 858BA6CE212BDE681F7B8EC99CDEA5A2 /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CE599BD66BC1D5DBF2513D84C9CF10D2 /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
218 230 85B06803E42F5D23940D925E5B50BC20 /* CALayer+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 638CD74411415C9BD0B7940010462593 /* CALayer+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
  231 + 85B91AFDF4CF2F4FB54D35AE96CB02DE /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 12B66AB16766AB4060516E7814443E08 /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
  232 + 86A92CFC75F685F5805824C81ED34DD9 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 71AEC717DE657C306DC4220359875899 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; };
219 233 86AA30BB751B23F8B7D87847A0D22CDC /* UIColor+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B392E50F95AAAED6E6AF60D7A6FBA53 /* UIColor+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
220   - 873613A08846E4C11A3D0504EF738DD3 /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C25A06B05CE4932A05E03D9A5B91E1A /* UIView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
221 234 8789F7B4DB1B1FB100F83B649A587A7E /* UIBarButtonItem+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 50E241CBBD2EF97B17ECA31FEAF181E7 /* UIBarButtonItem+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
222 235 87BA235C9033EB1E9BD42009504AF9EC /* YBIBIconManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AD92986443124E1DCE997385B496FB7 /* YBIBIconManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
223 236 882B95F4DB08FE20F2326F2C36D7844A /* YBIBPhotoAlbumManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 14462A5B7907FCC9A6CC6EAD33842356 /* YBIBPhotoAlbumManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  237 + 8860B7C942F4FDAC599E545DEC6E0446 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 657DCFEE5B399779371CC2AC2AAAA206 /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
224 238 886F2D2210CE2308AA97C645044F692D /* UIBezierPath+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A08FF9357329D825160ABB1311027C9 /* UIBezierPath+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
225 239 8908C0789F324444C029342D5462093E /* YBImageBrowserVideo.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 78C427ED00AF6FA74B7F70468B7F9537 /* YBImageBrowserVideo.bundle */; };
226 240 890F7FAF9C784AFD91B418628C895EA5 /* UIFont+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A37969EF9EE0C673EADF254ACD0FE1C /* UIFont+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
227   - 89AA4B620BAF006802F7FE16331FBB03 /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 85323CE74E87D9048ABFE6CB1D80BCB5 /* SDDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
228   - 8AAEE8B8F842102CB770F4A2C286AEE0 /* NSBezierPath+RoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = DFFBF564BC41F65FF3EF9F404A3FF8A5 /* NSBezierPath+RoundedCorners.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  241 + 89A6805309AE158EA70271058AD04DAC /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = FFC1A8B570BBF9B90CBC65027B601DEE /* SDImageIOAnimatedCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  242 + 8A1D68B08A42906461750649F460B63E /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = A788FE41CE72DC285C7E12274B2EEA45 /* SDImageCacheConfig.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
229 243 8AE9809EDD831DD756AA7CE5682506C1 /* _YYWebImageSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = A76D4662C854612618E547F25B4B90A5 /* _YYWebImageSetter.h */; settings = {ATTRIBUTES = (Public, ); }; };
230   - 8B3648DF3CD6DCE1F23B154EEC9F47BC /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 523A9DF244F75BFD8EF7183295D79237 /* SDAnimatedImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
231   - 8B36C6BD6BC521D6EBFAA6C06204C8AE /* UIColor+HexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D082DCD13F9572880B69B6E5DBA621E /* UIColor+HexString.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  244 + 8B74D26ECDC0A95EADFD2FE3D6044F45 /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F30AC9537E6584F35D8DD4C10EDB7B1 /* UIImage+MemoryCacheCost.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  245 + 8BE030582BFA5590BC7A1EB1A7E8DDC4 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F4C26425407B34D7EF26491A3F6C3412 /* SDImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
232 246 8C0825934BBB790BB7D7F435B99A835F /* UIView+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = C9B5994C44BF5B2184C156762E7CE811 /* UIView+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
233 247 8C2F2218E1D1A409DB32DEB82289DA8D /* YYDispatchQueuePool.m in Sources */ = {isa = PBXBuildFile; fileRef = F3DE1A955E99033B5412502804883E07 /* YYDispatchQueuePool.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  248 + 8D6092C5708543E1975D21EF342829A9 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = DA18D81BDAB5332971532C646A936989 /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  249 + 8D7206334016EF356DD5C06DB743927A /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CF9EB80B340726BF23F53617B34B3575 /* SDMemoryCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
234 250 8E31AD7B15C74C86FAAC41197FFD834C /* UIView+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 0EC1CFF6509F136C99FC9C20BC2F40A9 /* UIView+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
235 251 8EF950F7068D194AE492ECE97195952B /* YBIBCollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = D90E67DC9CA5A5BBD19018BD64C3ED87 /* YBIBCollectionView.h */; settings = {ATTRIBUTES = (Public, ); }; };
236   - 902A0F8F36BB0CD612BD333AB538FFC0 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 0847D06FD8D970FB3747D3FFE1EF1A98 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  252 + 8F0623242A13E39BB0068F748D5A7819 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 666F2A06D9CC71D500B577D3F48163AF /* Foundation.framework */; };
  253 + 9058F00D7FB0F44089EA7418C9BE80CD /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9998D272F6C21B92ECDBCC87B232F260 /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
237 254 909A12FCA29D66EFCCDEE05DEAA25AD2 /* UIScreen+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = F5253D89927E6E90C258D665347D1F07 /* UIScreen+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
238   - 91EC5D1276C67BD151CE0945E99D346B /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = DF6A0A2DCDCF701127D57F57D20CEE46 /* SDImageHEICCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  255 + 90B45AE4B48040DD4DF7B2521A41FA93 /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = EFFC73CFCA9A8BA73DF3B34FE5E9C8B0 /* UIImage+Metadata.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  256 + 9140B89832569466DC295558951FF9A4 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 14FC848A818168BBB863CFE049B98704 /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  257 + 9212629910630E2F8888272B38EA81E4 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B083F58677FB62CBAA120E34B5932133 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  258 + 92253035C5C62FC047813B453A47011B /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4294BEEA87AE1F76B25087B05E8A9958 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
239 259 92670B7BB6CEA73A198E8A746E1C1CD2 /* YBIBScreenRotationHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 305596E45FD137D2410A689DD199F532 /* YBIBScreenRotationHandler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
240 260 92913C44AD4321D8421DE300F0A9286E /* YYKit.h in Headers */ = {isa = PBXBuildFile; fileRef = F34CC7CBACC2F933C4B4839C7EC1F010 /* YYKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
241 261 936E1D7A3C66AE0EF67123511CD08229 /* CALayer+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A4D5229E0CA5F30FA43F226DA32F462 /* CALayer+YYWebImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
242   - 93EEC3D112C8D5BAF8202BBB7C0F8D40 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 662B362504EE532B6C5EAA6DEDDC5D23 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; };
243   - 95AC0F0E049EC392931B147F1BA4C11E /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9EF0789AEFDBB03D69E8BF132003277 /* ImageIO.framework */; };
  262 + 949BA4CC204D826571EA4E85BA769DB7 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DD0F8422DC31BC404DEB779AA5DB139 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; };
  263 + 95D70798AF08A9AF6AC0455ABAC50B31 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = 03964B173BAD2879E938A697CDE23E58 /* SDWebImageError.h */; settings = {ATTRIBUTES = (Public, ); }; };
244 264 96AB2F6D7AE46198D83ED24B28E00003 /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E06030C0DF9E059A44DC7D324FA93760 /* NSObject+YYModel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
245 265 96FDF5B7C780A120B66EC7342764D4C0 /* NSParagraphStyle+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = BC5FD9E63BBBE388DFDB5D32A946420D /* NSParagraphStyle+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; };
246   - 972F3D3004A38B2E91B514317462F912 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E028311EA2C17015A8136F9F9A3DEEEC /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
247 266 9732D149C66794908C965F8C1945C883 /* MKAnnotationView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 23CB6B846F24E05FCCCC37E91C2CF35A /* MKAnnotationView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
248 267 989D406D24C2A82F500CDA7740E72F7F /* YYTextKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CC0CE9E8F82738D36611F6084F5F9C8 /* YYTextKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
249 268 98D3B3E9EA04801317B3AA768D4653AF /* UIPasteboard+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6FAD07C5929BC33D1A767B8226595D /* UIPasteboard+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; };
250 269 991B17A23FB6ED5F941D3DCEEC928568 /* NSBundle+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 9387B514E9488C1E4C98357D42D4112E /* NSBundle+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
251 270 99A675497C0B12DF9BE36547C3D0BEBF /* YYTextEffectWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D190164465C91A9309173CCE20C5764 /* YYTextEffectWindow.h */; settings = {ATTRIBUTES = (Public, ); }; };
252   - 9A0E1A1BFFD28A2746792BE8D568E3AC /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 22D6E01939BAAB30A2190ACA1D161CDB /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
253 271 9A4B6430A6C62258BEE1D59C9F32A3CB /* NSDate+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = A27A22E1F51A515951549616C10A4D43 /* NSDate+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
254   - 9AA98747F0FFCB4629345C58F9DFF9A2 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EB6A999880D99C4B8EAE70EC4D73221 /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  272 + 9A63822674C925980BCE24CF9162F224 /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 507EA85A920020FD53FDF4A254A318F9 /* SDAssociatedObject.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
255 273 9AB3FC2B00EE9E46D879EA2A9DFA6F08 /* NSDictionary+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 36E435B666CD79060C4FCDA32BA104A7 /* NSDictionary+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
256   - 9BE4B66909D27FA2DEE5D7B4DAF83DD5 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = EBAB61DD2D434A28A27FC5DFC9B7D499 /* SDImageCacheConfig.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  274 + 9B0ADFBD0EE010BC1AE32B290FAF2D70 /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = DC9B7833ED252B3A3CDA8CD870E5136B /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
  275 + 9B9C593A401B16CA1F27613B33259116 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0786ADD48518359C5D9C950902C74B70 /* SDWeakProxy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  276 + 9C39FA3EB2A9462B249432F655FC9AA8 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 165A9BD2C6ABE7C53969D2E146053DCC /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
  277 + 9C6F61B6DD8964A03128BB996BCCCDF5 /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D134637245A1D1291AEBC7FA27654E /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
  278 + 9CBF5A5EFC5491417ACEF9D2D6F604DD /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = 77BDAC0316DE945EDC00877B001E3F13 /* UIImage+Transform.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
257 279 9CC0EAE583AE53B63027C788AE199A3A /* UIImage+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = E515123172BB360DF3179CFE108F842C /* UIImage+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
258 280 9E9EF2A2744A9618CBCF3130012C9C83 /* YBIBAnimatedTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 780BD6CD409902FCCA79E07B8449B0DB /* YBIBAnimatedTransition.h */; settings = {ATTRIBUTES = (Public, ); }; };
259   - 9F45ED51FB250F999DF9EEE26706306F /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 78D88E09C574752B379AC19B8561A84F /* SDImageTransformer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
260   - 9F69D6D21857F40138D7EF02C9934F61 /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 23C27D070CBE7191DD5328960C7C772E /* UIImage+MemoryCacheCost.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
261 281 9F72C9269F972EEC75FFB02E1B006D75 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A607C9A3CDD44ED7C4A717482C4D60A3 /* UIKit.framework */; };
262   - 9F8771C9472203AC8A6B882D32E081FD /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F882F7E87C969BC4F446959C4C96507 /* SDImageLoader.h */; settings = {ATTRIBUTES = (Public, ); }; };
263 282 9FB67DB92440E1D202FA1D557981970C /* YYTextDebugOption.m in Sources */ = {isa = PBXBuildFile; fileRef = E904FC5D8903C2F05EA80AE4EB158849 /* YYTextDebugOption.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
264 283 9FFD301A8B71CD3BBAF1B47ABE706FB3 /* YYFileHash.m in Sources */ = {isa = PBXBuildFile; fileRef = 8475110C42C3E42DC61F264C6BE773D6 /* YYFileHash.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
265 284 A0C1E82073BA9A8D5944BEFE15AEC8AD /* YBImageBrowser.h in Headers */ = {isa = PBXBuildFile; fileRef = F871C4EC920DBA02D64392716E35FB37 /* YBImageBrowser.h */; settings = {ATTRIBUTES = (Public, ); }; };
266 285 A0E47F627106545F7381B76B458ED35D /* YYImage.m in Sources */ = {isa = PBXBuildFile; fileRef = F223C16A87C557408148C7C83CCB705A /* YYImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
267 286 A111957E65E970F7FB802F36D821EA1F /* YBIBImageLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7310856B16CA1367B57B8768F5EBC3E9 /* YBIBImageLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };
  287 + A1B62D4B373543D743AC938090EF65F2 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A20F815CD4F1A80CA68C34C3039D331 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; };
268 288 A1F850A263BA608683661E1BA3064F24 /* UIFont+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = D7D005AD047909BDCC633A8A2F44C3E0 /* UIFont+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
269   - A24ECE056F5DC1A130E45CD9DFDDAE9D /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = EB79E7A300B9098CE8EED7EB98A1E5AA /* SDWebImageDefine.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
270   - A522F73D14A2CB4DE43E00754C6D504B /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF8FE9BD2DF30E81C73D0170BA7C814 /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Public, ); }; };
  289 + A26011648EA7CD910788DBBF08C36F32 /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = A1CF482AD1045FF137E38C654A5C5F0A /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
  290 + A3A38FFF99F8F65D21F6526D4D257230 /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = BE3ECDB29BE68019FD7DE942E2F58BD0 /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Public, ); }; };
271 291 A5751911414FBB4525BA661301645A33 /* NSArray+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = A081063D9132D39C1E65F619E8E08758 /* NSArray+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
272 292 A5D50A13E2D93699A6EA10827F821ACE /* YBIBImageData.m in Sources */ = {isa = PBXBuildFile; fileRef = 98AD2B257D836F916F990B6EA6B2E153 /* YBIBImageData.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
273 293 A6985B155E19B64987FD68C5F251A1BC /* YBIBToastView.m in Sources */ = {isa = PBXBuildFile; fileRef = A57EE7627E17C473032D3846ABCB164A /* YBIBToastView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
... ... @@ -275,94 +295,99 @@
275 295 A6EE9E0154F607481961BCD392381B7F /* YYTextArchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7975F0485F6C6908DD6A4D47F50E9D35 /* YYTextArchiver.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
276 296 A7163439672A8E432F330594FBD927D2 /* YYTextDebugOption.h in Headers */ = {isa = PBXBuildFile; fileRef = 854385CF82D745F34597998325666C1D /* YYTextDebugOption.h */; settings = {ATTRIBUTES = (Public, ); }; };
277 297 A7F1C07DCA2C79499E38A78F4C823B88 /* UIControl+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 670ED4D099B5B4C894DE0935874915F0 /* UIControl+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
  298 + A8F9213841A1696CA4E3BAF5B0836F43 /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = B75EE1C0C625093DB3961800DCB992E6 /* SDWebImageDownloaderRequestModifier.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
278 299 A912BA340CE09249C7782B1FFD1365AB /* YYTextMagnifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 88CA615592156E78420567B5D69F5B66 /* YYTextMagnifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
279   - A93168D1B8FE647836641A8FD0960D3F /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D5EFE1BA58FE69FA738DCB9784D3B2E0 /* SDImageLoadersManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
280 300 A96436D0FB439F1F9716DAD1A565FC3F /* YYKVStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = B5756A1321B21D96C7A1AE0F5C4285AB /* YYKVStorage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
281 301 A9BFCA6D140CE8D9F0F30D2D5AF1D3E4 /* YYKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 2472289EA21A4524121647E98565507F /* YYKeychain.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
282   - A9FB0B1C38B3DF1982D4D8F8B3B99A4E /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FB9F487DEA2EE1223E588AF5B7968BBC /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
283 302 AA02D1FC38F23E8ABB8437B0B319FE8F /* NSNumber+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F0147BF35758A94C20B1F24F24622BB /* NSNumber+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
284 303 AA30113B879D83233709E1B94AA29896 /* UIApplication+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = B452E9B587B86C63EE21311C07C2F204 /* UIApplication+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
285   - AA4B92512944686F23ABE5632656872E /* UIColor+HexString.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E4DCEAC007F7F72A2323A6304B0F4A4 /* UIColor+HexString.h */; settings = {ATTRIBUTES = (Private, ); }; };
286   - AAB78C68578015956BFE8A56A7E02BA7 /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 45487E9C2D9132F54E6DD142FDADCBAF /* SDAnimatedImageRep.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
287 304 AB59B214692AA81FF6315061758603C5 /* YYImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E3CBF57D127E6A6C4FD252662C1ADC0 /* YYImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
  305 + AB811350CFBFEC402845394DFB11C5B9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B31C91F7BAC29DAB475F9F033793951 /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
288 306 AF9F20516033D3A05DCC8E8315E30732 /* YYWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C71F70A09014858351E0D2BA6885014 /* YYWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
289 307 B06B32BF6913B604CD51DAC2D7588891 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78B7E54CA0E5B57763E180DBA69E47AF /* CoreFoundation.framework */; };
290   - B0D15842F6D9B27F7E656D6A3D715329 /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = D3B294F209BE90C307D3B79D646A580E /* SDImageCacheDefine.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
291   - B1635A0F2A9E883F5F9478F04F5F9B00 /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C68FD0A33D48BF8511F5E1F0AF5F38C /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
292 308 B1AB6D5391A7C80D83FB9A89E8AF6623 /* YBImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 25741E0D4DAB65C050394B8B05242DD3 /* YBImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
293 309 B2105ECF2F00C51A3EA501A3D674DC5E /* YYFrameImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 49508D684CC827AE070DD761E831114F /* YYFrameImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
294 310 B2187DD11B7BE581B5D3C98681AD1FC6 /* YYWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6107B507ED75C5E7304F9AE9131E04CB /* YYWeakProxy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
295   - B241B25BC7903216B219BCFDD5533ED2 /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = D0BFF09BFCD201810684D60E49FC29B3 /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Private, ); }; };
296 311 B24E0712943BC8C9C7DA39E71877DE59 /* YYTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = AF275D767348041345B5F9C14D9D9CA0 /* YYTextView.h */; settings = {ATTRIBUTES = (Public, ); }; };
297   - B27865F2F8513D2BAF80C119865014B2 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAFBDA5FBFB046872240DAA694DBA9D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; };
298   - B2D122DFC079570A5A257B8FEFE1CF4C /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 604FBD4A36B51CB23593D6E7144E0A66 /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  312 + B34DA9789249B559F7D135CDC3D4FD77 /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = C9B03AE8F74ED6BF9967696B1F29AC24 /* SDImageLoader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
299 313 B3D231FFA03E5AD08EA9DB95CC280BF9 /* UIPasteboard+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = C5ECB9A46117BBECE7ED798130B798AA /* UIPasteboard+YYText.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
300 314 B43AF7085746A2EDF63AC0561FDC5760 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BDA601294E211EE3B9CBED6DC267A5E /* QuartzCore.framework */; };
301 315 B4A6A89B7C7A07DEF548DF0821A5D2A6 /* UITextField+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = F72C19B1352F5752908C2B4982AD0FE4 /* UITextField+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
  316 + B52576B08EFC9D67F218CC2DAC542AF4 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = A2B670A4915027A69D8298ABAE7832C5 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
302 317 B580D3F3050F9BB858FC126353306F2E /* YBIBImageScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = 18D018046653E9BB9680EF2CF10C5FF7 /* YBIBImageScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; };
303 318 B5EBC0334766A76DCFF0C05798C37150 /* YYReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = D233F6DF8E8D5110BD7F6E76747F33D8 /* YYReachability.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  319 + B6A52B7697F15B487F846F3DA1CB3896 /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 176BE9B96FD0004A2FDAD77CA2B59BEF /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
304 320 B6B29A71C36975429AB1368727403423 /* NSNumber+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 7355C552B642A7D227CB76CDCD03E2F8 /* NSNumber+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  321 + B6B6619A760B666DE47643F684DCF92A /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 82CFF2AD22CF5568454DF140CCC1FBC4 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
305 322 B6C28098B1907228C45A14E207D55AFE /* UIImage+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B3D662CF91D27FFEF32389911E85D0 /* UIImage+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
306 323 B7AC252781ACA15FC73AF12490F21160 /* NSTimer+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CE22FC473D05C3D81125FB08264318F /* NSTimer+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
307 324 B7D446CF8E8826A56E6D15929115BE04 /* YBIBGetBaseInfoProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = B7C9B42ACA0B5782A356C5AE7A908B3F /* YBIBGetBaseInfoProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
308   - B81B452FC4B5B6F7812022013E0050F9 /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D7D182C7944184D8687D02BC5895C8A /* SDImageFrame.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
309   - B9EAA2FEBC24879CE426A200D1943850 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E7D951E27DDF1D0327C691AC350863B /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; };
310 325 BA6F7BA03B9D0D30084C3ADE291F6473 /* YBIBVideoTopBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 26B0E0EAD79931B3B4465C9353F4AEE3 /* YBIBVideoTopBar.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
311 326 BC58E6F1DB34E6D18AC043F147EB68A5 /* UIScrollView+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 0849338E27EFD23893C5843535A67BD6 /* UIScrollView+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
312   - C15872A8795C18D17D7CB78D0D2AF5A9 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BF16A9C9A9AF5DDC141A40D41D0467E /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  327 + BD1CC866FEB3E8226394BA640E7FA900 /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C715A63047EF7CF84A44FC37DB4E919 /* SDImageAssetManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  328 + BDACD97A89128CDAECEE9F2C66A68041 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E26822C5FA7DDEE80076B4E7C2728A9 /* SDImageCodersManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
313 329 C15CF0D0B7F57A8BB9EDA5F3A0EB4415 /* YYMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E8D8F6D1F22DBBBCE9CEB97BF76ED5F6 /* YYMemoryCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  330 + C32C3C747D6831244FA97E55D7EBC211 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A70D2708290382BD7D9078C968FDBFD /* SDWebImageError.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
314 331 C336129A2AC12AEED1703E6863707C69 /* NSObject+YYAddForKVO.h in Headers */ = {isa = PBXBuildFile; fileRef = 52BE96D687228A93E19263F07010C4F8 /* NSObject+YYAddForKVO.h */; settings = {ATTRIBUTES = (Public, ); }; };
315   - C50CAA073FFEC5DFDB16A59830E97C95 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = 565EA3FF9DE0069950D12760CD92E6DF /* SDInternalMacros.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
316   - C60409B7C6D34D479F3DC7157194706B /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6821ACBD9902AD3AEC5766052616BEFC /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  332 + C71E6525587D5FFE318A222C092FA6AE /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = F71C63A56CAAF9072729B55B779D9414 /* SDWebImageIndicator.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
317 333 C78E2BB89633512E1E77690E47840731 /* NSString+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 200049C9763118B9DADAC88FB3401C9D /* NSString+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
318   - C8719B604AC23450E05D0E2F5716C8EE /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F59687F8773BB30C3383C0C4473BA5A9 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  334 + C854CD2F89E00E88FB1D6669A770DEE0 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F0B0EB007B67E5D110E4AA7E75CC5E8 /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Public, ); }; };
  335 + C88E97ED465D3973A3D9FD7AE94BDB9A /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E1FACAD68445DC5C8232A29CDDE00106 /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  336 + C8D1A63DACC1ED208C203641C69EEEF1 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 03C7B13F9A65433A2099280BB0853B83 /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
319 337 C907A97665955ECF4DDD418449F11390 /* YBIBScreenRotationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 34FA97BD63CC23B9293C28CC94F1935E /* YBIBScreenRotationHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
320   - C926C81B2AE4D970FF43FA6854DF11B3 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 29332085AB2D0312202A5E4DA9903355 /* SDImageGIFCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  338 + C94DE8F907543852C6C5311CE0A2752A /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 255A9E38BCE069FD5BD5AA7B2554059D /* SDWebImageDownloaderConfig.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
321 339 C9D04AD8C1E863F36DA77847B7DC00FF /* YYTextContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F3722F221BDAC94870B0E9231FE44B7 /* YYTextContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
322   - CA2A04B40C4584BB62EDF451D4691393 /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 82DA1AE31B883B0A558F1A7C451C5411 /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Public, ); }; };
323 340 CA376D8F23487BDFB24C801D2317FD4D /* Pods-YBImageBrowser_DSCnliveShop_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 44A8AA845C7A4050F81BBFEC526B2B62 /* Pods-YBImageBrowser_DSCnliveShop_Example-dummy.m */; };
324   - CB6B765C0485EA0801AC5AD27B988336 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = ACDF74FCCC69765D4B60B3DBEC369C3D /* SDmetamacros.h */; settings = {ATTRIBUTES = (Private, ); }; };
325   - CBEDB718B4AB4391588A9347C9F03C4A /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C86D29287795201B7A91BA858DBC2FB /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  341 + CAD57C741FFBC3EBCA19E4F1891E4FDA /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1019E03A5B1C662AEA03A27BAD9451 /* SDWebImageOptionsProcessor.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  342 + CBA469E2DD8702DECB634A81F850C516 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 3103E35D6924D70FC117A1BFA21077C8 /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
  343 + CC1B7B642CBAEA58A27D410B329E5FFD /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E94B7142D84F4E7AD5A126B60C5056AA /* SDImageCoderHelper.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
326 344 CC66D7F8BA25145CFA356804A0482B18 /* NSKeyedUnarchiver+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = BE4A801C5A9481E70AE53035D5B98760 /* NSKeyedUnarchiver+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
  345 + CCEF1E548BE78064BE12CC29D9977A28 /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = C54648ED166C9850805DF18B9BF1A305 /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Public, ); }; };
327 346 CD03525AD1F8D60C1C0AC8297DE34E11 /* YYTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = C8FC24C723EADE5F3C5975BE2907EB1E /* YYTransaction.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  347 + CD06DC5FCA424D8A0928068BEB8AF2E5 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 491254BCC101B0465D55540272375AB3 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
328 348 CD7563B5139A26E5B8B2587E0D658705 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 666F2A06D9CC71D500B577D3F48163AF /* Foundation.framework */; };
329 349 CDCE6593D130D8CDEDF0B621B0205E1A /* YBIBIconManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 243FDB361CEF50A59E549280ECDFF076 /* YBIBIconManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
330   - CED0ADFAFACBD8EAC91D8FDFAD72CC3D /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 92986682144C6A680D1688CC72DB03EB /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
331   - CF5BBB5AA6B556A33F0FD0CBF107B538 /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C89C4C20801869E17ED28D5BC0002C7 /* SDWebImageCacheKeyFilter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  350 + CF1AA8850ED16C5F49B61BC3A9B13DD7 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E5A710E84F3BA6FCB0CFF41E78AD5CBD /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
  351 + D0725567B7BD18C79A04E5EC9C72249D /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = 8811346772E1C5599090A46F4A2D8681 /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Private, ); }; };
332 352 D0C427F2B55EA4B9699DC5021958111C /* YYWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = BCBF70C32E733B22D48AF84D60FF7B02 /* YYWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
333 353 D0D66AD4AB7E3486337F71C17BF3AD57 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D1A59D21F9903431B185E3E4DF0AFFEF /* CoreText.framework */; };
334 354 D0EE21B9D50E334EAF1A380286222F0C /* NSObject+YYAddForARC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D38FB225790DDA600C42DF52D9CC17F /* NSObject+YYAddForARC.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; };
335 355 D117372BE748F203CB46905AD37E4068 /* UITextField+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FC28E23CABD3BDE6EAB1ACECBE0303A /* UITextField+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
336   - D4C9FCF4108BF46522DA445E47524A6A /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = 45EBF80603A6BB114FFDF460A6A20CC7 /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; };
  356 + D2EDDDAA1E3498604C570DA06526C7BA /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = D2BF5A3EEE1A287B05D28198D9F16C76 /* SDImageFrame.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  357 + D347FCF56E468483A546E1F611DE081C /* SDImageHEICCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = C263B2AFBE7F6297AC0A2DD306AE5B6A /* SDImageHEICCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
  358 + D43B9E05CBF3046EB696F0357E263B54 /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D32E803217C60CD15496E8FBD13FDF /* SDAsyncBlockOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  359 + D4F67B56B3A2910031B248E07BC0FF9F /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = C758F6AA3BEFD52D81A2E68FD89C92BC /* SDImageGIFCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
337 360 D69F7D5FC2B9F449EFD85CD54B17E575 /* YYKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F8E8FC3A2C5BD919F913AD5ED4E1EAC /* YYKit-dummy.m */; };
  361 + D6FDFE95CEDBD0A41D4E16FDB1599FA9 /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DC1F761B34C39B4907D5DB70157ABFC /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
338 362 D7C4871BB56F79A08300DD66AFDCF5DE /* YBIBVideoCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B62F0134660F292CE152D8E39947BD /* YBIBVideoCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
339 363 D827404302AC7E95F7667CC14AE08594 /* YYTextAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 57078E9B88965F537213B04FEDA909B2 /* YYTextAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; };
340   - D84BE358D7B1195BCA3556D7A0003968 /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = C090D5ECCFD39D2D4DF00BFB1D9DAB81 /* UIImage+Metadata.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
341 364 D92524C9E26C07719E07A9786B6B7892 /* SDWebImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C33607D6BC000651FEC30D2EED376D88 /* SDWebImage.framework */; };
342 365 D96C39BA6D0884492E921E34AE5A1C66 /* YBIBVideoData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C3487B98119240E45C8448E84C5F249 /* YBIBVideoData.h */; settings = {ATTRIBUTES = (Public, ); }; };
343   - D9B0AE61DB0C28C1A453C57DBAA9894C /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = BBC835DD376D230B30079993F2F5CDAA /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Public, ); }; };
344 366 D9F2C1489EE9A0E4071E01C3ACC142F2 /* YYTextKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A177B060DEA91DB2671E9EACA4576579 /* YYTextKeyboardManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
345   - DB7CB011D38A0CF4CBA6380FF04F0B61 /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = C54E545CC107D12C2F5AA2887BAF107E /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
346   - DBB84BD7F62230F01B7533CF5DB8E2B8 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 645FAD055E96DC89E3CF7A287A4B4F87 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
  367 + DA1F5EB06521252BF63369AFEF914368 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = D60E08CE2DF723239081CE2F04FA6324 /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; };
  368 + DB42064F83C6224213B940B249FC26FF /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C36986E68072E6D37FC44159464E6E63 /* SDDiskCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  369 + DCDC5264F294AB9A622D368F2F7FA336 /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = 615E0DE04702B1FE637909AB79E77479 /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Public, ); }; };
347 370 DD25E262CDFAD075F62392B989CA6F4B /* YYSentinel.m in Sources */ = {isa = PBXBuildFile; fileRef = 264A3613CC394403F6228A3FD0B83D06 /* YYSentinel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
348   - DDA63B6A16CAEC9EDAB8721409ED65EF /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = CB33D1B5F3A87441C78240849B1BD409 /* NSImage+Compatibility.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  371 + DD784DFACF8863C7D46B9054B0DD7C42 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = FCDCB1EFEE1048CBC6179F66B7E7E6E9 /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
349 372 DDD32790B4BCE5190906DEEED75A5860 /* YBIBVideoData.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DF359196C08E19807F14F0B35AC0E0C /* YBIBVideoData.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
350 373 DDE5067059454F98CD6B2426D61716F7 /* YYAsyncLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B19431AF11994E0CA59423A7DAE3628 /* YYAsyncLayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
  374 + DE311CA167D40330E2B71F4726A6B789 /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D17D294A9F7DCF9895D5A3337D8B886 /* SDDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
351 375 DF369A9EB40F06EEB590C41610BA2A10 /* YYTextRubyAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 517A0A3DCA0C56126084B689FBE105E9 /* YYTextRubyAnnotation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
352   - E05830BFF728135BC1A3FCD86B02AFED /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = A3F033ABEC9F3EFAA01FDA65E76374B4 /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
353   - E159EA4B9CE7CA4EA7CC422F1BB359D0 /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = DCA9751DEFA2CAEA416E397CD0197E4C /* SDMemoryCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
354   - E1A13F65E327E70ED0A0322ED9D4E004 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = EBC3A38B3CF4356703DC4ABF85E1FB8C /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; };
  376 + DFE7857272AA4CDEC686248E790174F9 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CA0E2F59E86C22963A7F42A601D4D9D /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; };
355 377 E2AC119414A24C6B254F4EFD910B6364 /* YBIBImageData+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5356E679669AF6B1D86C87ED02DE9228 /* YBIBImageData+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; };
356 378 E321AD2370258DCF759B1C35DD419F41 /* YBIBOrientationReceiveProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 162ED1D7AFB75ACCB3368BC29019D8E8 /* YBIBOrientationReceiveProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
357   - E4C4C17E15D7F01D31091341E3B22767 /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DE00CB7B46BD9384E27CFF44A22F3D6 /* SDImageCoderHelper.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  379 + E48B7D3309D22470B53A3EB47B6577E7 /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 7025B67B4A01BBCCCFB1958DC25846D2 /* SDWebImageDefine.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
358 380 E655FF4E00EF146816A4A40588F91180 /* YYKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 75DDFEB8B1AD695874CDD5C0116D3C02 /* YYKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
359   - E807BB2D53EF822DDA0109BEB8F33F4B /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 458C3BA863BEC4A0D1766E7096A16EF8 /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
360 381 E932BE7F6FC5497A6F685D0EF875A817 /* YYSpriteSheetImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 220E77F927A6690D18D2E5FD80F7BE63 /* YYSpriteSheetImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
  382 + E9B97B2FD84DF4015AABD7E5978A710F /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E05A254217112511844A5ABAEA26D88 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
361 383 E9E7E25145EFE32065FFB8232DC42D8E /* YYTextAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = A0964A9B921F37553978DBD848A921DC /* YYTextAttribute.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
362   - EBD6DC15D9DA29829CD9A5BA5F2B2A76 /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = E2F6363B89177C5ED56B90058D1B1B9A /* SDImageGraphics.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
363   - EC2A8CA5F7249A4197E707E8008C2CAF /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = EDCF5C73C34D7FE7CBD5AEC45E26DD16 /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Private, ); }; };
  384 + EA50654643EF702D7F2DD17534459EAB /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 8582059F08F05B024B1E63DB97E6FC3D /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; };
  385 + EA5AE4148E9B9228E70EDB7F575D111E /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 0804ADB1BA257EF0FBCE5877305E5CBA /* SDWebImageDownloaderResponseModifier.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  386 + EB634403E13B36687931F62769C04F66 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = DB7A93383CAC54408CD5E5B395011B2E /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; };
  387 + EC14B2E8E460DFC2E4EB78A9FC10117C /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8603634C14CA0EB02BA831268B0C10 /* NSButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
364 388 EC8034BDEF204F42C1F8FD47F69C72C2 /* YBIBCollectionViewLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 74CE5CC75231FB5BA4F8EB1071D6A3B3 /* YBIBCollectionViewLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
365 389 ECAB0BF105639461A59A044E08301859 /* YYTextParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4509C09CF0DD15FBEB1EAF90400333B3 /* YYTextParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
  390 + ED388349310FF50899F3AEB5E2DF0500 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 6721C57EE2049316FC7DFA0EC2F61B33 /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
366 391 ED419C4C5639D374160458959782CECC /* YBIBImageScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DEB9108C68D52B1B6E58D88118E1BCA /* YBIBImageScrollView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
367 392 ED434BACBB1031EB88803A3F3D53D0F2 /* NSDate+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DE54B8C45B333743F49C490C8A51D59 /* NSDate+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
368 393 EE483E73A32B03DDEAFC3D0C7D23A998 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 826A0D9FB100D729C86AB5FF081F6521 /* Accelerate.framework */; };
... ... @@ -371,7 +396,7 @@
371 396 EF0747F501C75F83DED72B2790BE5B5F /* YYTextRubyAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F845FF4245B2F5F6327C08F01B5738F /* YYTextRubyAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; };
372 397 F007745FE5F7A414A2DBD361AA8CC41B /* YYKVStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = F8D3E6C92E8F4DF67950E0380B5C4AD1 /* YYKVStorage.h */; settings = {ATTRIBUTES = (Public, ); }; };
373 398 F01C35CC142BDBE879078A8E52D9DED3 /* YBImageBrowserDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = DE1BA937D17936A4E8CC48CCF258E498 /* YBImageBrowserDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
374   - F0AB74AED6D7C008445C01678F59B54D /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = F4BDDDF94411952465D7BEFFCA8B5C29 /* SDImageAPNGCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  399 + F045BDBF956B9EE5340F3225336EDAC6 /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 92D743407EFB5C298F8E9856F618DE87 /* SDWebImageCacheKeyFilter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
375 400 F160637862E5B0125D069F7929777F1F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 666F2A06D9CC71D500B577D3F48163AF /* Foundation.framework */; };
376 401 F21C9E78F6663605A36593123F851ECF /* YBImageBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = E1BB297824FFFF51C70FA022B56A9D4F /* YBImageBrowser.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
377 402 F2A1EDFD9B0498CA877D75380EB946AB /* YYCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 074CC9782671ADCAC40FE44E9B57EB2D /* YYCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
... ... @@ -379,7 +404,7 @@
379 404 F3A055F58CF9B5A694EB4AABA1E51B11 /* UIScrollView+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = F891D9C6F80528B90027D56EA36CD7DA /* UIScrollView+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
380 405 F3F08BAB397CD4760A921D6FFAB91D09 /* UITableView+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = E0EC1E067A40BD358E24914526274E18 /* UITableView+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; };
381 406 F41DB7D94F86FC028BB3765429E83496 /* UIImageView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = A84A5680B20A545C99B07392B9AA4B21 /* UIImageView+YYWebImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
382   - F4A2A3265060EE0EC36AE153BA2F11F1 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = CB003CB825038F390A91BFD066D5DC11 /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
  407 + F4BE0CAF1D4BF04D766DB4A25AE4A4C2 /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 1062A5D5F16F52CCF19B547AC48CFF6B /* UIColor+SDHexString.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
383 408 F51107CAE592A67C12F6A654AA9DE72B /* YBImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3236EA97B14313391E71CA2593DBB697 /* YBImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
384 409 F57BB6C1959FC38F369D20C3D6280478 /* YBImageBrowserDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 332163CABE8CA20F1CDE74064906F999 /* YBImageBrowserDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
385 410 F6B4A873DB7EFD81739BB935180213F3 /* YYSpriteSheetImage.m in Sources */ = {isa = PBXBuildFile; fileRef = B9C280A5938040751695347877F4D8C2 /* YYSpriteSheetImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
... ... @@ -387,21 +412,16 @@
387 412 F70B261CE6AF733A33E7AF41C5D96628 /* YBIBDataProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 73F109F39280C7548AA77C244ED5675B /* YBIBDataProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
388 413 F7532455FBADCB4B6D671A76A015BCDF /* YYGestureRecognizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 12443FCD2F18C4DFCA505874F97F9BB6 /* YYGestureRecognizer.h */; settings = {ATTRIBUTES = (Public, ); }; };
389 414 F7952C8743A3C3698661727A575F134A /* YYCGUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 90A4B22BA3CB13452A0C80DA86A84A42 /* YYCGUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
390   - F7C220B780BE3FFD43D49EB09A4AA120 /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D25E5ABBC1DC5FB5597B7FD6AF7395A6 /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; };
391   - F855CDFE0F0B48A22F8F0B4CD25E3F2A /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 17822DDCEE5C075412F1B1A731F006F2 /* SDDiskCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
392 415 F881E7F260550EEED2EC9C45749BFC7B /* YBIBContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = F73A399C03844F00743876DD304D6F5F /* YBIBContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; };
393 416 F8F4D168EA046BD783E82D35CD3B114C /* _YYWebImageSetter.m in Sources */ = {isa = PBXBuildFile; fileRef = 52A857F7C6A4B03E17C6CC6873436387 /* _YYWebImageSetter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
394   - F981FD60C717579B06FC77EBE5E3ECEE /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F4A5B2FFD435932DC069C91BA243B8A /* SDWebImageTransition.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
395   - F9CD37EE6DD796D86FAFCE65C106D553 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F7A1C78766D1A651D4233A02DFD21C1 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; };
396   - FA1132270226AEC00FD163A760F5BFDD /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = E8864E2BCB6F0A60BF7660FD5CA61884 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; };
397   - FA626556DE0DB5DBE98269492EB9D858 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E0438EB685599B92473E4BBB56C9271 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
398 417 FA6BA0853D951EDC88B27A2C94306C49 /* Pods-YBImageBrowser_DSCnliveShop_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 65851769AB362F92EB866E5610C88E6C /* Pods-YBImageBrowser_DSCnliveShop_Tests-dummy.m */; };
399   - FB731F3EEA54F44A238FBBFED93D9974 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 42406C450631485B971273EE79B37A12 /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
400   - FC5F561CA670D699F300DDA4FE2D8314 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = FD9DAE7E5EAD3CA463241E107ADB319B /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; };
  418 + FC4DE0456F37E3F47195E5F969314E0F /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA24BB0F92E4A49AC0BE6BF22D67546 /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; };
  419 + FC5E54109CC0090D7CA4492C6225E5BB /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FBBBA584888406A53BBAB4C8E646119 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
401 420 FCDAE4EE1EF7F75A6D9E465032A3EE25 /* UIBarButtonItem+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = B70A20C0814370A0A1C72AE2E522CAEB /* UIBarButtonItem+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
402   - FD42C3773D4CE1E4ED8BC78369EE4898 /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B69A0F6649EAEED316A983843ED5614 /* SDWebImageDownloaderConfig.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
403 421 FEB886C7ED26265911E85FEFEBA8891A /* YBIBVideoActionBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DBD9F3341AE38C875BBD42C62516B07 /* YBIBVideoActionBar.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
404 422 FED2D036DCD6FF18C7AF6E251407E6B2 /* YBIBAnimatedTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 01D57BDAA3D3C2148F62CAB6FCFF0336 /* YBIBAnimatedTransition.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
  423 + FEF33326D4B5B59DFD0CA1DFAD4001FC /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C016044B645AE229C947C4E2E37F78B /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
  424 + FFA5793DBEE9AB3CC5C01F5B6F0B1151 /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 615E844CC98D96DCD6F0EFE36CFF13BF /* SDFileAttributeHelper.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; };
405 425 /* End PBXBuildFile section */
406 426  
407 427 /* Begin PBXContainerItemProxy section */
... ... @@ -464,86 +484,92 @@
464 484 /* End PBXContainerItemProxy section */
465 485  
466 486 /* Begin PBXFileReference section */
467   - 0027B01676377B9218BE8AA537BDAA8A /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/Core/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; };
468 487 01925082D3D68AFAC34FD497668DDF52 /* YBIBTopView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBTopView.h; sourceTree = "<group>"; };
469 488 01D57BDAA3D3C2148F62CAB6FCFF0336 /* YBIBAnimatedTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBAnimatedTransition.m; sourceTree = "<group>"; };
470 489 027369B6DC1B43C3102AE522A00B351F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
471 490 03021F927B254ED434510FB85A91E7DE /* UIApplication+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+YYAdd.h"; path = "YYKit/Base/UIKit/UIApplication+YYAdd.h"; sourceTree = "<group>"; };
472   - 03917DDCF8C121DD56B0AD9B603C2B9D /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/Core/UIImage+GIF.h"; sourceTree = "<group>"; };
  491 + 03964B173BAD2879E938A697CDE23E58 /* SDWebImageError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageError.h; path = SDWebImage/Core/SDWebImageError.h; sourceTree = "<group>"; };
  492 + 03A09A7D80E19CC940BE2323D0536D61 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/Core/UIImage+MultiFormat.h"; sourceTree = "<group>"; };
  493 + 03C7B13F9A65433A2099280BB0853B83 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/Core/UIButton+WebCache.m"; sourceTree = "<group>"; };
473 494 0501ADF2BFD7B3CD05199AEA120542A3 /* NSParagraphStyle+YYText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSParagraphStyle+YYText.m"; path = "YYKit/Text/String/NSParagraphStyle+YYText.m"; sourceTree = "<group>"; };
474 495 05B6665B0FCAC9FA4988670409B6B9EF /* YBImageBrowser+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YBImageBrowser+Internal.h"; sourceTree = "<group>"; };
  496 + 060133C4A0CD84D7E43EA5A6AE35A7BA /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = "<group>"; };
475 497 074CC9782671ADCAC40FE44E9B57EB2D /* YYCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCache.h; path = YYKit/Cache/YYCache.h; sourceTree = "<group>"; };
476   - 0847D06FD8D970FB3747D3FFE1EF1A98 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/Core/UIView+WebCache.h"; sourceTree = "<group>"; };
  498 + 0786ADD48518359C5D9C950902C74B70 /* SDWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWeakProxy.m; path = SDWebImage/Private/SDWeakProxy.m; sourceTree = "<group>"; };
  499 + 0804ADB1BA257EF0FBCE5877305E5CBA /* SDWebImageDownloaderResponseModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderResponseModifier.m; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.m; sourceTree = "<group>"; };
477 500 0849338E27EFD23893C5843535A67BD6 /* UIScrollView+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+YYAdd.m"; path = "YYKit/Base/UIKit/UIScrollView+YYAdd.m"; sourceTree = "<group>"; };
478 501 09221948BA0D8609E66D29534B1637F9 /* Pods-YBImageBrowser_DSCnliveShop_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-YBImageBrowser_DSCnliveShop_Tests-acknowledgements.plist"; sourceTree = "<group>"; };
479 502 09D461072FB1F94116B94C3D35ADC919 /* NSKeyedUnarchiver+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSKeyedUnarchiver+YYAdd.m"; path = "YYKit/Base/Foundation/NSKeyedUnarchiver+YYAdd.m"; sourceTree = "<group>"; };
480 503 09FA23E05944FF1B0AD4A1CAE80AE86E /* YBIBCollectionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBCollectionView.m; sourceTree = "<group>"; };
481   - 0AA629F1636B9E5C1E7779416F41894F /* SDImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoader.m; path = SDWebImage/Core/SDImageLoader.m; sourceTree = "<group>"; };
  504 + 0A70D2708290382BD7D9078C968FDBFD /* SDWebImageError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageError.m; path = SDWebImage/Core/SDWebImageError.m; sourceTree = "<group>"; };
482 505 0B392E50F95AAAED6E6AF60D7A6FBA53 /* UIColor+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+YYAdd.m"; path = "YYKit/Base/UIKit/UIColor+YYAdd.m"; sourceTree = "<group>"; };
483 506 0BA7CBEA43C737A330D9608FE7806297 /* YYCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCache.m; path = YYKit/Cache/YYCache.m; sourceTree = "<group>"; };
484 507 0C9EBF2F4721D7796CABB86E57141312 /* YYTextSelectionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextSelectionView.m; path = YYKit/Text/Component/YYTextSelectionView.m; sourceTree = "<group>"; };
485 508 0D2681FA26C64223B316B544D77AA55D /* Pods_YBImageBrowser_DSCnliveShop_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_YBImageBrowser_DSCnliveShop_Tests.framework; path = "Pods-YBImageBrowser_DSCnliveShop_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
486   - 0D7D182C7944184D8687D02BC5895C8A /* SDImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFrame.m; path = SDWebImage/Core/SDImageFrame.m; sourceTree = "<group>"; };
487   - 0E9E88F1E31A013B69A717855A9A782E /* SDImageCachesManagerOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManagerOperation.h; path = SDWebImage/Private/SDImageCachesManagerOperation.h; sourceTree = "<group>"; };
488 509 0EC1CFF6509F136C99FC9C20BC2F40A9 /* UIView+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+YYAdd.h"; path = "YYKit/Base/UIKit/UIView+YYAdd.h"; sourceTree = "<group>"; };
489 510 0F845FF4245B2F5F6327C08F01B5738F /* YYTextRubyAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextRubyAnnotation.h; path = YYKit/Text/String/YYTextRubyAnnotation.h; sourceTree = "<group>"; };
490   - 0F882F7E87C969BC4F446959C4C96507 /* SDImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoader.h; path = SDWebImage/Core/SDImageLoader.h; sourceTree = "<group>"; };
491 511 101F73BF4899F419E3CC133F2A9180D4 /* YBIBContainerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBContainerView.m; sourceTree = "<group>"; };
492   - 106CDD63C990007C4EBED229576FD0E6 /* SDImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCodersManager.h; path = SDWebImage/Core/SDImageCodersManager.h; sourceTree = "<group>"; };
  512 + 102A8609FE38B44A4F04554766133491 /* SDImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOCoder.m; path = SDWebImage/Core/SDImageIOCoder.m; sourceTree = "<group>"; };
  513 + 1062A5D5F16F52CCF19B547AC48CFF6B /* UIColor+SDHexString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SDHexString.m"; path = "SDWebImage/Private/UIColor+SDHexString.m"; sourceTree = "<group>"; };
  514 + 1072A8A4B2B89ECA95DD401CFB50F108 /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = SDWebImage/Core/SDImageAPNGCoder.m; sourceTree = "<group>"; };
  515 + 115DF10AB89F4BD3959B0760E6FF7F5A /* SDImageTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageTransformer.m; path = SDWebImage/Core/SDImageTransformer.m; sourceTree = "<group>"; };
493 516 1238AEB9DF5C8189A50C5E4E0B74DC2E /* NSObject+YBImageBrowser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NSObject+YBImageBrowser.m"; sourceTree = "<group>"; };
494 517 12443FCD2F18C4DFCA505874F97F9BB6 /* YYGestureRecognizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYGestureRecognizer.h; path = YYKit/Utility/YYGestureRecognizer.h; sourceTree = "<group>"; };
  518 + 1249E97F29FD39E6B5CA9DD3D122921C /* SDImageCacheDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheDefine.m; path = SDWebImage/Core/SDImageCacheDefine.m; sourceTree = "<group>"; };
495 519 1252A4B51C377A0204EA817105C31367 /* YBImageBrowser_DSCnliveShop.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YBImageBrowser_DSCnliveShop.debug.xcconfig; sourceTree = "<group>"; };
  520 + 12B66AB16766AB4060516E7814443E08 /* SDAssociatedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAssociatedObject.h; path = SDWebImage/Private/SDAssociatedObject.h; sourceTree = "<group>"; };
  521 + 13211B603D4A4D4D2724F2C5BB4407D3 /* SDImageGraphics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGraphics.m; path = SDWebImage/Core/SDImageGraphics.m; sourceTree = "<group>"; };
496 522 13CCFEB0FA63FC0D2DCDF8E5B3E3CC33 /* YBIBSentinel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBSentinel.m; sourceTree = "<group>"; };
497 523 13EFE3DD1D702D85B36FB7D106BC163F /* YBIBSheetView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBSheetView.h; sourceTree = "<group>"; };
498 524 13FA3D010FCAB935A4C1E9CC535A7D28 /* YYImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCache.h; path = YYKit/Image/YYImageCache.h; sourceTree = "<group>"; };
499 525 14462A5B7907FCC9A6CC6EAD33842356 /* YBIBPhotoAlbumManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBPhotoAlbumManager.m; sourceTree = "<group>"; };
500   - 14AEC03CE74FA3C1ED22FD08ACDC489F /* SDImageCachesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManager.m; path = SDWebImage/Core/SDImageCachesManager.m; sourceTree = "<group>"; };
501   - 159B608142C5AD0E99E00479F64CDAFE /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; };
  526 + 14EF33DBBD181973544221E30D2DC4B9 /* SDAsyncBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAsyncBlockOperation.h; path = SDWebImage/Private/SDAsyncBlockOperation.h; sourceTree = "<group>"; };
  527 + 14FC848A818168BBB863CFE049B98704 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/Core/SDImageCache.h; sourceTree = "<group>"; };
  528 + 15DA0DE7F827744C2CD1C503B90ED22A /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = "<group>"; };
502 529 162ED1D7AFB75ACCB3368BC29019D8E8 /* YBIBOrientationReceiveProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBOrientationReceiveProtocol.h; sourceTree = "<group>"; };
503   - 17822DDCEE5C075412F1B1A731F006F2 /* SDDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDiskCache.m; path = SDWebImage/Core/SDDiskCache.m; sourceTree = "<group>"; };
  530 + 165A9BD2C6ABE7C53969D2E146053DCC /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/Core/SDWebImageDownloader.h; sourceTree = "<group>"; };
  531 + 176BE9B96FD0004A2FDAD77CA2B59BEF /* SDWebImageIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageIndicator.h; path = SDWebImage/Core/SDWebImageIndicator.h; sourceTree = "<group>"; };
  532 + 1780A6FB6896D6EE58CA176A32A91167 /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = "<group>"; };
  533 + 17C2170C0DA7F6751732A3F6F2D3304C /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = "<group>"; };
504 534 18D018046653E9BB9680EF2CF10C5FF7 /* YBIBImageScrollView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBImageScrollView.h; sourceTree = "<group>"; };
505 535 1A3ACB33EE20D3ACBAED2B2528ACF51B /* YYKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYKit.modulemap; sourceTree = "<group>"; };
506   - 1A7213E5D815346B024AC2C78B59AE7E /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = "<group>"; };
507 536 1ABDD0D167F87048EDFBCF3A1E54B781 /* YYTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextView.m; path = YYKit/Text/YYTextView.m; sourceTree = "<group>"; };
508 537 1BDC88838DB7DE47299D42DFB1449C97 /* UIImageView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+YYWebImage.h"; path = "YYKit/Image/Categories/UIImageView+YYWebImage.h"; sourceTree = "<group>"; };
509 538 1C3487B98119240E45C8448E84C5F249 /* YBIBVideoData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBVideoData.h; sourceTree = "<group>"; };
510   - 1EE818633CBD870C5763EC5A7DEEFEBB /* SDImageHEICCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoder.h; path = SDWebImage/Core/SDImageHEICCoder.h; sourceTree = "<group>"; };
511   - 1FB1475C6AAE3E931553C57D2012437B /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; };
  539 + 1C715A63047EF7CF84A44FC37DB4E919 /* SDImageAssetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAssetManager.m; path = SDWebImage/Private/SDImageAssetManager.m; sourceTree = "<group>"; };
  540 + 1ECDD31DCADBB91FE191C953267FFF2D /* SDInternalMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDInternalMacros.h; path = SDWebImage/Private/SDInternalMacros.h; sourceTree = "<group>"; };
512 541 200049C9763118B9DADAC88FB3401C9D /* NSString+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+YYAdd.m"; path = "YYKit/Base/Foundation/NSString+YYAdd.m"; sourceTree = "<group>"; };
  542 + 20421D13A41D462848F051647414A829 /* UIImage+ExtendedCacheData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ExtendedCacheData.m"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.m"; sourceTree = "<group>"; };
513 543 2058F8BF3995BDEFE75215FA94771AA0 /* UIColor+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+YYAdd.h"; path = "YYKit/Base/UIKit/UIColor+YYAdd.h"; sourceTree = "<group>"; };
514 544 2083BC9AABD59C97DC155E29DC3E9A9F /* NSThread+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSThread+YYAdd.h"; path = "YYKit/Base/Foundation/NSThread+YYAdd.h"; sourceTree = "<group>"; };
515 545 220E77F927A6690D18D2E5FD80F7BE63 /* YYSpriteSheetImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYSpriteSheetImage.h; path = YYKit/Image/YYSpriteSheetImage.h; sourceTree = "<group>"; };
516 546 22CF3B73FF5F5A8C94227088CE5E0FC8 /* YBImageBrowser_DSCnliveShop-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YBImageBrowser_DSCnliveShop-prefix.pch"; sourceTree = "<group>"; };
517   - 22D6E01939BAAB30A2190ACA1D161CDB /* SDWebImageDownloaderConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderConfig.h; path = SDWebImage/Core/SDWebImageDownloaderConfig.h; sourceTree = "<group>"; };
  547 + 232C7410166470C58B9D7DD4BEE465D6 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/Core/SDImageCache.m; sourceTree = "<group>"; };
518 548 235A9602CEADB22A070933C84D790CE0 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; };
519   - 23C27D070CBE7191DD5328960C7C772E /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.m"; sourceTree = "<group>"; };
520 549 23CB6B846F24E05FCCCC37E91C2CF35A /* MKAnnotationView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+YYWebImage.h"; path = "YYKit/Image/Categories/MKAnnotationView+YYWebImage.h"; sourceTree = "<group>"; };
521 550 243FDB361CEF50A59E549280ECDFF076 /* YBIBIconManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBIconManager.h; sourceTree = "<group>"; };
522 551 2472289EA21A4524121647E98565507F /* YYKeychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKeychain.m; path = YYKit/Utility/YYKeychain.m; sourceTree = "<group>"; };
  552 + 255A9E38BCE069FD5BD5AA7B2554059D /* SDWebImageDownloaderConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderConfig.m; path = SDWebImage/Core/SDWebImageDownloaderConfig.m; sourceTree = "<group>"; };
523 553 25741E0D4DAB65C050394B8B05242DD3 /* YBImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBImage.h; sourceTree = "<group>"; };
524   - 2594CEE3269A686FE6A32ADF1ACDA903 /* SDAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageView.m; path = SDWebImage/Core/SDAnimatedImageView.m; sourceTree = "<group>"; };
525 554 264A3613CC394403F6228A3FD0B83D06 /* YYSentinel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYSentinel.m; path = YYKit/Utility/YYSentinel.m; sourceTree = "<group>"; };
526 555 268BFC97CAD611337B98EA380097C255 /* YBIBImageCell+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YBIBImageCell+Internal.h"; sourceTree = "<group>"; };
527 556 26B0E0EAD79931B3B4465C9353F4AEE3 /* YBIBVideoTopBar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBVideoTopBar.m; sourceTree = "<group>"; };
528   - 26EEACAD4CFF038839E5CAE01FC51426 /* SDImageAssetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAssetManager.m; path = SDWebImage/Private/SDImageAssetManager.m; sourceTree = "<group>"; };
529 557 28231517D2EC4777AA0E1F8613912A64 /* YYDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDiskCache.h; path = YYKit/Cache/YYDiskCache.h; sourceTree = "<group>"; };
530 558 282546E77187445CF7EBBDFA4E5CA774 /* YYImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCache.m; path = YYKit/Image/YYImageCache.m; sourceTree = "<group>"; };
531   - 29332085AB2D0312202A5E4DA9903355 /* SDImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGIFCoder.m; path = SDWebImage/Core/SDImageGIFCoder.m; sourceTree = "<group>"; };
532 559 29A3DA3355DD6482745F7763E549FDEC /* YYTimer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTimer.m; path = YYKit/Utility/YYTimer.m; sourceTree = "<group>"; };
533   - 2B9F2CAB3EBC390CC9C5DF6FEB4AE54E /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/Core/UIView+WebCacheOperation.h"; sourceTree = "<group>"; };
534   - 2C6338E013B6CE8A040D3B94EC208F53 /* SDMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDMemoryCache.h; path = SDWebImage/Core/SDMemoryCache.h; sourceTree = "<group>"; };
535   - 2C68FD0A33D48BF8511F5E1F0AF5F38C /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = SDWebImage/Core/SDWebImageCacheKeyFilter.h; sourceTree = "<group>"; };
536 560 2C71F70A09014858351E0D2BA6885014 /* YYWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageManager.h; path = YYKit/Image/YYWebImageManager.h; sourceTree = "<group>"; };
537 561 2CC0CE9E8F82738D36611F6084F5F9C8 /* YYTextKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextKeyboardManager.h; path = YYKit/Text/Component/YYTextKeyboardManager.h; sourceTree = "<group>"; };
538 562 2D2677C218E3A46355C345D95E7DE293 /* YBImageBrowser_DSCnliveShop-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YBImageBrowser_DSCnliveShop-Info.plist"; sourceTree = "<group>"; };
  563 + 2DC1F761B34C39B4907D5DB70157ABFC /* SDImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOCoder.h; path = SDWebImage/Core/SDImageIOCoder.h; sourceTree = "<group>"; };
539 564 2DEA694BF89E27C54D37D6453687E87A /* NSObject+YBImageBrowser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSObject+YBImageBrowser.h"; sourceTree = "<group>"; };
540 565 2DEB9108C68D52B1B6E58D88118E1BCA /* YBIBImageScrollView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBImageScrollView.m; sourceTree = "<group>"; };
541   - 2E14AFE886371F80BB03C9261CAE653A /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; };
  566 + 2DED8461605A23446E943D5B44AC07FB /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; };
  567 + 2E02A020962AA8A983BE9DEF489D5CC5 /* SDImageHEICCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoder.h; path = SDWebImage/Core/SDImageHEICCoder.h; sourceTree = "<group>"; };
542 568 2FA8DD8E17F9BA15127FBA5142430978 /* YBImageBrowser_DSCnliveShop.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YBImageBrowser_DSCnliveShop.release.xcconfig; sourceTree = "<group>"; };
543   - 2FB82601936A52D10C46ABDED4C4D68E /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/Core/UIImage+MultiFormat.m"; sourceTree = "<group>"; };
544   - 2FD9BD14816B4B34D6B032B14FCBCD17 /* SDImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoder.m; path = SDWebImage/Core/SDImageCoder.m; sourceTree = "<group>"; };
  569 + 2FBBBA584888406A53BBAB4C8E646119 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/Core/SDWebImageManager.h; sourceTree = "<group>"; };
545 570 305596E45FD137D2410A689DD199F532 /* YBIBScreenRotationHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBScreenRotationHandler.m; sourceTree = "<group>"; };
546 571 30A5E7177537475E2A71D3D8A0E4C58F /* YBImageBrowser_DSCnliveShop-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YBImageBrowser_DSCnliveShop-umbrella.h"; sourceTree = "<group>"; };
  572 + 3103E35D6924D70FC117A1BFA21077C8 /* SDWebImageDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDefine.h; path = SDWebImage/Core/SDWebImageDefine.h; sourceTree = "<group>"; };
547 573 3236EA97B14313391E71CA2593DBB697 /* YBImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBImage.m; sourceTree = "<group>"; };
548 574 327DD14828A174C897406BB7ACBB30E7 /* YBIBImageCache+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YBIBImageCache+Internal.h"; sourceTree = "<group>"; };
549 575 32AA9B50FD45F8829F9B21411363EC98 /* Pods-YBImageBrowser_DSCnliveShop_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-YBImageBrowser_DSCnliveShop_Example.debug.xcconfig"; sourceTree = "<group>"; };
... ... @@ -552,162 +578,169 @@
552 578 33DBCD81CD9E79FBDBDD1041BC653A17 /* YBIBCopywriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBCopywriter.m; sourceTree = "<group>"; };
553 579 33F8253486294181F468179983E49503 /* YBIBUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBUtilities.h; sourceTree = "<group>"; };
554 580 34FA97BD63CC23B9293C28CC94F1935E /* YBIBScreenRotationHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBScreenRotationHandler.h; sourceTree = "<group>"; };
555   - 35974735D558DD140EC7A519306676BF /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = "<group>"; };
556 581 364A01FADBC877C6C8BC0B9E72655651 /* Pods-YBImageBrowser_DSCnliveShop_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-YBImageBrowser_DSCnliveShop_Tests.modulemap"; sourceTree = "<group>"; };
  582 + 36C8C2D7C7ACA9C26136F7A7D1154082 /* SDImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoder.m; path = SDWebImage/Core/SDImageCoder.m; sourceTree = "<group>"; };
557 583 36E435B666CD79060C4FCDA32BA104A7 /* NSDictionary+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+YYAdd.m"; path = "YYKit/Base/Foundation/NSDictionary+YYAdd.m"; sourceTree = "<group>"; };
558 584 375D9DE1B1D8EB4B9968FB74F25DE792 /* YBIBImageLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBImageLayout.m; sourceTree = "<group>"; };
  585 + 3937A5FCAE6FD5C9CBFD132D61702EB0 /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = "<group>"; };
559 586 39721DF1E2941C5B4B819BD85F2AA60E /* NSNotificationCenter+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNotificationCenter+YYAdd.m"; path = "YYKit/Base/Foundation/NSNotificationCenter+YYAdd.m"; sourceTree = "<group>"; };
560   - 397498F9C1EC4E17B000928E2E9A2551 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; };
561   - 3977DF74625040A3E0128C656F9FA8D0 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/Core/SDWebImageOperation.h; sourceTree = "<group>"; };
562   - 3BAFBDA5FBFB046872240DAA694DBA9D /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = "<group>"; };
  587 + 3A20F815CD4F1A80CA68C34C3039D331 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/Core/UIImage+GIF.h"; sourceTree = "<group>"; };
  588 + 3AEC8F623A6884FBFC7CF8D4309918D7 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; };
563 589 3BDA601294E211EE3B9CBED6DC267A5E /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
564   - 3C89C4C20801869E17ED28D5BC0002C7 /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = SDWebImage/Core/SDWebImageCacheKeyFilter.m; sourceTree = "<group>"; };
  590 + 3C016044B645AE229C947C4E2E37F78B /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = SDWebImage/Core/SDWebImageCacheKeyFilter.h; sourceTree = "<group>"; };
  591 + 3C7A36D864638BFBD8FEE3A451FAC9B3 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/Core/UIImage+GIF.m"; sourceTree = "<group>"; };
  592 + 3CA0E2F59E86C22963A7F42A601D4D9D /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = SDWebImage/Core/SDWebImageCacheSerializer.h; sourceTree = "<group>"; };
565 593 3CE22FC473D05C3D81125FB08264318F /* NSTimer+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSTimer+YYAdd.h"; path = "YYKit/Base/Foundation/NSTimer+YYAdd.h"; sourceTree = "<group>"; };
566 594 3D190164465C91A9309173CCE20C5764 /* YYTextEffectWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextEffectWindow.h; path = YYKit/Text/Component/YYTextEffectWindow.h; sourceTree = "<group>"; };
567 595 3D83880B681055CB94822859FFC3C2B6 /* UIDevice+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIDevice+YYAdd.m"; path = "YYKit/Base/UIKit/UIDevice+YYAdd.m"; sourceTree = "<group>"; };
568 596 3E04E2554A40CC109E87A30B4F4F3587 /* Pods-YBImageBrowser_DSCnliveShop_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-YBImageBrowser_DSCnliveShop_Example.modulemap"; sourceTree = "<group>"; };
  597 + 3E74798ACDDA5B166130859C04575723 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; };
569 598 3F544E13A1E9FD128E0AF79DBF99E602 /* Pods-YBImageBrowser_DSCnliveShop_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-YBImageBrowser_DSCnliveShop_Example.release.xcconfig"; sourceTree = "<group>"; };
570   - 3F679F8EE0717580BF2DF10529B314ED /* SDImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFrame.h; path = SDWebImage/Core/SDImageFrame.h; sourceTree = "<group>"; };
  599 + 3F7D6860C305EDC74687492EDEFC2325 /* SDImageCachesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManager.m; path = SDWebImage/Core/SDImageCachesManager.m; sourceTree = "<group>"; };
571 600 410FD0E1E2173C4AFCCB371FC6932374 /* YYFrameImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYFrameImage.h; path = YYKit/Image/YYFrameImage.h; sourceTree = "<group>"; };
572   - 42406C450631485B971273EE79B37A12 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/Core/UIImageView+WebCache.m"; sourceTree = "<group>"; };
  601 + 4294BEEA87AE1F76B25087B05E8A9958 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/Core/SDWebImageManager.m; sourceTree = "<group>"; };
573 602 431B4699FDBDE9286754313242740273 /* Pods-YBImageBrowser_DSCnliveShop_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-YBImageBrowser_DSCnliveShop_Tests-acknowledgements.markdown"; sourceTree = "<group>"; };
574 603 43D073BDA908719B072B9A52BECCED3D /* NSBundle+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+YYAdd.h"; path = "YYKit/Base/Foundation/NSBundle+YYAdd.h"; sourceTree = "<group>"; };
  604 + 4423F2AF5E01BBBB5F27784F5DA57247 /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/Core/UIImage+ForceDecode.m"; sourceTree = "<group>"; };
575 605 44A8AA845C7A4050F81BBFEC526B2B62 /* Pods-YBImageBrowser_DSCnliveShop_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-YBImageBrowser_DSCnliveShop_Example-dummy.m"; sourceTree = "<group>"; };
576 606 4509C09CF0DD15FBEB1EAF90400333B3 /* YYTextParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextParser.h; path = YYKit/Text/String/YYTextParser.h; sourceTree = "<group>"; };
577   - 4532E0D4D1C1FCB630416F347E791110 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/Core/UIImageView+WebCache.h"; sourceTree = "<group>"; };
578   - 45487E9C2D9132F54E6DD142FDADCBAF /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/Core/SDAnimatedImageRep.m; sourceTree = "<group>"; };
579 607 45819A3D4F8AF3FCF1D0D1AF84EADC51 /* YBIBLoadingView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBLoadingView.m; sourceTree = "<group>"; };
580   - 458C3BA863BEC4A0D1766E7096A16EF8 /* SDAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SDAnimatedImageView+WebCache.h"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.h"; sourceTree = "<group>"; };
581   - 45EBF80603A6BB114FFDF460A6A20CC7 /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = "<group>"; };
582 608 4600030B461C937CF76ADA334E8D6F1B /* YBIBCollectionViewLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBCollectionViewLayout.h; sourceTree = "<group>"; };
583 609 4625B897D5EC65459B29737D53744D1B /* Pods-YBImageBrowser_DSCnliveShop_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-YBImageBrowser_DSCnliveShop_Example-Info.plist"; sourceTree = "<group>"; };
  610 + 467332BA4DF047A604E2AD170D2A9A6C /* SDWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImage.h; path = WebImage/SDWebImage.h; sourceTree = "<group>"; };
584 611 47EBB445DD9ED1E0006BD00439ED755A /* YYSentinel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYSentinel.h; path = YYKit/Utility/YYSentinel.h; sourceTree = "<group>"; };
585   - 480531E7E6576BA8EBC67D80A2410524 /* NSBezierPath+RoundedCorners.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBezierPath+RoundedCorners.h"; path = "SDWebImage/Private/NSBezierPath+RoundedCorners.h"; sourceTree = "<group>"; };
  612 + 491254BCC101B0465D55540272375AB3 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/Core/SDWebImageOperation.h; sourceTree = "<group>"; };
586 613 49508D684CC827AE070DD761E831114F /* YYFrameImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYFrameImage.m; path = YYKit/Image/YYFrameImage.m; sourceTree = "<group>"; };
  614 + 4A1019E03A5B1C662AEA03A27BAD9451 /* SDWebImageOptionsProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOptionsProcessor.m; path = SDWebImage/Core/SDWebImageOptionsProcessor.m; sourceTree = "<group>"; };
  615 + 4B31C91F7BAC29DAB475F9F033793951 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/Core/SDWebImageDownloader.m; sourceTree = "<group>"; };
587 616 4B993C46E9B43AF9AE34EE10D6399802 /* DSYBImageBrowser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSYBImageBrowser.h; path = YBImageBrowser_DSCnliveShop/Classes/DSYBImageBrowser.h; sourceTree = "<group>"; };
588   - 4C86D29287795201B7A91BA858DBC2FB /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/Core/SDImageCache.m; sourceTree = "<group>"; };
  617 + 4C8603634C14CA0EB02BA831268B0C10 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/Core/NSButton+WebCache.m"; sourceTree = "<group>"; };
589 618 4D09FF329509C51C099F07C2BA4EF7A6 /* NSData+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+YYAdd.h"; path = "YYKit/Base/Foundation/NSData+YYAdd.h"; sourceTree = "<group>"; };
590   - 4D82E5E2C22405F57D03467E23EA118F /* SDWebImageError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageError.m; path = SDWebImage/Core/SDWebImageError.m; sourceTree = "<group>"; };
591   - 4E907072812DC6E02160321606CBFFD2 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; };
592   - 4EB6A999880D99C4B8EAE70EC4D73221 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/Core/SDWebImageCompat.m; sourceTree = "<group>"; };
  619 + 4D6746DFA44B1641AE23A50377370530 /* NSImage+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+Compatibility.m"; path = "SDWebImage/Core/NSImage+Compatibility.m"; sourceTree = "<group>"; };
  620 + 4EB5FC7AFB1E5240D21A6FE7DF89E87C /* SDDisplayLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDisplayLink.h; path = SDWebImage/Private/SDDisplayLink.h; sourceTree = "<group>"; };
  621 + 4F30AC9537E6584F35D8DD4C10EDB7B1 /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.m"; sourceTree = "<group>"; };
593 622 4F8E8FC3A2C5BD919F913AD5ED4E1EAC /* YYKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYKit-dummy.m"; sourceTree = "<group>"; };
  623 + 507EA85A920020FD53FDF4A254A318F9 /* SDAssociatedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAssociatedObject.m; path = SDWebImage/Private/SDAssociatedObject.m; sourceTree = "<group>"; };
594 624 50E241CBBD2EF97B17ECA31FEAF181E7 /* UIBarButtonItem+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBarButtonItem+YYAdd.h"; path = "YYKit/Base/UIKit/UIBarButtonItem+YYAdd.h"; sourceTree = "<group>"; };
595 625 517A0A3DCA0C56126084B689FBE105E9 /* YYTextRubyAnnotation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextRubyAnnotation.m; path = YYKit/Text/String/YYTextRubyAnnotation.m; sourceTree = "<group>"; };
596   - 523A9DF244F75BFD8EF7183295D79237 /* SDAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SDAnimatedImageView+WebCache.m"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.m"; sourceTree = "<group>"; };
597 626 52A857F7C6A4B03E17C6CC6873436387 /* _YYWebImageSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _YYWebImageSetter.m; path = YYKit/Image/Categories/_YYWebImageSetter.m; sourceTree = "<group>"; };
598 627 52B62F0134660F292CE152D8E39947BD /* YBIBVideoCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBVideoCell.h; sourceTree = "<group>"; };
599 628 52BE96D687228A93E19263F07010C4F8 /* NSObject+YYAddForKVO.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYAddForKVO.h"; path = "YYKit/Base/Foundation/NSObject+YYAddForKVO.h"; sourceTree = "<group>"; };
600 629 5356E679669AF6B1D86C87ED02DE9228 /* YBIBImageData+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YBIBImageData+Internal.h"; sourceTree = "<group>"; };
  630 + 54932F1D65D4CE3969AD7014585252E6 /* SDDeviceHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDeviceHelper.m; path = SDWebImage/Private/SDDeviceHelper.m; sourceTree = "<group>"; };
  631 + 5566B7FA1592DB68F47F538060773A34 /* SDWebImageDownloaderDecryptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderDecryptor.m; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.m; sourceTree = "<group>"; };
  632 + 5573ECAD013B67C3DCA80D7EFBDE031B /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = "<group>"; };
601 633 55FA14C2DEAB1ED0438F36B2AF930CC1 /* YYClassInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYClassInfo.h; path = YYKit/Model/YYClassInfo.h; sourceTree = "<group>"; };
602 634 563F4DAD613D6C00571FC9D44766124D /* YYImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCoder.m; path = YYKit/Image/YYImageCoder.m; sourceTree = "<group>"; };
603   - 565EA3FF9DE0069950D12760CD92E6DF /* SDInternalMacros.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDInternalMacros.m; path = SDWebImage/Private/SDInternalMacros.m; sourceTree = "<group>"; };
  635 + 57001503938AEFE09B39A90CD56CF65A /* SDDisplayLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDisplayLink.m; path = SDWebImage/Private/SDDisplayLink.m; sourceTree = "<group>"; };
604 636 57078E9B88965F537213B04FEDA909B2 /* YYTextAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextAttribute.h; path = YYKit/Text/String/YYTextAttribute.h; sourceTree = "<group>"; };
605 637 57EF9F7EACD9A4EA29C6C7519AC29E42 /* YYThreadSafeDictionary.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYThreadSafeDictionary.m; path = YYKit/Utility/YYThreadSafeDictionary.m; sourceTree = "<group>"; };
606   - 5820AFD9CB1F531DEEEA85AE53BA9FB1 /* SDImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoderHelper.h; path = SDWebImage/Core/SDImageCoderHelper.h; sourceTree = "<group>"; };
607 638 586579D8B562F5F100F35D60CADAF40B /* CALayer+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+YYWebImage.h"; path = "YYKit/Image/Categories/CALayer+YYWebImage.h"; sourceTree = "<group>"; };
608 639 5A4D5229E0CA5F30FA43F226DA32F462 /* CALayer+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+YYWebImage.m"; path = "YYKit/Image/Categories/CALayer+YYWebImage.m"; sourceTree = "<group>"; };
609 640 5B19431AF11994E0CA59423A7DAE3628 /* YYAsyncLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAsyncLayer.h; path = YYKit/Utility/YYAsyncLayer.h; sourceTree = "<group>"; };
610 641 5C1FEAA05AC81F62B91CF98EA70351DD /* YBIBSentinel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBSentinel.h; sourceTree = "<group>"; };
611   - 5E4DCEAC007F7F72A2323A6304B0F4A4 /* UIColor+HexString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+HexString.h"; path = "SDWebImage/Private/UIColor+HexString.h"; sourceTree = "<group>"; };
612   - 5E7D951E27DDF1D0327C691AC350863B /* SDWebImageOptionsProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOptionsProcessor.h; path = SDWebImage/Core/SDWebImageOptionsProcessor.h; sourceTree = "<group>"; };
  642 + 5D239E8639A886939B6B5EB58FC27342 /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = "<group>"; };
  643 + 5DD0F8422DC31BC404DEB779AA5DB139 /* SDImageTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageTransformer.h; path = SDWebImage/Core/SDImageTransformer.h; sourceTree = "<group>"; };
  644 + 5E05A254217112511844A5ABAEA26D88 /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = "<group>"; };
613 645 5E84B87FDA9D2897071CB2718674F9C6 /* YBImageBrowser_DSCnliveShop.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YBImageBrowser_DSCnliveShop.framework; path = YBImageBrowser_DSCnliveShop.framework; sourceTree = BUILT_PRODUCTS_DIR; };
614   - 604FBD4A36B51CB23593D6E7144E0A66 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/Core/UIButton+WebCache.m"; sourceTree = "<group>"; };
615   - 6076834A27CA897C42FFDA170BDE4715 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/Core/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; };
  646 + 6016CD6764077B1F107BD22483AA7D14 /* SDGraphicsImageRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDGraphicsImageRenderer.h; path = SDWebImage/Core/SDGraphicsImageRenderer.h; sourceTree = "<group>"; };
  647 + 608E04456BC00743986E00E4A8181EA3 /* NSBezierPath+SDRoundedCorners.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBezierPath+SDRoundedCorners.m"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.m"; sourceTree = "<group>"; };
616 648 60FC5BFD7F334913232A59633DEE5138 /* YBIBDefaultWebImageMediator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBDefaultWebImageMediator.m; sourceTree = "<group>"; };
617 649 6107B507ED75C5E7304F9AE9131E04CB /* YYWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWeakProxy.m; path = YYKit/Utility/YYWeakProxy.m; sourceTree = "<group>"; };
  650 + 615E0DE04702B1FE637909AB79E77479 /* UIImage+Transform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Transform.h"; path = "SDWebImage/Core/UIImage+Transform.h"; sourceTree = "<group>"; };
  651 + 615E844CC98D96DCD6F0EFE36CFF13BF /* SDFileAttributeHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDFileAttributeHelper.m; path = SDWebImage/Private/SDFileAttributeHelper.m; sourceTree = "<group>"; };
  652 + 61733D38B2BF61692321B0EAD6CE7AAC /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; };
618 653 618A21680667BDF2F6B320EC659C0C8A /* YBIBAuxiliaryViewHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBAuxiliaryViewHandler.m; sourceTree = "<group>"; };
619   - 631A43488B8C087EA660030CD2484EA9 /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = SDWebImage/Core/SDWebImageCacheSerializer.h; sourceTree = "<group>"; };
  654 + 618EA55D0CE2B6CFE74715E49A256295 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = "<group>"; };
620 655 638CD74411415C9BD0B7940010462593 /* CALayer+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+YYAdd.h"; path = "YYKit/Base/Quartz/CALayer+YYAdd.h"; sourceTree = "<group>"; };
621 656 64533B43DC32C38326C2FB11D3FB17D6 /* YYKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYKit-Info.plist"; sourceTree = "<group>"; };
622   - 645FAD055E96DC89E3CF7A287A4B4F87 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/Core/SDWebImageManager.h; sourceTree = "<group>"; };
  657 + 64D193C84163B92004E21BE9A8A13B71 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/Core/UIView+WebCache.h"; sourceTree = "<group>"; };
  658 + 657DCFEE5B399779371CC2AC2AAAA206 /* SDImageAssetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAssetManager.h; path = SDWebImage/Private/SDImageAssetManager.h; sourceTree = "<group>"; };
623 659 65851769AB362F92EB866E5610C88E6C /* Pods-YBImageBrowser_DSCnliveShop_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-YBImageBrowser_DSCnliveShop_Tests-dummy.m"; sourceTree = "<group>"; };
624   - 662B362504EE532B6C5EAA6DEDDC5D23 /* SDImageTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageTransformer.h; path = SDWebImage/Core/SDImageTransformer.h; sourceTree = "<group>"; };
625 660 666CEBB485FC6B4BC1861FC6F4EE5093 /* YYTextContainerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextContainerView.m; path = YYKit/Text/Component/YYTextContainerView.m; sourceTree = "<group>"; };
626 661 666F2A06D9CC71D500B577D3F48163AF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
627 662 670ED4D099B5B4C894DE0935874915F0 /* UIControl+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIControl+YYAdd.h"; path = "YYKit/Base/UIKit/UIControl+YYAdd.h"; sourceTree = "<group>"; };
628   - 6821ACBD9902AD3AEC5766052616BEFC /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = "<group>"; };
  663 + 6721C57EE2049316FC7DFA0EC2F61B33 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/Core/SDWebImagePrefetcher.m; sourceTree = "<group>"; };
629 664 68D2A3CB6FA504A7585BD0C033C2860D /* YBIBDefaultWebImageMediator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBDefaultWebImageMediator.h; sourceTree = "<group>"; };
  665 + 69B6E48A6A7BF7FDA397F18D808442A2 /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = "<group>"; };
630 666 6A08FF9357329D825160ABB1311027C9 /* UIBezierPath+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIBezierPath+YYAdd.m"; path = "YYKit/Base/UIKit/UIBezierPath+YYAdd.m"; sourceTree = "<group>"; };
631 667 6A25BC91CE33678DD088B666A283A44A /* UIDevice+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIDevice+YYAdd.h"; path = "YYKit/Base/UIKit/UIDevice+YYAdd.h"; sourceTree = "<group>"; };
632 668 6A37969EF9EE0C673EADF254ACD0FE1C /* UIFont+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIFont+YYAdd.h"; path = "YYKit/Base/UIKit/UIFont+YYAdd.h"; sourceTree = "<group>"; };
633   - 6BF16A9C9A9AF5DDC141A40D41D0467E /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/Core/NSData+ImageContentType.m"; sourceTree = "<group>"; };
634   - 6C25A06B05CE4932A05E03D9A5B91E1A /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = "<group>"; };
635   - 6E0438EB685599B92473E4BBB56C9271 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/Core/SDWebImagePrefetcher.h; sourceTree = "<group>"; };
  669 + 6DB88B001512FB115B60C0A194FAB687 /* SDGraphicsImageRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDGraphicsImageRenderer.m; path = SDWebImage/Core/SDGraphicsImageRenderer.m; sourceTree = "<group>"; };
636 670 6F091181C07B3942FF0C12310A2FD678 /* YYThreadSafeDictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYThreadSafeDictionary.h; path = YYKit/Utility/YYThreadSafeDictionary.h; sourceTree = "<group>"; };
637 671 6F3722F221BDAC94870B0E9231FE44B7 /* YYTextContainerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextContainerView.h; path = YYKit/Text/Component/YYTextContainerView.h; sourceTree = "<group>"; };
638   - 6F4A5B2FFD435932DC069C91BA243B8A /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/Core/SDWebImageTransition.m; sourceTree = "<group>"; };
639   - 6F7A1C78766D1A651D4233A02DFD21C1 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = "<group>"; };
  672 + 7025B67B4A01BBCCCFB1958DC25846D2 /* SDWebImageDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDefine.m; path = SDWebImage/Core/SDWebImageDefine.m; sourceTree = "<group>"; };
  673 + 7136C53C3E86DF97021DEAC46C3AF414 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/Core/SDWebImageTransition.m; sourceTree = "<group>"; };
  674 + 71AEC717DE657C306DC4220359875899 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = "<group>"; };
640 675 7310856B16CA1367B57B8768F5EBC3E9 /* YBIBImageLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBImageLayout.h; sourceTree = "<group>"; };
641 676 7355C552B642A7D227CB76CDCD03E2F8 /* NSNumber+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+YYAdd.m"; path = "YYKit/Base/Foundation/NSNumber+YYAdd.m"; sourceTree = "<group>"; };
642 677 73F109F39280C7548AA77C244ED5675B /* YBIBDataProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBDataProtocol.h; sourceTree = "<group>"; };
643   - 7492D3D26ACA17BE066949BC5402EFA6 /* SDImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOCoder.m; path = SDWebImage/Core/SDImageIOCoder.m; sourceTree = "<group>"; };
644   - 74C01AF8051358A2AD340A5AB3505F28 /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = "<group>"; };
645 678 74C9F42DE0F28AF77F3789C8BD0F8A78 /* YYTransaction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTransaction.h; path = YYKit/Utility/YYTransaction.h; sourceTree = "<group>"; };
646 679 74CE5CC75231FB5BA4F8EB1071D6A3B3 /* YBIBCollectionViewLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBCollectionViewLayout.m; sourceTree = "<group>"; };
647 680 75DDFEB8B1AD695874CDD5C0116D3C02 /* YYKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYKit-umbrella.h"; sourceTree = "<group>"; };
  681 + 77BDAC0316DE945EDC00877B001E3F13 /* UIImage+Transform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Transform.m"; path = "SDWebImage/Core/UIImage+Transform.m"; sourceTree = "<group>"; };
648 682 78025E79C159D1B545ECE0DBDCA36B66 /* Pods-YBImageBrowser_DSCnliveShop_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-YBImageBrowser_DSCnliveShop_Example-acknowledgements.markdown"; sourceTree = "<group>"; };
649 683 780BD6CD409902FCCA79E07B8449B0DB /* YBIBAnimatedTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBAnimatedTransition.h; sourceTree = "<group>"; };
650 684 784B89EF43D57599270D1491D222B2BF /* YYReachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYReachability.h; path = YYKit/Utility/YYReachability.h; sourceTree = "<group>"; };
651 685 78B7E54CA0E5B57763E180DBA69E47AF /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; };
652 686 78C427ED00AF6FA74B7F70468B7F9537 /* YBImageBrowserVideo.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = YBImageBrowserVideo.bundle; path = YBImageBrowser_DSCnliveShop/Assets/YBImageBrowserVideo.bundle; sourceTree = "<group>"; };
653   - 78D88E09C574752B379AC19B8561A84F /* SDImageTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageTransformer.m; path = SDWebImage/Core/SDImageTransformer.m; sourceTree = "<group>"; };
654 687 7975F0485F6C6908DD6A4D47F50E9D35 /* YYTextArchiver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextArchiver.m; path = YYKit/Text/String/YYTextArchiver.m; sourceTree = "<group>"; };
655 688 7A2AD834B988AB862338A88298281712 /* YBImageBrowser.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = YBImageBrowser.bundle; path = YBImageBrowser_DSCnliveShop/Assets/YBImageBrowser.bundle; sourceTree = "<group>"; };
656   - 7A3758E1F2262F48C18DEA44579E7F23 /* SDImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCodersManager.m; path = SDWebImage/Core/SDImageCodersManager.m; sourceTree = "<group>"; };
657 689 7B4A7C95058000CD832DBF4537DCFBA4 /* YYTextLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextLayout.m; path = YYKit/Text/Component/YYTextLayout.m; sourceTree = "<group>"; };
658 690 7BE5EE0D085B4C8EE2CDD27B25526D0D /* YYTextLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextLayout.h; path = YYKit/Text/Component/YYTextLayout.h; sourceTree = "<group>"; };
659   - 7DC9E6937FC0DCAFBFE9BC1CC778D6C9 /* SDImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOCoder.h; path = SDWebImage/Core/SDImageIOCoder.h; sourceTree = "<group>"; };
  691 + 7CA02462DD9F35B55FD8C20DC0A0CDBC /* SDImageIOAnimatedCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoder.h; path = SDWebImage/Core/SDImageIOAnimatedCoder.h; sourceTree = "<group>"; };
  692 + 7E26822C5FA7DDEE80076B4E7C2728A9 /* SDImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCodersManager.m; path = SDWebImage/Core/SDImageCodersManager.m; sourceTree = "<group>"; };
660 693 7E3CBF57D127E6A6C4FD252662C1ADC0 /* YYImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImage.h; path = YYKit/Image/YYImage.h; sourceTree = "<group>"; };
  694 + 7EA2BCD717BF8B6108E49F1344996DCF /* SDWebImageCacheSerializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheSerializer.m; path = SDWebImage/Core/SDWebImageCacheSerializer.m; sourceTree = "<group>"; };
661 695 7F0147BF35758A94C20B1F24F24622BB /* NSNumber+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNumber+YYAdd.h"; path = "YYKit/Base/Foundation/NSNumber+YYAdd.h"; sourceTree = "<group>"; };
662 696 7F0A032626FFA7C226DF55204CF32C5A /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/CoreImage.framework; sourceTree = DEVELOPER_DIR; };
  697 + 7F204DC3ADE5CAA2617773E3A9EFDDBB /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/Core/UIImageView+WebCache.m"; sourceTree = "<group>"; };
663 698 80A4A26F23AC2E0F4F5EBC0F4B53543D /* YBIBDataMediator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBDataMediator.h; sourceTree = "<group>"; };
664   - 81C7DA27208415129BC75A3AE0EC610D /* UIImage+Transform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Transform.m"; path = "SDWebImage/Core/UIImage+Transform.m"; sourceTree = "<group>"; };
665 699 826A0D9FB100D729C86AB5FF081F6521 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; };
666   - 82DA1AE31B883B0A558F1A7C451C5411 /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = "<group>"; };
667   - 843DE7A9D5751B6D1E4B542142E88BE5 /* SDImageCacheDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheDefine.h; path = SDWebImage/Core/SDImageCacheDefine.h; sourceTree = "<group>"; };
  700 + 82CFF2AD22CF5568454DF140CCC1FBC4 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/Core/UIImage+MultiFormat.m"; sourceTree = "<group>"; };
668 701 8475110C42C3E42DC61F264C6BE773D6 /* YYFileHash.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYFileHash.m; path = YYKit/Utility/YYFileHash.m; sourceTree = "<group>"; };
669 702 849AFCF98DA4C75651F5D475A19348D0 /* YBIBImageCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBImageCell.m; sourceTree = "<group>"; };
670   - 85323CE74E87D9048ABFE6CB1D80BCB5 /* SDDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDiskCache.h; path = SDWebImage/Core/SDDiskCache.h; sourceTree = "<group>"; };
671 703 854385CF82D745F34597998325666C1D /* YYTextDebugOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextDebugOption.h; path = YYKit/Text/Component/YYTextDebugOption.h; sourceTree = "<group>"; };
672   - 880ED7B5A8CB58EE4EE46F97AAFC7934 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/Core/SDImageCacheConfig.h; sourceTree = "<group>"; };
  704 + 8582059F08F05B024B1E63DB97E6FC3D /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = "<group>"; };
  705 + 8811346772E1C5599090A46F4A2D8681 /* NSBezierPath+SDRoundedCorners.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBezierPath+SDRoundedCorners.h"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.h"; sourceTree = "<group>"; };
  706 + 885401F9AE5B59CB193871CFBB1551CC /* UIImage+ExtendedCacheData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ExtendedCacheData.h"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.h"; sourceTree = "<group>"; };
673 707 88B3D662CF91D27FFEF32389911E85D0 /* UIImage+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+YYAdd.m"; path = "YYKit/Base/UIKit/UIImage+YYAdd.m"; sourceTree = "<group>"; };
674   - 88B758940E94222028625182D6DD5C48 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/Core/NSButton+WebCache.m"; sourceTree = "<group>"; };
675 708 88CA615592156E78420567B5D69F5B66 /* YYTextMagnifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextMagnifier.h; path = YYKit/Text/Component/YYTextMagnifier.h; sourceTree = "<group>"; };
676 709 89E1C94E51AFCA8ADEB14A14D7E5C910 /* YYTextRunDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextRunDelegate.h; path = YYKit/Text/String/YYTextRunDelegate.h; sourceTree = "<group>"; };
677 710 8B249154A723FBC9D15D68C5DBE38A9D /* YBImageBrowser_DSCnliveShop.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = YBImageBrowser_DSCnliveShop.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
678 711 8B4FF6780DBBE60AA8EAACC09BD33F72 /* Pods-YBImageBrowser_DSCnliveShop_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-YBImageBrowser_DSCnliveShop_Tests-umbrella.h"; sourceTree = "<group>"; };
679   - 8B5C5257F6B18F69C086B439A25052BD /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = "<group>"; };
680   - 8C0EBBBE53B935FF0453555166C8BD82 /* NSImage+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+Compatibility.h"; path = "SDWebImage/Core/NSImage+Compatibility.h"; sourceTree = "<group>"; };
681   - 8D082DCD13F9572880B69B6E5DBA621E /* UIColor+HexString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+HexString.m"; path = "SDWebImage/Private/UIColor+HexString.m"; sourceTree = "<group>"; };
682   - 8D8872339E7C6C556DCFC2B144D97747 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/Core/UIImage+ForceDecode.h"; sourceTree = "<group>"; };
683   - 8DE00CB7B46BD9384E27CFF44A22F3D6 /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = "<group>"; };
  712 + 8D17D294A9F7DCF9895D5A3337D8B886 /* SDDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDiskCache.h; path = SDWebImage/Core/SDDiskCache.h; sourceTree = "<group>"; };
684 713 8DF359196C08E19807F14F0B35AC0E0C /* YBIBVideoData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBVideoData.m; sourceTree = "<group>"; };
685 714 8E1DF05D31C52BDD36D3C352B6D38143 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; };
  715 + 8EADB1874F009D5810228B521E808F8C /* SDAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageView.m; path = SDWebImage/Core/SDAnimatedImageView.m; sourceTree = "<group>"; };
  716 + 8F0B0EB007B67E5D110E4AA7E75CC5E8 /* SDWebImageDownloaderDecryptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderDecryptor.h; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.h; sourceTree = "<group>"; };
  717 + 8F25D99C7ED5F7ECE058950E756B815B /* SDFileAttributeHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDFileAttributeHelper.h; path = SDWebImage/Private/SDFileAttributeHelper.h; sourceTree = "<group>"; };
686 718 90A4B22BA3CB13452A0C80DA86A84A42 /* YYCGUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCGUtilities.h; path = YYKit/Base/Quartz/YYCGUtilities.h; sourceTree = "<group>"; };
687 719 9126743F263F9F3BED4DDDB5EFF3F2C8 /* YYTextArchiver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextArchiver.h; path = YYKit/Text/String/YYTextArchiver.h; sourceTree = "<group>"; };
688 720 91553D071AF4EB06E69E3698FC4BBB17 /* YYKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYKit-prefix.pch"; sourceTree = "<group>"; };
689   - 9190FDE4BAFCFE9EEEC32C362D54FC14 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; };
690   - 92986682144C6A680D1688CC72DB03EB /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/Core/SDImageCache.h; sourceTree = "<group>"; };
  721 + 91C17D860CA95052284F7C9198001DC9 /* SDImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoader.h; path = SDWebImage/Core/SDImageLoader.h; sourceTree = "<group>"; };
  722 + 92D743407EFB5C298F8E9856F618DE87 /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = SDWebImage/Core/SDWebImageCacheKeyFilter.m; sourceTree = "<group>"; };
691 723 9387B514E9488C1E4C98357D42D4112E /* NSBundle+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+YYAdd.m"; path = "YYKit/Base/Foundation/NSBundle+YYAdd.m"; sourceTree = "<group>"; };
692 724 9505B72CDB9E287780696B552708241D /* MKAnnotationView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+YYWebImage.m"; path = "YYKit/Image/Categories/MKAnnotationView+YYWebImage.m"; sourceTree = "<group>"; };
693   - 95D767BEAA3A22D8C4B4F881F593EA55 /* SDAsyncBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAsyncBlockOperation.m; path = SDWebImage/Private/SDAsyncBlockOperation.m; sourceTree = "<group>"; };
694 725 95F7B5AB059394D73D87262D3556EB78 /* YYDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDiskCache.m; path = YYKit/Cache/YYDiskCache.m; sourceTree = "<group>"; };
695 726 96371E9C734320A546704E45E02ED3DE /* YBIBTopView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBTopView.m; sourceTree = "<group>"; };
  727 + 968801418C5808212099C7AAECFD942F /* SDWebImageDownloaderResponseModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderResponseModifier.h; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.h; sourceTree = "<group>"; };
696 728 96B1B4E18C7313B870A3AECA294EED03 /* NSTimer+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSTimer+YYAdd.m"; path = "YYKit/Base/Foundation/NSTimer+YYAdd.m"; sourceTree = "<group>"; };
697 729 97A38E03511200872A6CE102D312DA97 /* YBIBImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBImageCache.m; sourceTree = "<group>"; };
698 730 98AD2B257D836F916F990B6EA6B2E153 /* YBIBImageData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBImageData.m; sourceTree = "<group>"; };
699   - 994DDB7514B65007DB23743EE9419955 /* SDAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImage.m; path = SDWebImage/Core/SDAnimatedImage.m; sourceTree = "<group>"; };
  731 + 9915D39521761F821273ED4AD94F462B /* SDWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWeakProxy.h; path = SDWebImage/Private/SDWeakProxy.h; sourceTree = "<group>"; };
  732 + 9998D272F6C21B92ECDBCC87B232F260 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/Core/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; };
700 733 99C3520C09D1B40E7E268FF0D9C55D3A /* NSAttributedString+YYText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+YYText.m"; path = "YYKit/Text/String/NSAttributedString+YYText.m"; sourceTree = "<group>"; };
701   - 9A2C5A33CC842DF0109E16A40FED6D58 /* SDWebImageOptionsProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOptionsProcessor.m; path = SDWebImage/Core/SDWebImageOptionsProcessor.m; sourceTree = "<group>"; };
702 734 9AD92986443124E1DCE997385B496FB7 /* YBIBIconManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBIconManager.m; sourceTree = "<group>"; };
703 735 9AF2E5796402740EB5340B609872DBEA /* YYMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYMemoryCache.h; path = YYKit/Cache/YYMemoryCache.h; sourceTree = "<group>"; };
704   - 9B69A0F6649EAEED316A983843ED5614 /* SDWebImageDownloaderConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderConfig.m; path = SDWebImage/Core/SDWebImageDownloaderConfig.m; sourceTree = "<group>"; };
  736 + 9B17144987DDC3673503BAA63081322E /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/Core/UIView+WebCacheOperation.h"; sourceTree = "<group>"; };
  737 + 9B374325A4827DE6AA8D86E8A4CA0C0E /* SDAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SDAnimatedImageView+WebCache.h"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.h"; sourceTree = "<group>"; };
705 738 9B794942CBB5B6C0D1CF9F241EB18B3C /* YBIBUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBUtilities.m; sourceTree = "<group>"; };
706 739 9BB872492D04CC4C2B83ACB1537BCB51 /* YYTextSelectionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextSelectionView.h; path = YYKit/Text/Component/YYTextSelectionView.h; sourceTree = "<group>"; };
707 740 9D38FB225790DDA600C42DF52D9CC17F /* NSObject+YYAddForARC.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYAddForARC.m"; path = "YYKit/Base/Foundation/NSObject+YYAddForARC.m"; sourceTree = "<group>"; };
708   - 9D4F696743A974B8507BEF6FB323BB62 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/Core/UIImage+GIF.m"; sourceTree = "<group>"; };
709 741 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
710 742 9DBD9F3341AE38C875BBD42C62516B07 /* YBIBVideoActionBar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBVideoActionBar.m; sourceTree = "<group>"; };
  743 + 9DD82D69E6F6CA677C0FD0DB1910BEEB /* UIColor+SDHexString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+SDHexString.h"; path = "SDWebImage/Private/UIColor+SDHexString.h"; sourceTree = "<group>"; };
711 744 9DE54B8C45B333743F49C490C8A51D59 /* NSDate+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDate+YYAdd.h"; path = "YYKit/Base/Foundation/NSDate+YYAdd.h"; sourceTree = "<group>"; };
712 745 9E6FAD07C5929BC33D1A767B8226595D /* UIPasteboard+YYText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIPasteboard+YYText.h"; path = "YYKit/Text/String/UIPasteboard+YYText.h"; sourceTree = "<group>"; };
713 746 9E718C6C13FF741C9062C0F849A452F2 /* YYTextLine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextLine.h; path = YYKit/Text/Component/YYTextLine.h; sourceTree = "<group>"; };
... ... @@ -719,35 +752,36 @@
719 752 A1341A583321F6A80299E2B2D53093F0 /* YBIBToolViewHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBToolViewHandler.h; sourceTree = "<group>"; };
720 753 A177B060DEA91DB2671E9EACA4576579 /* YYTextKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextKeyboardManager.m; path = YYKit/Text/Component/YYTextKeyboardManager.m; sourceTree = "<group>"; };
721 754 A182794A8F3D76711F0E02DA7FF03E94 /* UIGestureRecognizer+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIGestureRecognizer+YYAdd.m"; path = "YYKit/Base/UIKit/UIGestureRecognizer+YYAdd.m"; sourceTree = "<group>"; };
  755 + A1CF482AD1045FF137E38C654A5C5F0A /* SDImageCacheDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheDefine.h; path = SDWebImage/Core/SDImageCacheDefine.h; sourceTree = "<group>"; };
722 756 A27A22E1F51A515951549616C10A4D43 /* NSDate+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDate+YYAdd.m"; path = "YYKit/Base/Foundation/NSDate+YYAdd.m"; sourceTree = "<group>"; };
723 757 A297B0A3BB16024B6497BE64883F91E7 /* YYAsyncLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYAsyncLayer.m; path = YYKit/Utility/YYAsyncLayer.m; sourceTree = "<group>"; };
724   - A2EE608D10670E27D666BCB148BE76A8 /* SDImageCachesManagerOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManagerOperation.m; path = SDWebImage/Private/SDImageCachesManagerOperation.m; sourceTree = "<group>"; };
  758 + A2B670A4915027A69D8298ABAE7832C5 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/Core/SDWebImagePrefetcher.h; sourceTree = "<group>"; };
725 759 A328158B7BDCD9B9A54D7D40774FCC54 /* YBIBAuxiliaryViewHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBAuxiliaryViewHandler.h; sourceTree = "<group>"; };
726   - A3F033ABEC9F3EFAA01FDA65E76374B4 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/Core/SDWebImagePrefetcher.m; sourceTree = "<group>"; };
727   - A4015B1017950B192730F1ABF2793542 /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = "<group>"; };
728 760 A483F09FE887E66A6F02B7FCBE79F846 /* YBIBCellProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBCellProtocol.h; sourceTree = "<group>"; };
729 761 A57EE7627E17C473032D3846ABCB164A /* YBIBToastView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBToastView.m; sourceTree = "<group>"; };
730 762 A607C9A3CDD44ED7C4A717482C4D60A3 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
731 763 A76D4662C854612618E547F25B4B90A5 /* _YYWebImageSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _YYWebImageSetter.h; path = YYKit/Image/Categories/_YYWebImageSetter.h; sourceTree = "<group>"; };
  764 + A788FE41CE72DC285C7E12274B2EEA45 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/Core/SDImageCacheConfig.m; sourceTree = "<group>"; };
  765 + A7D134637245A1D1291AEBC7FA27654E /* NSImage+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+Compatibility.h"; path = "SDWebImage/Core/NSImage+Compatibility.h"; sourceTree = "<group>"; };
  766 + A7D32E803217C60CD15496E8FBD13FDF /* SDAsyncBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAsyncBlockOperation.m; path = SDWebImage/Private/SDAsyncBlockOperation.m; sourceTree = "<group>"; };
732 767 A84A5680B20A545C99B07392B9AA4B21 /* UIImageView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+YYWebImage.m"; path = "YYKit/Image/Categories/UIImageView+YYWebImage.m"; sourceTree = "<group>"; };
  768 + A86C89F5D3FD68F631C6AAB3E9FFDB67 /* SDImageGraphics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGraphics.h; path = SDWebImage/Core/SDImageGraphics.h; sourceTree = "<group>"; };
733 769 A8AF070443791A87599C26E1E46E74B1 /* YBIBSheetView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBSheetView.m; sourceTree = "<group>"; };
734 770 AA0DFD4E17C227B014108A94D20370E6 /* YBIBInteractionProfile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBInteractionProfile.m; sourceTree = "<group>"; };
735   - AAF8FE9BD2DF30E81C73D0170BA7C814 /* SDImageGraphics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGraphics.h; path = SDWebImage/Core/SDImageGraphics.h; sourceTree = "<group>"; };
736 771 AB96F3B4BB148DAF41FDE86DF14036F4 /* Pods-YBImageBrowser_DSCnliveShop_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-YBImageBrowser_DSCnliveShop_Example-frameworks.sh"; sourceTree = "<group>"; };
737 772 AC5675312A245FA26DAC5D3DA60C6060 /* YYKitMacro.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKitMacro.h; path = YYKit/Base/YYKitMacro.h; sourceTree = "<group>"; };
738 773 ACB2C18C7F7569D6D85619691655DB76 /* YBIBPhotoAlbumManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBPhotoAlbumManager.h; sourceTree = "<group>"; };
739 774 ACD89195E78715E8E03598ED048B1DB6 /* YBIBVideoTopBar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBVideoTopBar.h; sourceTree = "<group>"; };
740 775 ACDDD031AB39EE10A73CBCA382968C97 /* NSDictionary+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+YYAdd.h"; path = "YYKit/Base/Foundation/NSDictionary+YYAdd.h"; sourceTree = "<group>"; };
741   - ACDF74FCCC69765D4B60B3DBEC369C3D /* SDmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDmetamacros.h; path = SDWebImage/Private/SDmetamacros.h; sourceTree = "<group>"; };
742   - AD998B4EBF0CD700BD542833326015DB /* SDWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImage.h; path = WebImage/SDWebImage.h; sourceTree = "<group>"; };
743   - AD9AD3087AA0C54D99784B1E96B8F385 /* SDWebImageIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageIndicator.h; path = SDWebImage/Core/SDWebImageIndicator.h; sourceTree = "<group>"; };
744 776 ADE583D4B2310B6AB0833BF354A6DC60 /* YBIBVideoActionBar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBVideoActionBar.h; sourceTree = "<group>"; };
745 777 AF18321586C240857382009824EBDB64 /* UIBezierPath+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBezierPath+YYAdd.h"; path = "YYKit/Base/UIKit/UIBezierPath+YYAdd.h"; sourceTree = "<group>"; };
746 778 AF2571FC04AEBB0049E5DF97CA8CB9F1 /* NSAttributedString+YYText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+YYText.h"; path = "YYKit/Text/String/NSAttributedString+YYText.h"; sourceTree = "<group>"; };
747 779 AF275D767348041345B5F9C14D9D9CA0 /* YYTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextView.h; path = YYKit/Text/YYTextView.h; sourceTree = "<group>"; };
  780 + AF3424AF58293B7AECCBA5ADAE1E90EB /* SDAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageView.h; path = SDWebImage/Core/SDAnimatedImageView.h; sourceTree = "<group>"; };
748 781 AFB40C28BD8BD37F15B50CB7E6A20928 /* YBIBOperateBrowserProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBOperateBrowserProtocol.h; sourceTree = "<group>"; };
749 782 AFF0F50B5FE26ED59651D7C8D462D48E /* YBIBDataMediator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBDataMediator.m; sourceTree = "<group>"; };
750 783 B0715021BC19551B9A5D5CB2408E7E2B /* YYWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageOperation.m; path = YYKit/Image/YYWebImageOperation.m; sourceTree = "<group>"; };
  784 + B083F58677FB62CBAA120E34B5932133 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/Core/UIImageView+WebCache.h"; sourceTree = "<group>"; };
751 785 B0B214D775196BA7CA8E17E53048A493 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
752 786 B1A650BD7991FDA4D59B763DC0B897B5 /* NSObject+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYAdd.h"; path = "YYKit/Base/Foundation/NSObject+YYAdd.h"; sourceTree = "<group>"; };
753 787 B1F78325C1CF3117C990E0DBB1443AC4 /* YYTextRunDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextRunDelegate.m; path = YYKit/Text/String/YYTextRunDelegate.m; sourceTree = "<group>"; };
... ... @@ -760,139 +794,145 @@
760 794 B4A1D7FB30E0B1322F08017865D3AED6 /* UIGestureRecognizer+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIGestureRecognizer+YYAdd.h"; path = "YYKit/Base/UIKit/UIGestureRecognizer+YYAdd.h"; sourceTree = "<group>"; };
761 795 B5756A1321B21D96C7A1AE0F5C4285AB /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYKit/Cache/YYKVStorage.m; sourceTree = "<group>"; };
762 796 B5AA17CCA3C4553252CF80AEF70404A8 /* YYTextUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextUtilities.m; path = YYKit/Text/String/YYTextUtilities.m; sourceTree = "<group>"; };
763   - B5F772E2006AB9FCF216A22126D6D46F /* SDImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoder.h; path = SDWebImage/Core/SDImageCoder.h; sourceTree = "<group>"; };
764 797 B63F966DDF9161A1C29525E49D01A94F /* NSData+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+YYAdd.m"; path = "YYKit/Base/Foundation/NSData+YYAdd.m"; sourceTree = "<group>"; };
765 798 B664849B9E38756422D4E0F139369652 /* UIScreen+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScreen+YYAdd.m"; path = "YYKit/Base/UIKit/UIScreen+YYAdd.m"; sourceTree = "<group>"; };
766 799 B693FD0CA179F7A03CC3787C32366CA7 /* YBIBCopywriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBCopywriter.h; sourceTree = "<group>"; };
767 800 B70A20C0814370A0A1C72AE2E522CAEB /* UIBarButtonItem+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIBarButtonItem+YYAdd.m"; path = "YYKit/Base/UIKit/UIBarButtonItem+YYAdd.m"; sourceTree = "<group>"; };
  801 + B75EE1C0C625093DB3961800DCB992E6 /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = "<group>"; };
768 802 B7C9B42ACA0B5782A356C5AE7A908B3F /* YBIBGetBaseInfoProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBGetBaseInfoProtocol.h; sourceTree = "<group>"; };
769   - B836409E7407CD373408BBEE6FB78A56 /* SDImageAssetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAssetManager.h; path = SDWebImage/Private/SDImageAssetManager.h; sourceTree = "<group>"; };
770   - B93B5CB4F97B4C63233C9781D9074385 /* SDWebImageError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageError.h; path = SDWebImage/Core/SDWebImageError.h; sourceTree = "<group>"; };
771 803 B9AB8CA329AC9F81339A2A1B4F0266FE /* YYFileHash.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYFileHash.h; path = YYKit/Utility/YYFileHash.h; sourceTree = "<group>"; };
772 804 B9C280A5938040751695347877F4D8C2 /* YYSpriteSheetImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYSpriteSheetImage.m; path = YYKit/Image/YYSpriteSheetImage.m; sourceTree = "<group>"; };
773 805 B9EF0789AEFDBB03D69E8BF132003277 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; };
774 806 BAC4F1096AC0661BCC97A1690D41356F /* YYAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYAnimatedImageView.m; path = YYKit/Image/YYAnimatedImageView.m; sourceTree = "<group>"; };
775 807 BB6D4086660DB0E2BA9271C5D4780106 /* YBIBToastView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBToastView.h; sourceTree = "<group>"; };
776   - BBC835DD376D230B30079993F2F5CDAA /* SDWebImageDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDefine.h; path = SDWebImage/Core/SDWebImageDefine.h; sourceTree = "<group>"; };
777 808 BC5FD9E63BBBE388DFDB5D32A946420D /* NSParagraphStyle+YYText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSParagraphStyle+YYText.h"; path = "YYKit/Text/String/NSParagraphStyle+YYText.h"; sourceTree = "<group>"; };
778 809 BCBF70C32E733B22D48AF84D60FF7B02 /* YYWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageOperation.h; path = YYKit/Image/YYWebImageOperation.h; sourceTree = "<group>"; };
  810 + BE3ECDB29BE68019FD7DE942E2F58BD0 /* SDWebImageDownloaderConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderConfig.h; path = SDWebImage/Core/SDWebImageDownloaderConfig.h; sourceTree = "<group>"; };
779 811 BE4A801C5A9481E70AE53035D5B98760 /* NSKeyedUnarchiver+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSKeyedUnarchiver+YYAdd.h"; path = "YYKit/Base/Foundation/NSKeyedUnarchiver+YYAdd.h"; sourceTree = "<group>"; };
780   - BF2240205CFBA63D171F27ED059DA17F /* SDImageIOAnimatedCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOAnimatedCoder.m; path = SDWebImage/Core/SDImageIOAnimatedCoder.m; sourceTree = "<group>"; };
781   - C090D5ECCFD39D2D4DF00BFB1D9DAB81 /* UIImage+Metadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Metadata.m"; path = "SDWebImage/Core/UIImage+Metadata.m"; sourceTree = "<group>"; };
782   - C0F853EDBA5EE0AFD5FF80DF4E069774 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/Core/SDWebImageManager.m; sourceTree = "<group>"; };
783 812 C183149AE26EC946A2F3DEA358713217 /* YYLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYLabel.h; path = YYKit/Text/YYLabel.h; sourceTree = "<group>"; };
  813 + C1B3FCC15992E25641767F7CD50BAA99 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = "<group>"; };
  814 + C263B2AFBE7F6297AC0A2DD306AE5B6A /* SDImageHEICCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoderInternal.h; path = SDWebImage/Private/SDImageHEICCoderInternal.h; sourceTree = "<group>"; };
784 815 C2C48205DC5A7E61206B83FBA6C16A03 /* YYKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
785   - C2DE3B8DDA43BF244A83FA3A8E49B9C4 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/Core/SDWebImageDownloader.m; sourceTree = "<group>"; };
786 816 C33607D6BC000651FEC30D2EED376D88 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; };
787   - C343BEA71DA4406F27A27215550DB0CA /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = "<group>"; };
  817 + C36986E68072E6D37FC44159464E6E63 /* SDDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDiskCache.m; path = SDWebImage/Core/SDDiskCache.m; sourceTree = "<group>"; };
788 818 C38664F785477D7E2523617102E1EDC4 /* YBImageBrowser_DSCnliveShop.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YBImageBrowser_DSCnliveShop.modulemap; sourceTree = "<group>"; };
  819 + C43DE0B9900A2DBDABA15312032D955B /* SDImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFrame.h; path = SDWebImage/Core/SDImageFrame.h; sourceTree = "<group>"; };
789 820 C44903C29949935DD57FD35B5C9BF35F /* YYKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYKit.release.xcconfig; sourceTree = "<group>"; };
790 821 C468387A3C29B551DAA6C6AF5145ACB1 /* Pods-YBImageBrowser_DSCnliveShop_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-YBImageBrowser_DSCnliveShop_Tests.debug.xcconfig"; sourceTree = "<group>"; };
791 822 C53CAE703785CC63612BF51D647BF00A /* Pods_YBImageBrowser_DSCnliveShop_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_YBImageBrowser_DSCnliveShop_Example.framework; path = "Pods-YBImageBrowser_DSCnliveShop_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
792   - C54E545CC107D12C2F5AA2887BAF107E /* SDImageIOAnimatedCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoder.h; path = SDWebImage/Core/SDImageIOAnimatedCoder.h; sourceTree = "<group>"; };
  823 + C54648ED166C9850805DF18B9BF1A305 /* UIImage+Metadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Metadata.h"; path = "SDWebImage/Core/UIImage+Metadata.h"; sourceTree = "<group>"; };
  824 + C550536A6B0FFCC49930C911A1A845CA /* SDWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOperation.m; path = SDWebImage/Core/SDWebImageOperation.m; sourceTree = "<group>"; };
793 825 C5ECB9A46117BBECE7ED798130B798AA /* UIPasteboard+YYText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIPasteboard+YYText.m"; path = "YYKit/Text/String/UIPasteboard+YYText.m"; sourceTree = "<group>"; };
  826 + C6064257443573B6B4428384FE55B429 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; };
794 827 C67FA1CF5455B750586F3E50B4AEE6B5 /* YYCGUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCGUtilities.m; path = YYKit/Base/Quartz/YYCGUtilities.m; sourceTree = "<group>"; };
795 828 C687ECF69184AC5484EFA0598E66B804 /* Pods-YBImageBrowser_DSCnliveShop_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-YBImageBrowser_DSCnliveShop_Tests-frameworks.sh"; sourceTree = "<group>"; };
796 829 C6E9A2826ED6D4338904F22C672B4751 /* Pods-YBImageBrowser_DSCnliveShop_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-YBImageBrowser_DSCnliveShop_Tests.release.xcconfig"; sourceTree = "<group>"; };
797 830 C705108BAA5E0F79A36A255F671FD73C /* YBImageBrowser_DSCnliveShop-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YBImageBrowser_DSCnliveShop-dummy.m"; sourceTree = "<group>"; };
  831 + C758F6AA3BEFD52D81A2E68FD89C92BC /* SDImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGIFCoder.m; path = SDWebImage/Core/SDImageGIFCoder.m; sourceTree = "<group>"; };
798 832 C78F1C99D55F3A5B2B595CEAAF59A086 /* Pods-YBImageBrowser_DSCnliveShop_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-YBImageBrowser_DSCnliveShop_Tests-Info.plist"; sourceTree = "<group>"; };
799 833 C805133F6D3AF69C8994E6375F7B7155 /* YYImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCoder.h; path = YYKit/Image/YYImageCoder.h; sourceTree = "<group>"; };
800   - C8CF816C63E5B6559556C778BE819AF4 /* UIImage+Metadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Metadata.h"; path = "SDWebImage/Core/UIImage+Metadata.h"; sourceTree = "<group>"; };
  834 + C8D85332D2674E584830AC6CFE3141FE /* SDInternalMacros.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDInternalMacros.m; path = SDWebImage/Private/SDInternalMacros.m; sourceTree = "<group>"; };
801 835 C8FC24C723EADE5F3C5975BE2907EB1E /* YYTransaction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTransaction.m; path = YYKit/Utility/YYTransaction.m; sourceTree = "<group>"; };
802 836 C95F8792B9A29FF9F37927E606871D5B /* YYThreadSafeArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYThreadSafeArray.h; path = YYKit/Utility/YYThreadSafeArray.h; sourceTree = "<group>"; };
  837 + C9B03AE8F74ED6BF9967696B1F29AC24 /* SDImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoader.m; path = SDWebImage/Core/SDImageLoader.m; sourceTree = "<group>"; };
803 838 C9B5994C44BF5B2184C156762E7CE811 /* UIView+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+YYAdd.m"; path = "YYKit/Base/UIKit/UIView+YYAdd.m"; sourceTree = "<group>"; };
804   - CA2F973E303B162092C59FA182AC2842 /* SDAsyncBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAsyncBlockOperation.h; path = SDWebImage/Private/SDAsyncBlockOperation.h; sourceTree = "<group>"; };
805 839 CA7D546D1F3F75461DF8423D2BF90D68 /* YBIBImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBImageCache.h; sourceTree = "<group>"; };
806 840 CAF78B066BA4AA1500A5DFC15357B69A /* YYTextLine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextLine.m; path = YYKit/Text/Component/YYTextLine.m; sourceTree = "<group>"; };
807   - CB003CB825038F390A91BFD066D5DC11 /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = SDWebImage/Core/SDImageAPNGCoder.h; sourceTree = "<group>"; };
808   - CB33D1B5F3A87441C78240849B1BD409 /* NSImage+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+Compatibility.m"; path = "SDWebImage/Core/NSImage+Compatibility.m"; sourceTree = "<group>"; };
  841 + CB6206FBA44F9BD5BB69EB2338D24399 /* SDAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SDAnimatedImageView+WebCache.m"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.m"; sourceTree = "<group>"; };
809 842 CC069742328B0F99B589CD1E88042C72 /* YBIBImageData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBImageData.h; sourceTree = "<group>"; };
810   - CCFF6195D3943C3B2EE93D641F705287 /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = "<group>"; };
811   - CF824EAADAAA9D61882AC1E95A4FAAC5 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/Core/UIImage+MultiFormat.h"; sourceTree = "<group>"; };
812   - D0BFF09BFCD201810684D60E49FC29B3 /* SDInternalMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDInternalMacros.h; path = SDWebImage/Private/SDInternalMacros.h; sourceTree = "<group>"; };
  843 + CD970A6F82F507060C225F86F7A3F410 /* SDDeviceHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDeviceHelper.h; path = SDWebImage/Private/SDDeviceHelper.h; sourceTree = "<group>"; };
  844 + CDA24BB0F92E4A49AC0BE6BF22D67546 /* SDMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDMemoryCache.h; path = SDWebImage/Core/SDMemoryCache.h; sourceTree = "<group>"; };
  845 + CE599BD66BC1D5DBF2513D84C9CF10D2 /* SDImageLoadersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoadersManager.h; path = SDWebImage/Core/SDImageLoadersManager.h; sourceTree = "<group>"; };
  846 + CEA5120287BD232F4C4CECF7D74E0104 /* SDImageCachesManagerOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManagerOperation.m; path = SDWebImage/Private/SDImageCachesManagerOperation.m; sourceTree = "<group>"; };
  847 + CF05C25EE17396B80BB50C70733D2421 /* SDImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoderHelper.h; path = SDWebImage/Core/SDImageCoderHelper.h; sourceTree = "<group>"; };
  848 + CF9EB80B340726BF23F53617B34B3575 /* SDMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDMemoryCache.m; path = SDWebImage/Core/SDMemoryCache.m; sourceTree = "<group>"; };
  849 + D0DD7284FE8B0C78E070E9DA2D0C46E2 /* SDImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCodersManager.h; path = SDWebImage/Core/SDImageCodersManager.h; sourceTree = "<group>"; };
813 850 D12BADAA1C1EED1E8EFC4C3B586A68EF /* YYTextEffectWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextEffectWindow.m; path = YYKit/Text/Component/YYTextEffectWindow.m; sourceTree = "<group>"; };
  851 + D137AC86EF60C0DD4725A67DBED5F6EC /* SDAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImage.m; path = SDWebImage/Core/SDAnimatedImage.m; sourceTree = "<group>"; };
814 852 D1A59D21F9903431B185E3E4DF0AFFEF /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; };
  853 + D1A63106E180D500BA4681CBFF159C50 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/Core/UIImage+ForceDecode.h"; sourceTree = "<group>"; };
815 854 D233F6DF8E8D5110BD7F6E76747F33D8 /* YYReachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYReachability.m; path = YYKit/Utility/YYReachability.m; sourceTree = "<group>"; };
816   - D25E5ABBC1DC5FB5597B7FD6AF7395A6 /* SDAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageView.h; path = SDWebImage/Core/SDAnimatedImageView.h; sourceTree = "<group>"; };
817 855 D27CB4C11DD858E2346FCDB108967EE5 /* YYTextParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextParser.m; path = YYKit/Text/String/YYTextParser.m; sourceTree = "<group>"; };
818 856 D2A8889944F3D4BE1188A99F60D3CA7A /* YYKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYKit.debug.xcconfig; sourceTree = "<group>"; };
819   - D3B294F209BE90C307D3B79D646A580E /* SDImageCacheDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheDefine.m; path = SDWebImage/Core/SDImageCacheDefine.m; sourceTree = "<group>"; };
  857 + D2BF5A3EEE1A287B05D28198D9F16C76 /* SDImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFrame.m; path = SDWebImage/Core/SDImageFrame.m; sourceTree = "<group>"; };
820 858 D4E670F4B8312D4F2B06ADC2B636AFE4 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; };
821   - D5EFE1BA58FE69FA738DCB9784D3B2E0 /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = "<group>"; };
  859 + D60E08CE2DF723239081CE2F04FA6324 /* SDWebImageOptionsProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOptionsProcessor.h; path = SDWebImage/Core/SDWebImageOptionsProcessor.h; sourceTree = "<group>"; };
822 860 D696C9B3DB7929040B3B11E0888CE4D6 /* UIButton+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+YYWebImage.m"; path = "YYKit/Image/Categories/UIButton+YYWebImage.m"; sourceTree = "<group>"; };
823 861 D7D005AD047909BDCC633A8A2F44C3E0 /* UIFont+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIFont+YYAdd.m"; path = "YYKit/Base/UIKit/UIFont+YYAdd.m"; sourceTree = "<group>"; };
824 862 D90E67DC9CA5A5BBD19018BD64C3ED87 /* YBIBCollectionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBCollectionView.h; sourceTree = "<group>"; };
  863 + D99CAD8BB03A1ED3ACC306DE0083743C /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; };
  864 + DA18D81BDAB5332971532C646A936989 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = "<group>"; };
825 865 DA809AC31169252E62703BD0FBD06EE5 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/AssetsLibrary.framework; sourceTree = DEVELOPER_DIR; };
826   - DCA9751DEFA2CAEA416E397CD0197E4C /* SDMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDMemoryCache.m; path = SDWebImage/Core/SDMemoryCache.m; sourceTree = "<group>"; };
  866 + DB7A93383CAC54408CD5E5B395011B2E /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = "<group>"; };
  867 + DC9B7833ED252B3A3CDA8CD870E5136B /* SDAnimatedImagePlayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImagePlayer.h; path = SDWebImage/Core/SDAnimatedImagePlayer.h; sourceTree = "<group>"; };
827 868 DD5396322ED69A5415D1CCD0B6393CA3 /* UITableView+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+YYAdd.m"; path = "YYKit/Base/UIKit/UITableView+YYAdd.m"; sourceTree = "<group>"; };
828   - DD7EB188DA7D4BC587FE249FF628B51C /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/Core/UIImage+ForceDecode.m"; sourceTree = "<group>"; };
829   - DDF0A0D18F37DBE6D852FCEA2251F1C1 /* UIImage+Transform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Transform.h"; path = "SDWebImage/Core/UIImage+Transform.h"; sourceTree = "<group>"; };
830 869 DE1BA937D17936A4E8CC48CCF258E498 /* YBImageBrowserDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBImageBrowserDataSource.h; sourceTree = "<group>"; };
831 870 DEAEE433C1A4AC2340AD30180CD833DE /* YYAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAnimatedImageView.h; path = YYKit/Image/YYAnimatedImageView.h; sourceTree = "<group>"; };
  871 + DF00E591E4B26D6D1D35456AAE90B1C1 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/Core/SDImageCacheConfig.h; sourceTree = "<group>"; };
832 872 DF010552264134747196B93F7030F079 /* YBIBToolViewHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBIBToolViewHandler.m; sourceTree = "<group>"; };
833   - DF6A0A2DCDCF701127D57F57D20CEE46 /* SDImageHEICCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageHEICCoder.m; path = SDWebImage/Core/SDImageHEICCoder.m; sourceTree = "<group>"; };
  873 + DF0BE15112187DE13F59F20FD37196BF /* SDWebImageTransitionInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransitionInternal.h; path = SDWebImage/Private/SDWebImageTransitionInternal.h; sourceTree = "<group>"; };
834 874 DFF08367FC3C8240577C21AB0C7C45C0 /* Pods-YBImageBrowser_DSCnliveShop_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-YBImageBrowser_DSCnliveShop_Example-acknowledgements.plist"; sourceTree = "<group>"; };
835   - DFFBF564BC41F65FF3EF9F404A3FF8A5 /* NSBezierPath+RoundedCorners.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBezierPath+RoundedCorners.m"; path = "SDWebImage/Private/NSBezierPath+RoundedCorners.m"; sourceTree = "<group>"; };
836   - E028311EA2C17015A8136F9F9A3DEEEC /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/Core/UIButton+WebCache.h"; sourceTree = "<group>"; };
837 875 E06030C0DF9E059A44DC7D324FA93760 /* NSObject+YYModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYModel.m"; path = "YYKit/Model/NSObject+YYModel.m"; sourceTree = "<group>"; };
838 876 E0EC1E067A40BD358E24914526274E18 /* UITableView+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+YYAdd.h"; path = "YYKit/Base/UIKit/UITableView+YYAdd.h"; sourceTree = "<group>"; };
839 877 E11C276295B8B9FBB66B8CFCEDD10534 /* YBIBWebImageMediator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBWebImageMediator.h; sourceTree = "<group>"; };
840 878 E1789ACB2E0A630C9C7419690313D4BD /* YYKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKeychain.h; path = YYKit/Utility/YYKeychain.h; sourceTree = "<group>"; };
841   - E1824D23FFCDBDE557E8BCF4A5D1EB64 /* SDImageHEICCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoderInternal.h; path = SDWebImage/Private/SDImageHEICCoderInternal.h; sourceTree = "<group>"; };
842 879 E1BB297824FFFF51C70FA022B56A9D4F /* YBImageBrowser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = YBImageBrowser.m; sourceTree = "<group>"; };
843 880 E1EF95E26F5A8BC0AD3CEC7DE8D50611 /* NSObject+YYAddForKVO.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYAddForKVO.m"; path = "YYKit/Base/Foundation/NSObject+YYAddForKVO.m"; sourceTree = "<group>"; };
  881 + E1FACAD68445DC5C8232A29CDDE00106 /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = SDWebImage/Core/SDImageAPNGCoder.h; sourceTree = "<group>"; };
844 882 E20C5E35E7CBCF4496931DDD69C93799 /* UIControl+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIControl+YYAdd.m"; path = "YYKit/Base/UIKit/UIControl+YYAdd.m"; sourceTree = "<group>"; };
845   - E2F6363B89177C5ED56B90058D1B1B9A /* SDImageGraphics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGraphics.m; path = SDWebImage/Core/SDImageGraphics.m; sourceTree = "<group>"; };
846 883 E30659E8DA748D0CF9EA5E88C15DA2DA /* YYTextInput.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextInput.m; path = YYKit/Text/Component/YYTextInput.m; sourceTree = "<group>"; };
847 884 E325DCCD357AF9DF2F7C506424659D7E /* YYKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYKit.framework; path = YYKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
848 885 E326D6F0395EE4BAE670CD855A8D0176 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };
849 886 E467579343CF6E084F5AF44750D3B054 /* YYDispatchQueuePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDispatchQueuePool.h; path = YYKit/Utility/YYDispatchQueuePool.h; sourceTree = "<group>"; };
850 887 E515123172BB360DF3179CFE108F842C /* UIImage+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+YYAdd.h"; path = "YYKit/Base/UIKit/UIImage+YYAdd.h"; sourceTree = "<group>"; };
  888 + E5A710E84F3BA6FCB0CFF41E78AD5CBD /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/Core/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; };
851 889 E6549BAAE978C54E9943845A282B7887 /* NSObject+YYAddForARC.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYAddForARC.h"; path = "YYKit/Base/Foundation/NSObject+YYAddForARC.h"; sourceTree = "<group>"; };
852   - E6AC77D76359DA3AB60BBECA32896CFA /* SDWebImageCacheSerializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheSerializer.m; path = SDWebImage/Core/SDWebImageCacheSerializer.m; sourceTree = "<group>"; };
  890 + E6B26DB6EEA41E128F36B8CCD8BA6C90 /* SDAnimatedImagePlayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImagePlayer.m; path = SDWebImage/Core/SDAnimatedImagePlayer.m; sourceTree = "<group>"; };
853 891 E7A8CFE58CA45BE0CF414ED53D7E9831 /* YYTextInput.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextInput.h; path = YYKit/Text/Component/YYTextInput.h; sourceTree = "<group>"; };
854   - E8864E2BCB6F0A60BF7660FD5CA61884 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = "<group>"; };
855 892 E8D8F6D1F22DBBBCE9CEB97BF76ED5F6 /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYKit/Cache/YYMemoryCache.m; sourceTree = "<group>"; };
856 893 E904FC5D8903C2F05EA80AE4EB158849 /* YYTextDebugOption.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextDebugOption.m; path = YYKit/Text/Component/YYTextDebugOption.m; sourceTree = "<group>"; };
  894 + E94B7142D84F4E7AD5A126B60C5056AA /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = "<group>"; };
857 895 E97D1AED9A06E626CDC89DE4248FA2DF /* UIButton+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+YYWebImage.h"; path = "YYKit/Image/Categories/UIButton+YYWebImage.h"; sourceTree = "<group>"; };
858 896 EA76762360977A0F9DF281854B915408 /* WebP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebP.framework; path = Vendor/WebP.framework; sourceTree = "<group>"; };
859   - EB79E7A300B9098CE8EED7EB98A1E5AA /* SDWebImageDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDefine.m; path = SDWebImage/Core/SDWebImageDefine.m; sourceTree = "<group>"; };
860   - EBAB61DD2D434A28A27FC5DFC9B7D499 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/Core/SDImageCacheConfig.m; sourceTree = "<group>"; };
861   - EBC3A38B3CF4356703DC4ABF85E1FB8C /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = "<group>"; };
862 897 EC297FCDA53117783E423EFCF34C4C6C /* YBIBInteractionProfile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBInteractionProfile.h; sourceTree = "<group>"; };
  898 + ECCFB33F5B2FAFCB9059F1EA4872AD5E /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/Core/UIButton+WebCache.h"; sourceTree = "<group>"; };
863 899 ECF2A1D940AD2ABA3D907CE415109326 /* NSNotificationCenter+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNotificationCenter+YYAdd.h"; path = "YYKit/Base/Foundation/NSNotificationCenter+YYAdd.h"; sourceTree = "<group>"; };
864 900 ED78F9035D62E00668B4A848571B55C4 /* YBIBVideoView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBVideoView.h; sourceTree = "<group>"; };
865   - EDCF5C73C34D7FE7CBD5AEC45E26DD16 /* SDWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWeakProxy.h; path = SDWebImage/Private/SDWeakProxy.h; sourceTree = "<group>"; };
866   - EF4C3869889BF6E0FB48DB6D3E50C42B /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = "<group>"; };
  901 + EF282CB27CB176AE4D81EB193162E61C /* SDImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGIFCoder.h; path = SDWebImage/Core/SDImageGIFCoder.h; sourceTree = "<group>"; };
867 902 EF5D08601B4B637FF284E68A8EEC858C /* NSArray+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+YYAdd.h"; path = "YYKit/Base/Foundation/NSArray+YYAdd.h"; sourceTree = "<group>"; };
  903 + EFBE035B06C6B5FC5316B23AA385AEB7 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/Core/NSData+ImageContentType.m"; sourceTree = "<group>"; };
  904 + EFFC73CFCA9A8BA73DF3B34FE5E9C8B0 /* UIImage+Metadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Metadata.m"; path = "SDWebImage/Core/UIImage+Metadata.m"; sourceTree = "<group>"; };
868 905 F0C1D31C0ED9EAF5880440E2214DFB67 /* YBIBLoadingView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBLoadingView.h; sourceTree = "<group>"; };
869 906 F170A24D4E53C3C47A8CE99795457D6A /* Pods-YBImageBrowser_DSCnliveShop_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-YBImageBrowser_DSCnliveShop_Example-umbrella.h"; sourceTree = "<group>"; };
870 907 F223C16A87C557408148C7C83CCB705A /* YYImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImage.m; path = YYKit/Image/YYImage.m; sourceTree = "<group>"; };
871 908 F23B513D9D8F0D3A6E0802706EAAE0A0 /* YYClassInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYClassInfo.m; path = YYKit/Model/YYClassInfo.m; sourceTree = "<group>"; };
872 909 F34CC7CBACC2F933C4B4839C7EC1F010 /* YYKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKit.h; path = YYKit/YYKit.h; sourceTree = "<group>"; };
  910 + F37753D5DA03467158CF8F3BFA52E460 /* SDmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDmetamacros.h; path = SDWebImage/Private/SDmetamacros.h; sourceTree = "<group>"; };
873 911 F3DE1A955E99033B5412502804883E07 /* YYDispatchQueuePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDispatchQueuePool.m; path = YYKit/Utility/YYDispatchQueuePool.m; sourceTree = "<group>"; };
  912 + F3FA042CB9FEAE916F9354DD0FFDC410 /* SDImageCachesManagerOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManagerOperation.h; path = SDWebImage/Private/SDImageCachesManagerOperation.h; sourceTree = "<group>"; };
874 913 F48485AE0CAFC4B57A15BC09F76DF01F /* YBIBVideoCell+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YBIBVideoCell+Internal.h"; sourceTree = "<group>"; };
875   - F4BDDDF94411952465D7BEFFCA8B5C29 /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = SDWebImage/Core/SDImageAPNGCoder.m; sourceTree = "<group>"; };
  914 + F4C26425407B34D7EF26491A3F6C3412 /* SDImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoder.h; path = SDWebImage/Core/SDImageCoder.h; sourceTree = "<group>"; };
876 915 F5253D89927E6E90C258D665347D1F07 /* UIScreen+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScreen+YYAdd.h"; path = "YYKit/Base/UIKit/UIScreen+YYAdd.h"; sourceTree = "<group>"; };
877 916 F5670120F17DFEC029094ABAC2358C59 /* YBIBVideoData+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YBIBVideoData+Internal.h"; sourceTree = "<group>"; };
878   - F59687F8773BB30C3383C0C4473BA5A9 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = "<group>"; };
  917 + F71C63A56CAAF9072729B55B779D9414 /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = "<group>"; };
879 918 F72C19B1352F5752908C2B4982AD0FE4 /* UITextField+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextField+YYAdd.h"; path = "YYKit/Base/UIKit/UITextField+YYAdd.h"; sourceTree = "<group>"; };
880 919 F73A399C03844F00743876DD304D6F5F /* YBIBContainerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBContainerView.h; sourceTree = "<group>"; };
  920 + F73E603FC59F5282264218DA84C3E5B7 /* SDImageHEICCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageHEICCoder.m; path = SDWebImage/Core/SDImageHEICCoder.m; sourceTree = "<group>"; };
881 921 F871C4EC920DBA02D64392716E35FB37 /* YBImageBrowser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBImageBrowser.h; sourceTree = "<group>"; };
882 922 F891D9C6F80528B90027D56EA36CD7DA /* UIScrollView+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+YYAdd.h"; path = "YYKit/Base/UIKit/UIScrollView+YYAdd.h"; sourceTree = "<group>"; };
883 923 F8D3E6C92E8F4DF67950E0380B5C4AD1 /* YYKVStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKVStorage.h; path = YYKit/Cache/YYKVStorage.h; sourceTree = "<group>"; };
884 924 F95AF0A9B4FD11599AC907D5ED78047F /* YBIBImageCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = YBIBImageCell.h; sourceTree = "<group>"; };
885 925 FA31B22A4EC7CB38F40BE6C28871B56C /* NSThread+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSThread+YYAdd.m"; path = "YYKit/Base/Foundation/NSThread+YYAdd.m"; sourceTree = "<group>"; };
886 926 FAAA1659DC5FA259CDDED68F436C2BF1 /* CALayer+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+YYAdd.m"; path = "YYKit/Base/Quartz/CALayer+YYAdd.m"; sourceTree = "<group>"; };
887   - FB9F487DEA2EE1223E588AF5B7968BBC /* SDImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGIFCoder.h; path = SDWebImage/Core/SDImageGIFCoder.h; sourceTree = "<group>"; };
888   - FBAFB1147F9F60F82F67F2F93767AEA8 /* SDImageLoadersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoadersManager.h; path = SDWebImage/Core/SDImageLoadersManager.h; sourceTree = "<group>"; };
889 927 FC399F5E175605828984C7E67A02DD73 /* NSObject+YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYModel.h"; path = "YYKit/Model/NSObject+YYModel.h"; sourceTree = "<group>"; };
890 928 FC526297A9617C4BE9A6F090BD02A7EC /* YYWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageManager.m; path = YYKit/Image/YYWebImageManager.m; sourceTree = "<group>"; };
  929 + FCDCB1EFEE1048CBC6179F66B7E7E6E9 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/Core/SDWebImageCompat.m; sourceTree = "<group>"; };
891 930 FD46990B6EBC034765E7F896D7692AF0 /* NSString+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+YYAdd.h"; path = "YYKit/Base/Foundation/NSString+YYAdd.h"; sourceTree = "<group>"; };
892   - FD9DAE7E5EAD3CA463241E107ADB319B /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/Core/SDWebImageDownloader.h; sourceTree = "<group>"; };
893 931 FDAB2149ED799695566D25A14612AFD4 /* YYWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWeakProxy.h; path = YYKit/Utility/YYWeakProxy.h; sourceTree = "<group>"; };
  932 + FDF39D0D9A539DD852E83070D546838D /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = "<group>"; };
  933 + FE71B363E5C4B1A08ED28F0F030C3610 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/Core/SDAnimatedImageRep.m; sourceTree = "<group>"; };
894 934 FF1FC22A806424A9D295AA3C1785B496 /* NSObject+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYAdd.m"; path = "YYKit/Base/Foundation/NSObject+YYAdd.m"; sourceTree = "<group>"; };
895   - FF96D9B286912D2041A6038E44BF9D78 /* SDWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWeakProxy.m; path = SDWebImage/Private/SDWeakProxy.m; sourceTree = "<group>"; };
  935 + FFC1A8B570BBF9B90CBC65027B601DEE /* SDImageIOAnimatedCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOAnimatedCoder.m; path = SDWebImage/Core/SDImageIOAnimatedCoder.m; sourceTree = "<group>"; };
896 936 /* End PBXFileReference section */
897 937  
898 938 /* Begin PBXFrameworksBuildPhase section */
... ... @@ -931,22 +971,22 @@
931 971 );
932 972 runOnlyForDeploymentPostprocessing = 0;
933 973 };
934   - D63F6433B5D27689683CDCF24F678FE6 /* Frameworks */ = {
  974 + 93E1803EFFB49B8B5D9BE9C3FF15E708 /* Frameworks */ = {
935 975 isa = PBXFrameworksBuildPhase;
936 976 buildActionMask = 2147483647;
937 977 files = (
938   - CD7563B5139A26E5B8B2587E0D658705 /* Foundation.framework in Frameworks */,
939   - D92524C9E26C07719E07A9786B6B7892 /* SDWebImage.framework in Frameworks */,
940   - 60B44F3A94381A9FC25BD53BCDBA7062 /* YYKit.framework in Frameworks */,
  978 + 8F0623242A13E39BB0068F748D5A7819 /* Foundation.framework in Frameworks */,
  979 + 7F47C6E48CDC5A9B788F8EB05D826BE6 /* ImageIO.framework in Frameworks */,
941 980 );
942 981 runOnlyForDeploymentPostprocessing = 0;
943 982 };
944   - ECEA1B04AA580BD337B52CB84D1C00A8 /* Frameworks */ = {
  983 + D63F6433B5D27689683CDCF24F678FE6 /* Frameworks */ = {
945 984 isa = PBXFrameworksBuildPhase;
946 985 buildActionMask = 2147483647;
947 986 files = (
948   - 3B9737EB4BDEA61D7A6D7C2F83ADE16B /* Foundation.framework in Frameworks */,
949   - 95AC0F0E049EC392931B147F1BA4C11E /* ImageIO.framework in Frameworks */,
  987 + CD7563B5139A26E5B8B2587E0D658705 /* Foundation.framework in Frameworks */,
  988 + D92524C9E26C07719E07A9786B6B7892 /* SDWebImage.framework in Frameworks */,
  989 + 60B44F3A94381A9FC25BD53BCDBA7062 /* YYKit.framework in Frameworks */,
950 990 );
951 991 runOnlyForDeploymentPostprocessing = 0;
952 992 };
... ... @@ -1015,6 +1055,154 @@
1015 1055 name = Pod;
1016 1056 sourceTree = "<group>";
1017 1057 };
  1058 + 1A858AEA06D9DB5413EC15E1834061B8 /* Core */ = {
  1059 + isa = PBXGroup;
  1060 + children = (
  1061 + 8811346772E1C5599090A46F4A2D8681 /* NSBezierPath+SDRoundedCorners.h */,
  1062 + 608E04456BC00743986E00E4A8181EA3 /* NSBezierPath+SDRoundedCorners.m */,
  1063 + C1B3FCC15992E25641767F7CD50BAA99 /* NSButton+WebCache.h */,
  1064 + 4C8603634C14CA0EB02BA831268B0C10 /* NSButton+WebCache.m */,
  1065 + DB7A93383CAC54408CD5E5B395011B2E /* NSData+ImageContentType.h */,
  1066 + EFBE035B06C6B5FC5316B23AA385AEB7 /* NSData+ImageContentType.m */,
  1067 + A7D134637245A1D1291AEBC7FA27654E /* NSImage+Compatibility.h */,
  1068 + 4D6746DFA44B1641AE23A50377370530 /* NSImage+Compatibility.m */,
  1069 + 17C2170C0DA7F6751732A3F6F2D3304C /* SDAnimatedImage.h */,
  1070 + D137AC86EF60C0DD4725A67DBED5F6EC /* SDAnimatedImage.m */,
  1071 + DC9B7833ED252B3A3CDA8CD870E5136B /* SDAnimatedImagePlayer.h */,
  1072 + E6B26DB6EEA41E128F36B8CCD8BA6C90 /* SDAnimatedImagePlayer.m */,
  1073 + 71AEC717DE657C306DC4220359875899 /* SDAnimatedImageRep.h */,
  1074 + FE71B363E5C4B1A08ED28F0F030C3610 /* SDAnimatedImageRep.m */,
  1075 + AF3424AF58293B7AECCBA5ADAE1E90EB /* SDAnimatedImageView.h */,
  1076 + 8EADB1874F009D5810228B521E808F8C /* SDAnimatedImageView.m */,
  1077 + 9B374325A4827DE6AA8D86E8A4CA0C0E /* SDAnimatedImageView+WebCache.h */,
  1078 + CB6206FBA44F9BD5BB69EB2338D24399 /* SDAnimatedImageView+WebCache.m */,
  1079 + 12B66AB16766AB4060516E7814443E08 /* SDAssociatedObject.h */,
  1080 + 507EA85A920020FD53FDF4A254A318F9 /* SDAssociatedObject.m */,
  1081 + 14EF33DBBD181973544221E30D2DC4B9 /* SDAsyncBlockOperation.h */,
  1082 + A7D32E803217C60CD15496E8FBD13FDF /* SDAsyncBlockOperation.m */,
  1083 + CD970A6F82F507060C225F86F7A3F410 /* SDDeviceHelper.h */,
  1084 + 54932F1D65D4CE3969AD7014585252E6 /* SDDeviceHelper.m */,
  1085 + 8D17D294A9F7DCF9895D5A3337D8B886 /* SDDiskCache.h */,
  1086 + C36986E68072E6D37FC44159464E6E63 /* SDDiskCache.m */,
  1087 + 4EB5FC7AFB1E5240D21A6FE7DF89E87C /* SDDisplayLink.h */,
  1088 + 57001503938AEFE09B39A90CD56CF65A /* SDDisplayLink.m */,
  1089 + 8F25D99C7ED5F7ECE058950E756B815B /* SDFileAttributeHelper.h */,
  1090 + 615E844CC98D96DCD6F0EFE36CFF13BF /* SDFileAttributeHelper.m */,
  1091 + 6016CD6764077B1F107BD22483AA7D14 /* SDGraphicsImageRenderer.h */,
  1092 + 6DB88B001512FB115B60C0A194FAB687 /* SDGraphicsImageRenderer.m */,
  1093 + E1FACAD68445DC5C8232A29CDDE00106 /* SDImageAPNGCoder.h */,
  1094 + 1072A8A4B2B89ECA95DD401CFB50F108 /* SDImageAPNGCoder.m */,
  1095 + 657DCFEE5B399779371CC2AC2AAAA206 /* SDImageAssetManager.h */,
  1096 + 1C715A63047EF7CF84A44FC37DB4E919 /* SDImageAssetManager.m */,
  1097 + 14FC848A818168BBB863CFE049B98704 /* SDImageCache.h */,
  1098 + 232C7410166470C58B9D7DD4BEE465D6 /* SDImageCache.m */,
  1099 + DF00E591E4B26D6D1D35456AAE90B1C1 /* SDImageCacheConfig.h */,
  1100 + A788FE41CE72DC285C7E12274B2EEA45 /* SDImageCacheConfig.m */,
  1101 + A1CF482AD1045FF137E38C654A5C5F0A /* SDImageCacheDefine.h */,
  1102 + 1249E97F29FD39E6B5CA9DD3D122921C /* SDImageCacheDefine.m */,
  1103 + 5E05A254217112511844A5ABAEA26D88 /* SDImageCachesManager.h */,
  1104 + 3F7D6860C305EDC74687492EDEFC2325 /* SDImageCachesManager.m */,
  1105 + F3FA042CB9FEAE916F9354DD0FFDC410 /* SDImageCachesManagerOperation.h */,
  1106 + CEA5120287BD232F4C4CECF7D74E0104 /* SDImageCachesManagerOperation.m */,
  1107 + F4C26425407B34D7EF26491A3F6C3412 /* SDImageCoder.h */,
  1108 + 36C8C2D7C7ACA9C26136F7A7D1154082 /* SDImageCoder.m */,
  1109 + CF05C25EE17396B80BB50C70733D2421 /* SDImageCoderHelper.h */,
  1110 + E94B7142D84F4E7AD5A126B60C5056AA /* SDImageCoderHelper.m */,
  1111 + D0DD7284FE8B0C78E070E9DA2D0C46E2 /* SDImageCodersManager.h */,
  1112 + 7E26822C5FA7DDEE80076B4E7C2728A9 /* SDImageCodersManager.m */,
  1113 + C43DE0B9900A2DBDABA15312032D955B /* SDImageFrame.h */,
  1114 + D2BF5A3EEE1A287B05D28198D9F16C76 /* SDImageFrame.m */,
  1115 + EF282CB27CB176AE4D81EB193162E61C /* SDImageGIFCoder.h */,
  1116 + C758F6AA3BEFD52D81A2E68FD89C92BC /* SDImageGIFCoder.m */,
  1117 + A86C89F5D3FD68F631C6AAB3E9FFDB67 /* SDImageGraphics.h */,
  1118 + 13211B603D4A4D4D2724F2C5BB4407D3 /* SDImageGraphics.m */,
  1119 + 2E02A020962AA8A983BE9DEF489D5CC5 /* SDImageHEICCoder.h */,
  1120 + F73E603FC59F5282264218DA84C3E5B7 /* SDImageHEICCoder.m */,
  1121 + C263B2AFBE7F6297AC0A2DD306AE5B6A /* SDImageHEICCoderInternal.h */,
  1122 + 7CA02462DD9F35B55FD8C20DC0A0CDBC /* SDImageIOAnimatedCoder.h */,
  1123 + FFC1A8B570BBF9B90CBC65027B601DEE /* SDImageIOAnimatedCoder.m */,
  1124 + 8582059F08F05B024B1E63DB97E6FC3D /* SDImageIOAnimatedCoderInternal.h */,
  1125 + 2DC1F761B34C39B4907D5DB70157ABFC /* SDImageIOCoder.h */,
  1126 + 102A8609FE38B44A4F04554766133491 /* SDImageIOCoder.m */,
  1127 + 91C17D860CA95052284F7C9198001DC9 /* SDImageLoader.h */,
  1128 + C9B03AE8F74ED6BF9967696B1F29AC24 /* SDImageLoader.m */,
  1129 + CE599BD66BC1D5DBF2513D84C9CF10D2 /* SDImageLoadersManager.h */,
  1130 + 5D239E8639A886939B6B5EB58FC27342 /* SDImageLoadersManager.m */,
  1131 + 5DD0F8422DC31BC404DEB779AA5DB139 /* SDImageTransformer.h */,
  1132 + 115DF10AB89F4BD3959B0760E6FF7F5A /* SDImageTransformer.m */,
  1133 + 1ECDD31DCADBB91FE191C953267FFF2D /* SDInternalMacros.h */,
  1134 + C8D85332D2674E584830AC6CFE3141FE /* SDInternalMacros.m */,
  1135 + CDA24BB0F92E4A49AC0BE6BF22D67546 /* SDMemoryCache.h */,
  1136 + CF9EB80B340726BF23F53617B34B3575 /* SDMemoryCache.m */,
  1137 + F37753D5DA03467158CF8F3BFA52E460 /* SDmetamacros.h */,
  1138 + 9915D39521761F821273ED4AD94F462B /* SDWeakProxy.h */,
  1139 + 0786ADD48518359C5D9C950902C74B70 /* SDWeakProxy.m */,
  1140 + 467332BA4DF047A604E2AD170D2A9A6C /* SDWebImage.h */,
  1141 + 3C016044B645AE229C947C4E2E37F78B /* SDWebImageCacheKeyFilter.h */,
  1142 + 92D743407EFB5C298F8E9856F618DE87 /* SDWebImageCacheKeyFilter.m */,
  1143 + 3CA0E2F59E86C22963A7F42A601D4D9D /* SDWebImageCacheSerializer.h */,
  1144 + 7EA2BCD717BF8B6108E49F1344996DCF /* SDWebImageCacheSerializer.m */,
  1145 + 618EA55D0CE2B6CFE74715E49A256295 /* SDWebImageCompat.h */,
  1146 + FCDCB1EFEE1048CBC6179F66B7E7E6E9 /* SDWebImageCompat.m */,
  1147 + 3103E35D6924D70FC117A1BFA21077C8 /* SDWebImageDefine.h */,
  1148 + 7025B67B4A01BBCCCFB1958DC25846D2 /* SDWebImageDefine.m */,
  1149 + 165A9BD2C6ABE7C53969D2E146053DCC /* SDWebImageDownloader.h */,
  1150 + 4B31C91F7BAC29DAB475F9F033793951 /* SDWebImageDownloader.m */,
  1151 + BE3ECDB29BE68019FD7DE942E2F58BD0 /* SDWebImageDownloaderConfig.h */,
  1152 + 255A9E38BCE069FD5BD5AA7B2554059D /* SDWebImageDownloaderConfig.m */,
  1153 + 8F0B0EB007B67E5D110E4AA7E75CC5E8 /* SDWebImageDownloaderDecryptor.h */,
  1154 + 5566B7FA1592DB68F47F538060773A34 /* SDWebImageDownloaderDecryptor.m */,
  1155 + E5A710E84F3BA6FCB0CFF41E78AD5CBD /* SDWebImageDownloaderOperation.h */,
  1156 + 9998D272F6C21B92ECDBCC87B232F260 /* SDWebImageDownloaderOperation.m */,
  1157 + FDF39D0D9A539DD852E83070D546838D /* SDWebImageDownloaderRequestModifier.h */,
  1158 + B75EE1C0C625093DB3961800DCB992E6 /* SDWebImageDownloaderRequestModifier.m */,
  1159 + 968801418C5808212099C7AAECFD942F /* SDWebImageDownloaderResponseModifier.h */,
  1160 + 0804ADB1BA257EF0FBCE5877305E5CBA /* SDWebImageDownloaderResponseModifier.m */,
  1161 + 03964B173BAD2879E938A697CDE23E58 /* SDWebImageError.h */,
  1162 + 0A70D2708290382BD7D9078C968FDBFD /* SDWebImageError.m */,
  1163 + 176BE9B96FD0004A2FDAD77CA2B59BEF /* SDWebImageIndicator.h */,
  1164 + F71C63A56CAAF9072729B55B779D9414 /* SDWebImageIndicator.m */,
  1165 + 2FBBBA584888406A53BBAB4C8E646119 /* SDWebImageManager.h */,
  1166 + 4294BEEA87AE1F76B25087B05E8A9958 /* SDWebImageManager.m */,
  1167 + 491254BCC101B0465D55540272375AB3 /* SDWebImageOperation.h */,
  1168 + C550536A6B0FFCC49930C911A1A845CA /* SDWebImageOperation.m */,
  1169 + D60E08CE2DF723239081CE2F04FA6324 /* SDWebImageOptionsProcessor.h */,
  1170 + 4A1019E03A5B1C662AEA03A27BAD9451 /* SDWebImageOptionsProcessor.m */,
  1171 + A2B670A4915027A69D8298ABAE7832C5 /* SDWebImagePrefetcher.h */,
  1172 + 6721C57EE2049316FC7DFA0EC2F61B33 /* SDWebImagePrefetcher.m */,
  1173 + 060133C4A0CD84D7E43EA5A6AE35A7BA /* SDWebImageTransition.h */,
  1174 + 7136C53C3E86DF97021DEAC46C3AF414 /* SDWebImageTransition.m */,
  1175 + DF0BE15112187DE13F59F20FD37196BF /* SDWebImageTransitionInternal.h */,
  1176 + ECCFB33F5B2FAFCB9059F1EA4872AD5E /* UIButton+WebCache.h */,
  1177 + 03C7B13F9A65433A2099280BB0853B83 /* UIButton+WebCache.m */,
  1178 + 9DD82D69E6F6CA677C0FD0DB1910BEEB /* UIColor+SDHexString.h */,
  1179 + 1062A5D5F16F52CCF19B547AC48CFF6B /* UIColor+SDHexString.m */,
  1180 + 885401F9AE5B59CB193871CFBB1551CC /* UIImage+ExtendedCacheData.h */,
  1181 + 20421D13A41D462848F051647414A829 /* UIImage+ExtendedCacheData.m */,
  1182 + D1A63106E180D500BA4681CBFF159C50 /* UIImage+ForceDecode.h */,
  1183 + 4423F2AF5E01BBBB5F27784F5DA57247 /* UIImage+ForceDecode.m */,
  1184 + 3A20F815CD4F1A80CA68C34C3039D331 /* UIImage+GIF.h */,
  1185 + 3C7A36D864638BFBD8FEE3A451FAC9B3 /* UIImage+GIF.m */,
  1186 + 1780A6FB6896D6EE58CA176A32A91167 /* UIImage+MemoryCacheCost.h */,
  1187 + 4F30AC9537E6584F35D8DD4C10EDB7B1 /* UIImage+MemoryCacheCost.m */,
  1188 + C54648ED166C9850805DF18B9BF1A305 /* UIImage+Metadata.h */,
  1189 + EFFC73CFCA9A8BA73DF3B34FE5E9C8B0 /* UIImage+Metadata.m */,
  1190 + 03A09A7D80E19CC940BE2323D0536D61 /* UIImage+MultiFormat.h */,
  1191 + 82CFF2AD22CF5568454DF140CCC1FBC4 /* UIImage+MultiFormat.m */,
  1192 + 615E0DE04702B1FE637909AB79E77479 /* UIImage+Transform.h */,
  1193 + 77BDAC0316DE945EDC00877B001E3F13 /* UIImage+Transform.m */,
  1194 + C6064257443573B6B4428384FE55B429 /* UIImageView+HighlightedWebCache.h */,
  1195 + D99CAD8BB03A1ED3ACC306DE0083743C /* UIImageView+HighlightedWebCache.m */,
  1196 + B083F58677FB62CBAA120E34B5932133 /* UIImageView+WebCache.h */,
  1197 + 7F204DC3ADE5CAA2617773E3A9EFDDBB /* UIImageView+WebCache.m */,
  1198 + 64D193C84163B92004E21BE9A8A13B71 /* UIView+WebCache.h */,
  1199 + 5573ECAD013B67C3DCA80D7EFBDE031B /* UIView+WebCache.m */,
  1200 + 9B17144987DDC3673503BAA63081322E /* UIView+WebCacheOperation.h */,
  1201 + DA18D81BDAB5332971532C646A936989 /* UIView+WebCacheOperation.m */,
  1202 + );
  1203 + name = Core;
  1204 + sourceTree = "<group>";
  1205 + };
1018 1206 2114D1F9BC187D61883E9A4E077458A4 /* ToolView */ = {
1019 1207 isa = PBXGroup;
1020 1208 children = (
... ... @@ -1067,149 +1255,6 @@
1067 1255 name = Frameworks;
1068 1256 sourceTree = "<group>";
1069 1257 };
1070   - 418B8500CC0BC65A0DE0B609A2F36DA8 /* Core */ = {
1071   - isa = PBXGroup;
1072   - children = (
1073   - 480531E7E6576BA8EBC67D80A2410524 /* NSBezierPath+RoundedCorners.h */,
1074   - DFFBF564BC41F65FF3EF9F404A3FF8A5 /* NSBezierPath+RoundedCorners.m */,
1075   - F59687F8773BB30C3383C0C4473BA5A9 /* NSButton+WebCache.h */,
1076   - 88B758940E94222028625182D6DD5C48 /* NSButton+WebCache.m */,
1077   - EBC3A38B3CF4356703DC4ABF85E1FB8C /* NSData+ImageContentType.h */,
1078   - 6BF16A9C9A9AF5DDC141A40D41D0467E /* NSData+ImageContentType.m */,
1079   - 8C0EBBBE53B935FF0453555166C8BD82 /* NSImage+Compatibility.h */,
1080   - CB33D1B5F3A87441C78240849B1BD409 /* NSImage+Compatibility.m */,
1081   - CCFF6195D3943C3B2EE93D641F705287 /* SDAnimatedImage.h */,
1082   - 994DDB7514B65007DB23743EE9419955 /* SDAnimatedImage.m */,
1083   - 6F7A1C78766D1A651D4233A02DFD21C1 /* SDAnimatedImageRep.h */,
1084   - 45487E9C2D9132F54E6DD142FDADCBAF /* SDAnimatedImageRep.m */,
1085   - D25E5ABBC1DC5FB5597B7FD6AF7395A6 /* SDAnimatedImageView.h */,
1086   - 2594CEE3269A686FE6A32ADF1ACDA903 /* SDAnimatedImageView.m */,
1087   - 458C3BA863BEC4A0D1766E7096A16EF8 /* SDAnimatedImageView+WebCache.h */,
1088   - 523A9DF244F75BFD8EF7183295D79237 /* SDAnimatedImageView+WebCache.m */,
1089   - CA2F973E303B162092C59FA182AC2842 /* SDAsyncBlockOperation.h */,
1090   - 95D767BEAA3A22D8C4B4F881F593EA55 /* SDAsyncBlockOperation.m */,
1091   - 85323CE74E87D9048ABFE6CB1D80BCB5 /* SDDiskCache.h */,
1092   - 17822DDCEE5C075412F1B1A731F006F2 /* SDDiskCache.m */,
1093   - CB003CB825038F390A91BFD066D5DC11 /* SDImageAPNGCoder.h */,
1094   - F4BDDDF94411952465D7BEFFCA8B5C29 /* SDImageAPNGCoder.m */,
1095   - B836409E7407CD373408BBEE6FB78A56 /* SDImageAssetManager.h */,
1096   - 26EEACAD4CFF038839E5CAE01FC51426 /* SDImageAssetManager.m */,
1097   - 92986682144C6A680D1688CC72DB03EB /* SDImageCache.h */,
1098   - 4C86D29287795201B7A91BA858DBC2FB /* SDImageCache.m */,
1099   - 880ED7B5A8CB58EE4EE46F97AAFC7934 /* SDImageCacheConfig.h */,
1100   - EBAB61DD2D434A28A27FC5DFC9B7D499 /* SDImageCacheConfig.m */,
1101   - 843DE7A9D5751B6D1E4B542142E88BE5 /* SDImageCacheDefine.h */,
1102   - D3B294F209BE90C307D3B79D646A580E /* SDImageCacheDefine.m */,
1103   - EF4C3869889BF6E0FB48DB6D3E50C42B /* SDImageCachesManager.h */,
1104   - 14AEC03CE74FA3C1ED22FD08ACDC489F /* SDImageCachesManager.m */,
1105   - 0E9E88F1E31A013B69A717855A9A782E /* SDImageCachesManagerOperation.h */,
1106   - A2EE608D10670E27D666BCB148BE76A8 /* SDImageCachesManagerOperation.m */,
1107   - B5F772E2006AB9FCF216A22126D6D46F /* SDImageCoder.h */,
1108   - 2FD9BD14816B4B34D6B032B14FCBCD17 /* SDImageCoder.m */,
1109   - 5820AFD9CB1F531DEEEA85AE53BA9FB1 /* SDImageCoderHelper.h */,
1110   - 8DE00CB7B46BD9384E27CFF44A22F3D6 /* SDImageCoderHelper.m */,
1111   - 106CDD63C990007C4EBED229576FD0E6 /* SDImageCodersManager.h */,
1112   - 7A3758E1F2262F48C18DEA44579E7F23 /* SDImageCodersManager.m */,
1113   - 3F679F8EE0717580BF2DF10529B314ED /* SDImageFrame.h */,
1114   - 0D7D182C7944184D8687D02BC5895C8A /* SDImageFrame.m */,
1115   - FB9F487DEA2EE1223E588AF5B7968BBC /* SDImageGIFCoder.h */,
1116   - 29332085AB2D0312202A5E4DA9903355 /* SDImageGIFCoder.m */,
1117   - AAF8FE9BD2DF30E81C73D0170BA7C814 /* SDImageGraphics.h */,
1118   - E2F6363B89177C5ED56B90058D1B1B9A /* SDImageGraphics.m */,
1119   - 1EE818633CBD870C5763EC5A7DEEFEBB /* SDImageHEICCoder.h */,
1120   - DF6A0A2DCDCF701127D57F57D20CEE46 /* SDImageHEICCoder.m */,
1121   - E1824D23FFCDBDE557E8BCF4A5D1EB64 /* SDImageHEICCoderInternal.h */,
1122   - C54E545CC107D12C2F5AA2887BAF107E /* SDImageIOAnimatedCoder.h */,
1123   - BF2240205CFBA63D171F27ED059DA17F /* SDImageIOAnimatedCoder.m */,
1124   - 74C01AF8051358A2AD340A5AB3505F28 /* SDImageIOAnimatedCoderInternal.h */,
1125   - 7DC9E6937FC0DCAFBFE9BC1CC778D6C9 /* SDImageIOCoder.h */,
1126   - 7492D3D26ACA17BE066949BC5402EFA6 /* SDImageIOCoder.m */,
1127   - 0F882F7E87C969BC4F446959C4C96507 /* SDImageLoader.h */,
1128   - 0AA629F1636B9E5C1E7779416F41894F /* SDImageLoader.m */,
1129   - FBAFB1147F9F60F82F67F2F93767AEA8 /* SDImageLoadersManager.h */,
1130   - D5EFE1BA58FE69FA738DCB9784D3B2E0 /* SDImageLoadersManager.m */,
1131   - 662B362504EE532B6C5EAA6DEDDC5D23 /* SDImageTransformer.h */,
1132   - 78D88E09C574752B379AC19B8561A84F /* SDImageTransformer.m */,
1133   - D0BFF09BFCD201810684D60E49FC29B3 /* SDInternalMacros.h */,
1134   - 565EA3FF9DE0069950D12760CD92E6DF /* SDInternalMacros.m */,
1135   - 2C6338E013B6CE8A040D3B94EC208F53 /* SDMemoryCache.h */,
1136   - DCA9751DEFA2CAEA416E397CD0197E4C /* SDMemoryCache.m */,
1137   - ACDF74FCCC69765D4B60B3DBEC369C3D /* SDmetamacros.h */,
1138   - EDCF5C73C34D7FE7CBD5AEC45E26DD16 /* SDWeakProxy.h */,
1139   - FF96D9B286912D2041A6038E44BF9D78 /* SDWeakProxy.m */,
1140   - AD998B4EBF0CD700BD542833326015DB /* SDWebImage.h */,
1141   - 2C68FD0A33D48BF8511F5E1F0AF5F38C /* SDWebImageCacheKeyFilter.h */,
1142   - 3C89C4C20801869E17ED28D5BC0002C7 /* SDWebImageCacheKeyFilter.m */,
1143   - 631A43488B8C087EA660030CD2484EA9 /* SDWebImageCacheSerializer.h */,
1144   - E6AC77D76359DA3AB60BBECA32896CFA /* SDWebImageCacheSerializer.m */,
1145   - 3BAFBDA5FBFB046872240DAA694DBA9D /* SDWebImageCompat.h */,
1146   - 4EB6A999880D99C4B8EAE70EC4D73221 /* SDWebImageCompat.m */,
1147   - BBC835DD376D230B30079993F2F5CDAA /* SDWebImageDefine.h */,
1148   - EB79E7A300B9098CE8EED7EB98A1E5AA /* SDWebImageDefine.m */,
1149   - FD9DAE7E5EAD3CA463241E107ADB319B /* SDWebImageDownloader.h */,
1150   - C2DE3B8DDA43BF244A83FA3A8E49B9C4 /* SDWebImageDownloader.m */,
1151   - 22D6E01939BAAB30A2190ACA1D161CDB /* SDWebImageDownloaderConfig.h */,
1152   - 9B69A0F6649EAEED316A983843ED5614 /* SDWebImageDownloaderConfig.m */,
1153   - 6076834A27CA897C42FFDA170BDE4715 /* SDWebImageDownloaderOperation.h */,
1154   - 0027B01676377B9218BE8AA537BDAA8A /* SDWebImageDownloaderOperation.m */,
1155   - 82DA1AE31B883B0A558F1A7C451C5411 /* SDWebImageDownloaderRequestModifier.h */,
1156   - 1A7213E5D815346B024AC2C78B59AE7E /* SDWebImageDownloaderRequestModifier.m */,
1157   - B93B5CB4F97B4C63233C9781D9074385 /* SDWebImageError.h */,
1158   - 4D82E5E2C22405F57D03467E23EA118F /* SDWebImageError.m */,
1159   - AD9AD3087AA0C54D99784B1E96B8F385 /* SDWebImageIndicator.h */,
1160   - C343BEA71DA4406F27A27215550DB0CA /* SDWebImageIndicator.m */,
1161   - 645FAD055E96DC89E3CF7A287A4B4F87 /* SDWebImageManager.h */,
1162   - C0F853EDBA5EE0AFD5FF80DF4E069774 /* SDWebImageManager.m */,
1163   - 3977DF74625040A3E0128C656F9FA8D0 /* SDWebImageOperation.h */,
1164   - 5E7D951E27DDF1D0327C691AC350863B /* SDWebImageOptionsProcessor.h */,
1165   - 9A2C5A33CC842DF0109E16A40FED6D58 /* SDWebImageOptionsProcessor.m */,
1166   - 6E0438EB685599B92473E4BBB56C9271 /* SDWebImagePrefetcher.h */,
1167   - A3F033ABEC9F3EFAA01FDA65E76374B4 /* SDWebImagePrefetcher.m */,
1168   - E8864E2BCB6F0A60BF7660FD5CA61884 /* SDWebImageTransition.h */,
1169   - 6F4A5B2FFD435932DC069C91BA243B8A /* SDWebImageTransition.m */,
1170   - E028311EA2C17015A8136F9F9A3DEEEC /* UIButton+WebCache.h */,
1171   - 604FBD4A36B51CB23593D6E7144E0A66 /* UIButton+WebCache.m */,
1172   - 5E4DCEAC007F7F72A2323A6304B0F4A4 /* UIColor+HexString.h */,
1173   - 8D082DCD13F9572880B69B6E5DBA621E /* UIColor+HexString.m */,
1174   - 8D8872339E7C6C556DCFC2B144D97747 /* UIImage+ForceDecode.h */,
1175   - DD7EB188DA7D4BC587FE249FF628B51C /* UIImage+ForceDecode.m */,
1176   - 03917DDCF8C121DD56B0AD9B603C2B9D /* UIImage+GIF.h */,
1177   - 9D4F696743A974B8507BEF6FB323BB62 /* UIImage+GIF.m */,
1178   - 45EBF80603A6BB114FFDF460A6A20CC7 /* UIImage+MemoryCacheCost.h */,
1179   - 23C27D070CBE7191DD5328960C7C772E /* UIImage+MemoryCacheCost.m */,
1180   - C8CF816C63E5B6559556C778BE819AF4 /* UIImage+Metadata.h */,
1181   - C090D5ECCFD39D2D4DF00BFB1D9DAB81 /* UIImage+Metadata.m */,
1182   - CF824EAADAAA9D61882AC1E95A4FAAC5 /* UIImage+MultiFormat.h */,
1183   - 2FB82601936A52D10C46ABDED4C4D68E /* UIImage+MultiFormat.m */,
1184   - DDF0A0D18F37DBE6D852FCEA2251F1C1 /* UIImage+Transform.h */,
1185   - 81C7DA27208415129BC75A3AE0EC610D /* UIImage+Transform.m */,
1186   - 397498F9C1EC4E17B000928E2E9A2551 /* UIImageView+HighlightedWebCache.h */,
1187   - 4E907072812DC6E02160321606CBFFD2 /* UIImageView+HighlightedWebCache.m */,
1188   - 4532E0D4D1C1FCB630416F347E791110 /* UIImageView+WebCache.h */,
1189   - 42406C450631485B971273EE79B37A12 /* UIImageView+WebCache.m */,
1190   - 0847D06FD8D970FB3747D3FFE1EF1A98 /* UIView+WebCache.h */,
1191   - 6C25A06B05CE4932A05E03D9A5B91E1A /* UIView+WebCache.m */,
1192   - 2B9F2CAB3EBC390CC9C5DF6FEB4AE54E /* UIView+WebCacheOperation.h */,
1193   - 6821ACBD9902AD3AEC5766052616BEFC /* UIView+WebCacheOperation.m */,
1194   - );
1195   - name = Core;
1196   - sourceTree = "<group>";
1197   - };
1198   - 4A12BD7E0F24F7DA5CB75AC152DCA427 /* Support Files */ = {
1199   - isa = PBXGroup;
1200   - children = (
1201   - 9190FDE4BAFCFE9EEEC32C362D54FC14 /* SDWebImage.modulemap */,
1202   - 1FB1475C6AAE3E931553C57D2012437B /* SDWebImage-dummy.m */,
1203   - A4015B1017950B192730F1ABF2793542 /* SDWebImage-Info.plist */,
1204   - 2E14AFE886371F80BB03C9261CAE653A /* SDWebImage-prefix.pch */,
1205   - 159B608142C5AD0E99E00479F64CDAFE /* SDWebImage-umbrella.h */,
1206   - 35974735D558DD140EC7A519306676BF /* SDWebImage.debug.xcconfig */,
1207   - 8B5C5257F6B18F69C086B439A25052BD /* SDWebImage.release.xcconfig */,
1208   - );
1209   - name = "Support Files";
1210   - path = "../Target Support Files/SDWebImage";
1211   - sourceTree = "<group>";
1212   - };
1213 1258 6395BBC4FE7C6C41AE1CB6A3363066BD /* Targets Support Files */ = {
1214 1259 isa = PBXGroup;
1215 1260 children = (
... ... @@ -1244,6 +1289,21 @@
1244 1289 path = Image;
1245 1290 sourceTree = "<group>";
1246 1291 };
  1292 + 710F178F0547C8EE314E14F2AB2C4124 /* Support Files */ = {
  1293 + isa = PBXGroup;
  1294 + children = (
  1295 + 3E74798ACDDA5B166130859C04575723 /* SDWebImage.modulemap */,
  1296 + 61733D38B2BF61692321B0EAD6CE7AAC /* SDWebImage-dummy.m */,
  1297 + 15DA0DE7F827744C2CD1C503B90ED22A /* SDWebImage-Info.plist */,
  1298 + 3AEC8F623A6884FBFC7CF8D4309918D7 /* SDWebImage-prefix.pch */,
  1299 + 2DED8461605A23446E943D5B44AC07FB /* SDWebImage-umbrella.h */,
  1300 + 3937A5FCAE6FD5C9CBFD132D61702EB0 /* SDWebImage.debug.xcconfig */,
  1301 + 69B6E48A6A7BF7FDA397F18D808442A2 /* SDWebImage.release.xcconfig */,
  1302 + );
  1303 + name = "Support Files";
  1304 + path = "../Target Support Files/SDWebImage";
  1305 + sourceTree = "<group>";
  1306 + };
1247 1307 7681CA34E755E133CA6962CC78CCA732 /* YBImageBrowser */ = {
1248 1308 isa = PBXGroup;
1249 1309 children = (
... ... @@ -1261,16 +1321,6 @@
1261 1321 path = YBImageBrowser_DSCnliveShop/Classes/YBImageBrowser;
1262 1322 sourceTree = "<group>";
1263 1323 };
1264   - 7A014A40B4BE421CD0E89DA824A04413 /* SDWebImage */ = {
1265   - isa = PBXGroup;
1266   - children = (
1267   - 418B8500CC0BC65A0DE0B609A2F36DA8 /* Core */,
1268   - 4A12BD7E0F24F7DA5CB75AC152DCA427 /* Support Files */,
1269   - );
1270   - name = SDWebImage;
1271   - path = SDWebImage;
1272   - sourceTree = "<group>";
1273   - };
1274 1324 9A9577D5B370441D1926FE268E305F56 /* Resources */ = {
1275 1325 isa = PBXGroup;
1276 1326 children = (
... ... @@ -1298,7 +1348,7 @@
1298 1348 A2BE8DF77D03508B9B8418BD9602255F /* Pods */ = {
1299 1349 isa = PBXGroup;
1300 1350 children = (
1301   - 7A014A40B4BE421CD0E89DA824A04413 /* SDWebImage */,
  1351 + FEF90DB2DC962AA8A54D42B042F65B9E /* SDWebImage */,
1302 1352 B0A9653E4CBB5BBF0D27A9511C0EE8C4 /* YYKit */,
1303 1353 );
1304 1354 name = Pods;
... ... @@ -1611,6 +1661,16 @@
1611 1661 name = Frameworks;
1612 1662 sourceTree = "<group>";
1613 1663 };
  1664 + FEF90DB2DC962AA8A54D42B042F65B9E /* SDWebImage */ = {
  1665 + isa = PBXGroup;
  1666 + children = (
  1667 + 1A858AEA06D9DB5413EC15E1834061B8 /* Core */,
  1668 + 710F178F0547C8EE314E14F2AB2C4124 /* Support Files */,
  1669 + );
  1670 + name = SDWebImage;
  1671 + path = SDWebImage;
  1672 + sourceTree = "<group>";
  1673 + };
1614 1674 FF6E94A47A5FB0D3A3409B902104CDC9 /* Helper */ = {
1615 1675 isa = PBXGroup;
1616 1676 children = (
... ... @@ -1786,74 +1846,84 @@
1786 1846 );
1787 1847 runOnlyForDeploymentPostprocessing = 0;
1788 1848 };
1789   - CA4065646A60ED133DABD1609AE9B77F /* Headers */ = {
  1849 + CB6048343884143F7919689F2F9BEEA2 /* Headers */ = {
1790 1850 isa = PBXHeadersBuildPhase;
1791 1851 buildActionMask = 2147483647;
1792 1852 files = (
1793   - 2BB48CC4F4CCB6ED239A7116C1399192 /* NSBezierPath+RoundedCorners.h in Headers */,
1794   - C8719B604AC23450E05D0E2F5716C8EE /* NSButton+WebCache.h in Headers */,
1795   - E1A13F65E327E70ED0A0322ED9D4E004 /* NSData+ImageContentType.h in Headers */,
1796   - 584691DE6F6DC43CCB28E2164DDD65C5 /* NSImage+Compatibility.h in Headers */,
1797   - 5B6E86C662422D902876E9564F7D0D62 /* SDAnimatedImage.h in Headers */,
1798   - F9CD37EE6DD796D86FAFCE65C106D553 /* SDAnimatedImageRep.h in Headers */,
1799   - E807BB2D53EF822DDA0109BEB8F33F4B /* SDAnimatedImageView+WebCache.h in Headers */,
1800   - F7C220B780BE3FFD43D49EB09A4AA120 /* SDAnimatedImageView.h in Headers */,
1801   - 56D932D22CCE25078DDC72863C793EB6 /* SDAsyncBlockOperation.h in Headers */,
1802   - 89AA4B620BAF006802F7FE16331FBB03 /* SDDiskCache.h in Headers */,
1803   - F4A2A3265060EE0EC36AE153BA2F11F1 /* SDImageAPNGCoder.h in Headers */,
1804   - 31C885C264ACBC869D0C15774FEEEE91 /* SDImageAssetManager.h in Headers */,
1805   - CED0ADFAFACBD8EAC91D8FDFAD72CC3D /* SDImageCache.h in Headers */,
1806   - 4A63641D8EA2784EA3ED6DE31D3EEE7B /* SDImageCacheConfig.h in Headers */,
1807   - 6E23CCE1DD2C5694FB3733EF5969C2BA /* SDImageCacheDefine.h in Headers */,
1808   - 1D8DC86B542A5C7B185D576593BFEF08 /* SDImageCachesManager.h in Headers */,
1809   - 07ECBE230ADCE64A5E565EAC5608FE06 /* SDImageCachesManagerOperation.h in Headers */,
1810   - 3F1C17F8ED3A2719985697A88379D691 /* SDImageCoder.h in Headers */,
1811   - 41D2B74D60CECB9A13273FEA70EB0853 /* SDImageCoderHelper.h in Headers */,
1812   - 765CF9D27014B63D63045C295D14D47F /* SDImageCodersManager.h in Headers */,
1813   - 4E303A392C14264AF2A7846A47904C0E /* SDImageFrame.h in Headers */,
1814   - A9FB0B1C38B3DF1982D4D8F8B3B99A4E /* SDImageGIFCoder.h in Headers */,
1815   - A522F73D14A2CB4DE43E00754C6D504B /* SDImageGraphics.h in Headers */,
1816   - 0A12ECF7CCD9D053812435656179FE07 /* SDImageHEICCoder.h in Headers */,
1817   - 3402867F1DCE2F01EE152BE666D15391 /* SDImageHEICCoderInternal.h in Headers */,
1818   - DB7CB011D38A0CF4CBA6380FF04F0B61 /* SDImageIOAnimatedCoder.h in Headers */,
1819   - 4FB58F2A627219E59C6002407BA17370 /* SDImageIOAnimatedCoderInternal.h in Headers */,
1820   - 16EBE72F21A776BA4F5FA1B43DA0D550 /* SDImageIOCoder.h in Headers */,
1821   - 9F8771C9472203AC8A6B882D32E081FD /* SDImageLoader.h in Headers */,
1822   - 66E7DB4A06FD62E3319504FA066A159D /* SDImageLoadersManager.h in Headers */,
1823   - 93EEC3D112C8D5BAF8202BBB7C0F8D40 /* SDImageTransformer.h in Headers */,
1824   - B241B25BC7903216B219BCFDD5533ED2 /* SDInternalMacros.h in Headers */,
1825   - 0897E820C9A330AEE938549F3A202047 /* SDMemoryCache.h in Headers */,
1826   - CB6B765C0485EA0801AC5AD27B988336 /* SDmetamacros.h in Headers */,
1827   - EC2A8CA5F7249A4197E707E8008C2CAF /* SDWeakProxy.h in Headers */,
1828   - 78C4797B83602657490272FB5AC87882 /* SDWebImage-umbrella.h in Headers */,
1829   - 31486EEF2AE7067DC3FB4C41D8B06044 /* SDWebImage.h in Headers */,
1830   - B1635A0F2A9E883F5F9478F04F5F9B00 /* SDWebImageCacheKeyFilter.h in Headers */,
1831   - 83A3C38994C1BE0F1B3FDC74FF3EB86E /* SDWebImageCacheSerializer.h in Headers */,
1832   - B27865F2F8513D2BAF80C119865014B2 /* SDWebImageCompat.h in Headers */,
1833   - D9B0AE61DB0C28C1A453C57DBAA9894C /* SDWebImageDefine.h in Headers */,
1834   - FC5F561CA670D699F300DDA4FE2D8314 /* SDWebImageDownloader.h in Headers */,
1835   - 9A0E1A1BFFD28A2746792BE8D568E3AC /* SDWebImageDownloaderConfig.h in Headers */,
1836   - 571964893E54957A53F88749EA22E79B /* SDWebImageDownloaderOperation.h in Headers */,
1837   - CA2A04B40C4584BB62EDF451D4691393 /* SDWebImageDownloaderRequestModifier.h in Headers */,
1838   - 1A645DC3F75D98F78F685E7E8172E6C4 /* SDWebImageError.h in Headers */,
1839   - 5BB4DED775A9AB9259E214C9543F2409 /* SDWebImageIndicator.h in Headers */,
1840   - DBB84BD7F62230F01B7533CF5DB8E2B8 /* SDWebImageManager.h in Headers */,
1841   - 5D93304CCA386D1CA921179A22788088 /* SDWebImageOperation.h in Headers */,
1842   - B9EAA2FEBC24879CE426A200D1943850 /* SDWebImageOptionsProcessor.h in Headers */,
1843   - FA626556DE0DB5DBE98269492EB9D858 /* SDWebImagePrefetcher.h in Headers */,
1844   - FA1132270226AEC00FD163A760F5BFDD /* SDWebImageTransition.h in Headers */,
1845   - 972F3D3004A38B2E91B514317462F912 /* UIButton+WebCache.h in Headers */,
1846   - AA4B92512944686F23ABE5632656872E /* UIColor+HexString.h in Headers */,
1847   - 130C29DD67F0DACDAA2E6A57DA2422D7 /* UIImage+ForceDecode.h in Headers */,
1848   - 06012BECF3390F6D209D81ABC29DEE7F /* UIImage+GIF.h in Headers */,
1849   - D4C9FCF4108BF46522DA445E47524A6A /* UIImage+MemoryCacheCost.h in Headers */,
1850   - 21C54761AEC4B6FF8F628CF62503856C /* UIImage+Metadata.h in Headers */,
1851   - 43367367332A88EC53B2BEA287BAA3DD /* UIImage+MultiFormat.h in Headers */,
1852   - 11631B3F15728204C488D6CF17DA63BF /* UIImage+Transform.h in Headers */,
1853   - 6B841305B372900E43EAD6CF233EA695 /* UIImageView+HighlightedWebCache.h in Headers */,
1854   - 06EF6A665BCC7FDFD85BD8ABD55A3959 /* UIImageView+WebCache.h in Headers */,
1855   - 902A0F8F36BB0CD612BD333AB538FFC0 /* UIView+WebCache.h in Headers */,
1856   - 768B0529984555456940B969FB3B0C5B /* UIView+WebCacheOperation.h in Headers */,
  1853 + D0725567B7BD18C79A04E5EC9C72249D /* NSBezierPath+SDRoundedCorners.h in Headers */,
  1854 + 449AF3A1E1DEFBD47B2411DAD0E5D6CC /* NSButton+WebCache.h in Headers */,
  1855 + EB634403E13B36687931F62769C04F66 /* NSData+ImageContentType.h in Headers */,
  1856 + 9C6F61B6DD8964A03128BB996BCCCDF5 /* NSImage+Compatibility.h in Headers */,
  1857 + 1201437E196032353D4D2B2DF8206775 /* SDAnimatedImage.h in Headers */,
  1858 + 9B0ADFBD0EE010BC1AE32B290FAF2D70 /* SDAnimatedImagePlayer.h in Headers */,
  1859 + 86A92CFC75F685F5805824C81ED34DD9 /* SDAnimatedImageRep.h in Headers */,
  1860 + 6F14B66A0031F8CD2DBD49D05F285A5A /* SDAnimatedImageView+WebCache.h in Headers */,
  1861 + 40DD3721BA61598A56ECF57BB1C45EE8 /* SDAnimatedImageView.h in Headers */,
  1862 + 85B91AFDF4CF2F4FB54D35AE96CB02DE /* SDAssociatedObject.h in Headers */,
  1863 + 7C9BCCE2BE2AB0F74617E9638E8383E2 /* SDAsyncBlockOperation.h in Headers */,
  1864 + 09EB95CBDF8D54EB05C26A5196EBBB65 /* SDDeviceHelper.h in Headers */,
  1865 + DE311CA167D40330E2B71F4726A6B789 /* SDDiskCache.h in Headers */,
  1866 + 1367682CED02F22D43F248A0E36CC17B /* SDDisplayLink.h in Headers */,
  1867 + 69FC796803AADF6F7D78E034F759E07A /* SDFileAttributeHelper.h in Headers */,
  1868 + 5BCB8102AFF58BDD96E0C059F9B88BB5 /* SDGraphicsImageRenderer.h in Headers */,
  1869 + C88E97ED465D3973A3D9FD7AE94BDB9A /* SDImageAPNGCoder.h in Headers */,
  1870 + 8860B7C942F4FDAC599E545DEC6E0446 /* SDImageAssetManager.h in Headers */,
  1871 + 9140B89832569466DC295558951FF9A4 /* SDImageCache.h in Headers */,
  1872 + 0CD7B135FD4B84BDB1FB8727A2F85550 /* SDImageCacheConfig.h in Headers */,
  1873 + A26011648EA7CD910788DBBF08C36F32 /* SDImageCacheDefine.h in Headers */,
  1874 + E9B97B2FD84DF4015AABD7E5978A710F /* SDImageCachesManager.h in Headers */,
  1875 + 78A8F86E5996E580294B65E304C65F6A /* SDImageCachesManagerOperation.h in Headers */,
  1876 + 8BE030582BFA5590BC7A1EB1A7E8DDC4 /* SDImageCoder.h in Headers */,
  1877 + 285BB197A61A0553905D872B6E4F6BA1 /* SDImageCoderHelper.h in Headers */,
  1878 + 47CFA5C583D7B3BFD0FBAD1F1A474913 /* SDImageCodersManager.h in Headers */,
  1879 + 5C5058FC446A9C6C4F3FA70C2121A267 /* SDImageFrame.h in Headers */,
  1880 + 12A76A691E704E6EBE12CC888639C31A /* SDImageGIFCoder.h in Headers */,
  1881 + 7829F86094FA530717C4AF09DFA1FCB7 /* SDImageGraphics.h in Headers */,
  1882 + 4F227430C16CAB3FF65A1488229BF46A /* SDImageHEICCoder.h in Headers */,
  1883 + D347FCF56E468483A546E1F611DE081C /* SDImageHEICCoderInternal.h in Headers */,
  1884 + 79140F3DB1DFA9969EF7EA809862461B /* SDImageIOAnimatedCoder.h in Headers */,
  1885 + EA50654643EF702D7F2DD17534459EAB /* SDImageIOAnimatedCoderInternal.h in Headers */,
  1886 + D6FDFE95CEDBD0A41D4E16FDB1599FA9 /* SDImageIOCoder.h in Headers */,
  1887 + 104CBAC9F34C7B8475A096C4B0ACA3A0 /* SDImageLoader.h in Headers */,
  1888 + 858BA6CE212BDE681F7B8EC99CDEA5A2 /* SDImageLoadersManager.h in Headers */,
  1889 + 949BA4CC204D826571EA4E85BA769DB7 /* SDImageTransformer.h in Headers */,
  1890 + 561EAFCC4AA4A4FFA55319ACF371D31C /* SDInternalMacros.h in Headers */,
  1891 + FC4DE0456F37E3F47195E5F969314E0F /* SDMemoryCache.h in Headers */,
  1892 + 183F84DC6D79A0F93AE6C13F2EDDDCD8 /* SDmetamacros.h in Headers */,
  1893 + 5E96F449788433CD16C308CA4C4974AB /* SDWeakProxy.h in Headers */,
  1894 + 1A04C35F3E2D85CFCAFC9934EAC8E033 /* SDWebImage-umbrella.h in Headers */,
  1895 + 64F3EB426774D6F1D593DBFAFFBF6791 /* SDWebImage.h in Headers */,
  1896 + FEF33326D4B5B59DFD0CA1DFAD4001FC /* SDWebImageCacheKeyFilter.h in Headers */,
  1897 + DFE7857272AA4CDEC686248E790174F9 /* SDWebImageCacheSerializer.h in Headers */,
  1898 + 010A21434427A1E7CE25060BA3A66A61 /* SDWebImageCompat.h in Headers */,
  1899 + CBA469E2DD8702DECB634A81F850C516 /* SDWebImageDefine.h in Headers */,
  1900 + 9C39FA3EB2A9462B249432F655FC9AA8 /* SDWebImageDownloader.h in Headers */,
  1901 + A3A38FFF99F8F65D21F6526D4D257230 /* SDWebImageDownloaderConfig.h in Headers */,
  1902 + C854CD2F89E00E88FB1D6669A770DEE0 /* SDWebImageDownloaderDecryptor.h in Headers */,
  1903 + CF1AA8850ED16C5F49B61BC3A9B13DD7 /* SDWebImageDownloaderOperation.h in Headers */,
  1904 + 6B8E9A4250E31C61FFB2FA44B1ED587D /* SDWebImageDownloaderRequestModifier.h in Headers */,
  1905 + 02A4C8ABD5DCC501DE7A6CE19B398E14 /* SDWebImageDownloaderResponseModifier.h in Headers */,
  1906 + 95D70798AF08A9AF6AC0455ABAC50B31 /* SDWebImageError.h in Headers */,
  1907 + B6A52B7697F15B487F846F3DA1CB3896 /* SDWebImageIndicator.h in Headers */,
  1908 + FC5E54109CC0090D7CA4492C6225E5BB /* SDWebImageManager.h in Headers */,
  1909 + CD06DC5FCA424D8A0928068BEB8AF2E5 /* SDWebImageOperation.h in Headers */,
  1910 + DA1F5EB06521252BF63369AFEF914368 /* SDWebImageOptionsProcessor.h in Headers */,
  1911 + B52576B08EFC9D67F218CC2DAC542AF4 /* SDWebImagePrefetcher.h in Headers */,
  1912 + 02B6598C52131C10E3CA344FB49B87FA /* SDWebImageTransition.h in Headers */,
  1913 + 71C055BCF544D98F47CCFB404A9157A0 /* SDWebImageTransitionInternal.h in Headers */,
  1914 + 7320BE37CC5564C9200656A346D16D7C /* UIButton+WebCache.h in Headers */,
  1915 + 41E823881385B837FA086E301CBBB87C /* UIColor+SDHexString.h in Headers */,
  1916 + 758D45C8E630A9B2A29746AFAB257929 /* UIImage+ExtendedCacheData.h in Headers */,
  1917 + 56D4C3BEBAF6D7B57123C4A919EDFC4D /* UIImage+ForceDecode.h in Headers */,
  1918 + A1B62D4B373543D743AC938090EF65F2 /* UIImage+GIF.h in Headers */,
  1919 + 7BDCFF16AD5094651DDF91E007A194A1 /* UIImage+MemoryCacheCost.h in Headers */,
  1920 + CCEF1E548BE78064BE12CC29D9977A28 /* UIImage+Metadata.h in Headers */,
  1921 + 7CB9508A6133F4674F3358339F62CF03 /* UIImage+MultiFormat.h in Headers */,
  1922 + DCDC5264F294AB9A622D368F2F7FA336 /* UIImage+Transform.h in Headers */,
  1923 + 42BB3098DC0E47748C6AD61A10575859 /* UIImageView+HighlightedWebCache.h in Headers */,
  1924 + 9212629910630E2F8888272B38EA81E4 /* UIImageView+WebCache.h in Headers */,
  1925 + 033813F58E3D20FA511AF1B5C3D58FA7 /* UIView+WebCache.h in Headers */,
  1926 + 21C120EDFCE3F1B685833EAE2F088998 /* UIView+WebCacheOperation.h in Headers */,
1857 1927 );
1858 1928 runOnlyForDeploymentPostprocessing = 0;
1859 1929 };
... ... @@ -1930,12 +2000,12 @@
1930 2000 };
1931 2001 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */ = {
1932 2002 isa = PBXNativeTarget;
1933   - buildConfigurationList = 74451F5A9D7B9165630F6C64F97C5913 /* Build configuration list for PBXNativeTarget "SDWebImage" */;
  2003 + buildConfigurationList = AC6F755EB18559BA16F3A7501A53F36A /* Build configuration list for PBXNativeTarget "SDWebImage" */;
1934 2004 buildPhases = (
1935   - CA4065646A60ED133DABD1609AE9B77F /* Headers */,
1936   - BAD7BFF6FC8F0397DB86C139AF674045 /* Sources */,
1937   - ECEA1B04AA580BD337B52CB84D1C00A8 /* Frameworks */,
1938   - 016B131B0F6F68BCBAE6DB01E3F25349 /* Resources */,
  2005 + CB6048343884143F7919689F2F9BEEA2 /* Headers */,
  2006 + 6B33B89724E2F1127E0B67158DDEA242 /* Sources */,
  2007 + 93E1803EFFB49B8B5D9BE9C3FF15E708 /* Frameworks */,
  2008 + D6D70F7565EE0DD3BC12CD0BB42B01A8 /* Resources */,
1939 2009 );
1940 2010 buildRules = (
1941 2011 );
... ... @@ -1998,13 +2068,6 @@
1998 2068 /* End PBXProject section */
1999 2069  
2000 2070 /* Begin PBXResourcesBuildPhase section */
2001   - 016B131B0F6F68BCBAE6DB01E3F25349 /* Resources */ = {
2002   - isa = PBXResourcesBuildPhase;
2003   - buildActionMask = 2147483647;
2004   - files = (
2005   - );
2006   - runOnlyForDeploymentPostprocessing = 0;
2007   - };
2008 2071 04E5F5CBE7ACCFB62968403927984C4D /* Resources */ = {
2009 2072 isa = PBXResourcesBuildPhase;
2010 2073 buildActionMask = 2147483647;
... ... @@ -2035,6 +2098,13 @@
2035 2098 );
2036 2099 runOnlyForDeploymentPostprocessing = 0;
2037 2100 };
  2101 + D6D70F7565EE0DD3BC12CD0BB42B01A8 /* Resources */ = {
  2102 + isa = PBXResourcesBuildPhase;
  2103 + buildActionMask = 2147483647;
  2104 + files = (
  2105 + );
  2106 + runOnlyForDeploymentPostprocessing = 0;
  2107 + };
2038 2108 /* End PBXResourcesBuildPhase section */
2039 2109  
2040 2110 /* Begin PBXSourcesBuildPhase section */
... ... @@ -2135,69 +2205,79 @@
2135 2205 );
2136 2206 runOnlyForDeploymentPostprocessing = 0;
2137 2207 };
2138   - BAD7BFF6FC8F0397DB86C139AF674045 /* Sources */ = {
  2208 + 6B33B89724E2F1127E0B67158DDEA242 /* Sources */ = {
2139 2209 isa = PBXSourcesBuildPhase;
2140 2210 buildActionMask = 2147483647;
2141 2211 files = (
2142   - 8AAEE8B8F842102CB770F4A2C286AEE0 /* NSBezierPath+RoundedCorners.m in Sources */,
2143   - 13B7C26AFEF7B9A9BB71D6340836C1D2 /* NSButton+WebCache.m in Sources */,
2144   - C15872A8795C18D17D7CB78D0D2AF5A9 /* NSData+ImageContentType.m in Sources */,
2145   - DDA63B6A16CAEC9EDAB8721409ED65EF /* NSImage+Compatibility.m in Sources */,
2146   - 642B272637AFE100C01566715BE9A90E /* SDAnimatedImage.m in Sources */,
2147   - AAB78C68578015956BFE8A56A7E02BA7 /* SDAnimatedImageRep.m in Sources */,
2148   - 8B3648DF3CD6DCE1F23B154EEC9F47BC /* SDAnimatedImageView+WebCache.m in Sources */,
2149   - 7BE352AC96A490424A89542C59B92D27 /* SDAnimatedImageView.m in Sources */,
2150   - 6419E84A00BD1CC2D89FBD11DBA95B35 /* SDAsyncBlockOperation.m in Sources */,
2151   - F855CDFE0F0B48A22F8F0B4CD25E3F2A /* SDDiskCache.m in Sources */,
2152   - F0AB74AED6D7C008445C01678F59B54D /* SDImageAPNGCoder.m in Sources */,
2153   - 66ABFE235C4A3EE1284E40B26EC06E50 /* SDImageAssetManager.m in Sources */,
2154   - CBEDB718B4AB4391588A9347C9F03C4A /* SDImageCache.m in Sources */,
2155   - 9BE4B66909D27FA2DEE5D7B4DAF83DD5 /* SDImageCacheConfig.m in Sources */,
2156   - B0D15842F6D9B27F7E656D6A3D715329 /* SDImageCacheDefine.m in Sources */,
2157   - 43413AE961CEDF130DB347D12953F90F /* SDImageCachesManager.m in Sources */,
2158   - 720BDB7561A9BF9FAA229655BF6BAACB /* SDImageCachesManagerOperation.m in Sources */,
2159   - 2987181816CE330B8D8C8011A163DED5 /* SDImageCoder.m in Sources */,
2160   - E4C4C17E15D7F01D31091341E3B22767 /* SDImageCoderHelper.m in Sources */,
2161   - 6C9E415ACF9DBBF5276A439ECA83FF41 /* SDImageCodersManager.m in Sources */,
2162   - B81B452FC4B5B6F7812022013E0050F9 /* SDImageFrame.m in Sources */,
2163   - C926C81B2AE4D970FF43FA6854DF11B3 /* SDImageGIFCoder.m in Sources */,
2164   - EBD6DC15D9DA29829CD9A5BA5F2B2A76 /* SDImageGraphics.m in Sources */,
2165   - 91EC5D1276C67BD151CE0945E99D346B /* SDImageHEICCoder.m in Sources */,
2166   - 1A696C66B1AD121F4D74F70046E722BE /* SDImageIOAnimatedCoder.m in Sources */,
2167   - 637C07DAF593E361026C13455CED3356 /* SDImageIOCoder.m in Sources */,
2168   - 3CBE3496D679F3CAC215C24E124CEF20 /* SDImageLoader.m in Sources */,
2169   - A93168D1B8FE647836641A8FD0960D3F /* SDImageLoadersManager.m in Sources */,
2170   - 9F45ED51FB250F999DF9EEE26706306F /* SDImageTransformer.m in Sources */,
2171   - C50CAA073FFEC5DFDB16A59830E97C95 /* SDInternalMacros.m in Sources */,
2172   - E159EA4B9CE7CA4EA7CC422F1BB359D0 /* SDMemoryCache.m in Sources */,
2173   - 69B78205FADBA6F82DD7D8842E744559 /* SDWeakProxy.m in Sources */,
2174   - 7296ED68E239CF8323284C327EFD34DB /* SDWebImage-dummy.m in Sources */,
2175   - CF5BBB5AA6B556A33F0FD0CBF107B538 /* SDWebImageCacheKeyFilter.m in Sources */,
2176   - 773F599C7937832DC3E3C3F5FC41A2BF /* SDWebImageCacheSerializer.m in Sources */,
2177   - 9AA98747F0FFCB4629345C58F9DFF9A2 /* SDWebImageCompat.m in Sources */,
2178   - A24ECE056F5DC1A130E45CD9DFDDAE9D /* SDWebImageDefine.m in Sources */,
2179   - 8095235275C7774DBD0439AEBF02EBF9 /* SDWebImageDownloader.m in Sources */,
2180   - FD42C3773D4CE1E4ED8BC78369EE4898 /* SDWebImageDownloaderConfig.m in Sources */,
2181   - 55F81E8A4E05DCEA1424C070100D7A08 /* SDWebImageDownloaderOperation.m in Sources */,
2182   - 3768A48148C1A559EFA6857AEE21499C /* SDWebImageDownloaderRequestModifier.m in Sources */,
2183   - 27117846D36D17C67AD6B0BC49819C2E /* SDWebImageError.m in Sources */,
2184   - 7AA1932AD1AADADB7084C1120E353441 /* SDWebImageIndicator.m in Sources */,
2185   - 5F7825DA2B38AE6F113742CD8640B6A5 /* SDWebImageManager.m in Sources */,
2186   - 22AC8168428AA91CEFCC4A1EE18C61A1 /* SDWebImageOptionsProcessor.m in Sources */,
2187   - E05830BFF728135BC1A3FCD86B02AFED /* SDWebImagePrefetcher.m in Sources */,
2188   - F981FD60C717579B06FC77EBE5E3ECEE /* SDWebImageTransition.m in Sources */,
2189   - B2D122DFC079570A5A257B8FEFE1CF4C /* UIButton+WebCache.m in Sources */,
2190   - 8B36C6BD6BC521D6EBFAA6C06204C8AE /* UIColor+HexString.m in Sources */,
2191   - 3A717A936244852C7999DF2ACDD3EBA4 /* UIImage+ForceDecode.m in Sources */,
2192   - 4B010F01929654CD157576546C2CA5E5 /* UIImage+GIF.m in Sources */,
2193   - 9F69D6D21857F40138D7EF02C9934F61 /* UIImage+MemoryCacheCost.m in Sources */,
2194   - D84BE358D7B1195BCA3556D7A0003968 /* UIImage+Metadata.m in Sources */,
2195   - 09291E0580080AF730970F2DE20C6F2F /* UIImage+MultiFormat.m in Sources */,
2196   - 4A295CDE35C0C3A0C3BDC83BAEEBC8D1 /* UIImage+Transform.m in Sources */,
2197   - 4E5C5A91108AA66D06C8D32C62266D23 /* UIImageView+HighlightedWebCache.m in Sources */,
2198   - FB731F3EEA54F44A238FBBFED93D9974 /* UIImageView+WebCache.m in Sources */,
2199   - 873613A08846E4C11A3D0504EF738DD3 /* UIView+WebCache.m in Sources */,
2200   - C60409B7C6D34D479F3DC7157194706B /* UIView+WebCacheOperation.m in Sources */,
  2212 + 14C2D66D5EC7A892325562A7830E78D4 /* NSBezierPath+SDRoundedCorners.m in Sources */,
  2213 + EC14B2E8E460DFC2E4EB78A9FC10117C /* NSButton+WebCache.m in Sources */,
  2214 + 64CB4C39356EDD005F3104B820F4B299 /* NSData+ImageContentType.m in Sources */,
  2215 + 3E404F1C1EF06355EBCAD17AAA6A7655 /* NSImage+Compatibility.m in Sources */,
  2216 + 28B63809D42D68F3E44A2012695EC8E8 /* SDAnimatedImage.m in Sources */,
  2217 + 826CC80A43888E4B01B8C0F546CCEB4C /* SDAnimatedImagePlayer.m in Sources */,
  2218 + 27E23C72CC1BAD100D8F8E52A77E0DED /* SDAnimatedImageRep.m in Sources */,
  2219 + 84996105619FE8603B904EBD8CAF4650 /* SDAnimatedImageView+WebCache.m in Sources */,
  2220 + 4458F0F06DDB8ED606F8089B51DE2857 /* SDAnimatedImageView.m in Sources */,
  2221 + 9A63822674C925980BCE24CF9162F224 /* SDAssociatedObject.m in Sources */,
  2222 + D43B9E05CBF3046EB696F0357E263B54 /* SDAsyncBlockOperation.m in Sources */,
  2223 + 292DFB006819CC5C457430933E9DF2CC /* SDDeviceHelper.m in Sources */,
  2224 + DB42064F83C6224213B940B249FC26FF /* SDDiskCache.m in Sources */,
  2225 + 3BAC7E6B28028F929677080D34286C9A /* SDDisplayLink.m in Sources */,
  2226 + FFA5793DBEE9AB3CC5C01F5B6F0B1151 /* SDFileAttributeHelper.m in Sources */,
  2227 + 725C541DA4309D9A2CE04EA1BAC9DB05 /* SDGraphicsImageRenderer.m in Sources */,
  2228 + 477600BAE7223A59EC2D341F7EAA0C5B /* SDImageAPNGCoder.m in Sources */,
  2229 + BD1CC866FEB3E8226394BA640E7FA900 /* SDImageAssetManager.m in Sources */,
  2230 + 198D45399940A52F6AD442B5F96A24A1 /* SDImageCache.m in Sources */,
  2231 + 8A1D68B08A42906461750649F460B63E /* SDImageCacheConfig.m in Sources */,
  2232 + 69979E7EF7E1322AF64B9D04EC5DC4FC /* SDImageCacheDefine.m in Sources */,
  2233 + 3FE529AB19EA206854B9668E508D927B /* SDImageCachesManager.m in Sources */,
  2234 + 14E9103FD1B1EFBE7BA8EE1137810EB2 /* SDImageCachesManagerOperation.m in Sources */,
  2235 + 451775744CDDD8A2805CCC5FAAE96FE6 /* SDImageCoder.m in Sources */,
  2236 + CC1B7B642CBAEA58A27D410B329E5FFD /* SDImageCoderHelper.m in Sources */,
  2237 + BDACD97A89128CDAECEE9F2C66A68041 /* SDImageCodersManager.m in Sources */,
  2238 + D2EDDDAA1E3498604C570DA06526C7BA /* SDImageFrame.m in Sources */,
  2239 + D4F67B56B3A2910031B248E07BC0FF9F /* SDImageGIFCoder.m in Sources */,
  2240 + 44F7C039A4502CB6ABFE93BC1626ADAF /* SDImageGraphics.m in Sources */,
  2241 + 5C11EACACCF1A59EC89E212517D471D2 /* SDImageHEICCoder.m in Sources */,
  2242 + 89A6805309AE158EA70271058AD04DAC /* SDImageIOAnimatedCoder.m in Sources */,
  2243 + 521A2AB2326986DDA7210B222799D82D /* SDImageIOCoder.m in Sources */,
  2244 + B34DA9789249B559F7D135CDC3D4FD77 /* SDImageLoader.m in Sources */,
  2245 + 013FB3424E97C9CBA093B58F3FF74537 /* SDImageLoadersManager.m in Sources */,
  2246 + 6F52C02EB7BEBB28BEF797764940E83D /* SDImageTransformer.m in Sources */,
  2247 + 19BA863C27D0A5BBD664CB1ABDA03238 /* SDInternalMacros.m in Sources */,
  2248 + 8D7206334016EF356DD5C06DB743927A /* SDMemoryCache.m in Sources */,
  2249 + 9B9C593A401B16CA1F27613B33259116 /* SDWeakProxy.m in Sources */,
  2250 + 3526C8C7BD0C5256C819AEB8DE26BC80 /* SDWebImage-dummy.m in Sources */,
  2251 + F045BDBF956B9EE5340F3225336EDAC6 /* SDWebImageCacheKeyFilter.m in Sources */,
  2252 + 46E5579E12DEE8B0B0E8B4BD484303AF /* SDWebImageCacheSerializer.m in Sources */,
  2253 + DD784DFACF8863C7D46B9054B0DD7C42 /* SDWebImageCompat.m in Sources */,
  2254 + E48B7D3309D22470B53A3EB47B6577E7 /* SDWebImageDefine.m in Sources */,
  2255 + AB811350CFBFEC402845394DFB11C5B9 /* SDWebImageDownloader.m in Sources */,
  2256 + C94DE8F907543852C6C5311CE0A2752A /* SDWebImageDownloaderConfig.m in Sources */,
  2257 + 5EC0E24AEBC97BED8827D6824B20AEA3 /* SDWebImageDownloaderDecryptor.m in Sources */,
  2258 + 9058F00D7FB0F44089EA7418C9BE80CD /* SDWebImageDownloaderOperation.m in Sources */,
  2259 + A8F9213841A1696CA4E3BAF5B0836F43 /* SDWebImageDownloaderRequestModifier.m in Sources */,
  2260 + EA5AE4148E9B9228E70EDB7F575D111E /* SDWebImageDownloaderResponseModifier.m in Sources */,
  2261 + C32C3C747D6831244FA97E55D7EBC211 /* SDWebImageError.m in Sources */,
  2262 + C71E6525587D5FFE318A222C092FA6AE /* SDWebImageIndicator.m in Sources */,
  2263 + 92253035C5C62FC047813B453A47011B /* SDWebImageManager.m in Sources */,
  2264 + 461394E1264BA539807AE22B6681037D /* SDWebImageOperation.m in Sources */,
  2265 + CAD57C741FFBC3EBCA19E4F1891E4FDA /* SDWebImageOptionsProcessor.m in Sources */,
  2266 + ED388349310FF50899F3AEB5E2DF0500 /* SDWebImagePrefetcher.m in Sources */,
  2267 + 7A39F3B62173880BC1A1E872B2B0DE19 /* SDWebImageTransition.m in Sources */,
  2268 + C8D1A63DACC1ED208C203641C69EEEF1 /* UIButton+WebCache.m in Sources */,
  2269 + F4BE0CAF1D4BF04D766DB4A25AE4A4C2 /* UIColor+SDHexString.m in Sources */,
  2270 + 3D269D2B6E70D5134F84F471FA897C1D /* UIImage+ExtendedCacheData.m in Sources */,
  2271 + 66794E1E249B57756C75632B1CF7AA7A /* UIImage+ForceDecode.m in Sources */,
  2272 + 34E8A42A4CD18CF55A1C5CBD1F222D71 /* UIImage+GIF.m in Sources */,
  2273 + 8B74D26ECDC0A95EADFD2FE3D6044F45 /* UIImage+MemoryCacheCost.m in Sources */,
  2274 + 90B45AE4B48040DD4DF7B2521A41FA93 /* UIImage+Metadata.m in Sources */,
  2275 + B6B6619A760B666DE47643F684DCF92A /* UIImage+MultiFormat.m in Sources */,
  2276 + 9CBF5A5EFC5491417ACEF9D2D6F604DD /* UIImage+Transform.m in Sources */,
  2277 + 271841B1A02A31A896499240CC233E7A /* UIImageView+HighlightedWebCache.m in Sources */,
  2278 + 580A58EB2DC597145BE726FF15B7B980 /* UIImageView+WebCache.m in Sources */,
  2279 + 16B189FD50EB941DDBCEF3718C511381 /* UIView+WebCache.m in Sources */,
  2280 + 8D6092C5708543E1975D21EF342829A9 /* UIView+WebCacheOperation.m in Sources */,
2201 2281 );
2202 2282 runOnlyForDeploymentPostprocessing = 0;
2203 2283 };
... ... @@ -2303,9 +2383,43 @@
2303 2383 /* End PBXTargetDependency section */
2304 2384  
2305 2385 /* Begin XCBuildConfiguration section */
2306   - 0D51E6D665830E8C0F6875C54D2AC40B /* Release */ = {
  2386 + 08BD4C03DE661802FE73864480E43F7C /* Release */ = {
  2387 + isa = XCBuildConfiguration;
  2388 + baseConfigurationReference = 3F544E13A1E9FD128E0AF79DBF99E602 /* Pods-YBImageBrowser_DSCnliveShop_Example.release.xcconfig */;
  2389 + buildSettings = {
  2390 + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
  2391 + CODE_SIGN_IDENTITY = "";
  2392 + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
  2393 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
  2394 + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
  2395 + CURRENT_PROJECT_VERSION = 1;
  2396 + DEFINES_MODULE = YES;
  2397 + DYLIB_COMPATIBILITY_VERSION = 1;
  2398 + DYLIB_CURRENT_VERSION = 1;
  2399 + DYLIB_INSTALL_NAME_BASE = "@rpath";
  2400 + INFOPLIST_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Example/Pods-YBImageBrowser_DSCnliveShop_Example-Info.plist";
  2401 + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
  2402 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
  2403 + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
  2404 + MACH_O_TYPE = staticlib;
  2405 + MODULEMAP_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Example/Pods-YBImageBrowser_DSCnliveShop_Example.modulemap";
  2406 + OTHER_LDFLAGS = "";
  2407 + OTHER_LIBTOOLFLAGS = "";
  2408 + PODS_ROOT = "$(SRCROOT)";
  2409 + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
  2410 + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
  2411 + SDKROOT = iphoneos;
  2412 + SKIP_INSTALL = YES;
  2413 + TARGETED_DEVICE_FAMILY = "1,2";
  2414 + VALIDATE_PRODUCT = YES;
  2415 + VERSIONING_SYSTEM = "apple-generic";
  2416 + VERSION_INFO_PREFIX = "";
  2417 + };
  2418 + name = Release;
  2419 + };
  2420 + 0E0881E1CF6CB5CB69A59B5DB8946635 /* Release */ = {
2307 2421 isa = XCBuildConfiguration;
2308   - baseConfigurationReference = 8B5C5257F6B18F69C086B439A25052BD /* SDWebImage.release.xcconfig */;
  2422 + baseConfigurationReference = 69B6E48A6A7BF7FDA397F18D808442A2 /* SDWebImage.release.xcconfig */;
2309 2423 buildSettings = {
2310 2424 CODE_SIGN_IDENTITY = "";
2311 2425 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2335,9 +2449,9 @@
2335 2449 };
2336 2450 name = Release;
2337 2451 };
2338   - 314845AEFA52C16806836E92F522B3DA /* Debug */ = {
  2452 + 10ED6ADB52D8B1FCFB0CF456419C6894 /* Debug */ = {
2339 2453 isa = XCBuildConfiguration;
2340   - baseConfigurationReference = D2A8889944F3D4BE1188A99F60D3CA7A /* YYKit.debug.xcconfig */;
  2454 + baseConfigurationReference = 3937A5FCAE6FD5C9CBFD132D61702EB0 /* SDWebImage.debug.xcconfig */;
2341 2455 buildSettings = {
2342 2456 CODE_SIGN_IDENTITY = "";
2343 2457 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2348,14 +2462,14 @@
2348 2462 DYLIB_COMPATIBILITY_VERSION = 1;
2349 2463 DYLIB_CURRENT_VERSION = 1;
2350 2464 DYLIB_INSTALL_NAME_BASE = "@rpath";
2351   - GCC_PREFIX_HEADER = "Target Support Files/YYKit/YYKit-prefix.pch";
2352   - INFOPLIST_FILE = "Target Support Files/YYKit/YYKit-Info.plist";
  2465 + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";
  2466 + INFOPLIST_FILE = "Target Support Files/SDWebImage/SDWebImage-Info.plist";
2353 2467 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2354 2468 IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2355 2469 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2356   - MODULEMAP_FILE = "Target Support Files/YYKit/YYKit.modulemap";
2357   - PRODUCT_MODULE_NAME = YYKit;
2358   - PRODUCT_NAME = YYKit;
  2470 + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";
  2471 + PRODUCT_MODULE_NAME = SDWebImage;
  2472 + PRODUCT_NAME = SDWebImage;
2359 2473 SDKROOT = iphoneos;
2360 2474 SKIP_INSTALL = YES;
2361 2475 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
... ... @@ -2366,9 +2480,9 @@
2366 2480 };
2367 2481 name = Debug;
2368 2482 };
2369   - 47DAF87FCCCAB26DF692F7F33319AEE3 /* Release */ = {
  2483 + 314845AEFA52C16806836E92F522B3DA /* Debug */ = {
2370 2484 isa = XCBuildConfiguration;
2371   - baseConfigurationReference = 2FA8DD8E17F9BA15127FBA5142430978 /* YBImageBrowser_DSCnliveShop.release.xcconfig */;
  2485 + baseConfigurationReference = D2A8889944F3D4BE1188A99F60D3CA7A /* YYKit.debug.xcconfig */;
2372 2486 buildSettings = {
2373 2487 CODE_SIGN_IDENTITY = "";
2374 2488 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
... ... @@ -2379,90 +2493,28 @@
2379 2493 DYLIB_COMPATIBILITY_VERSION = 1;
2380 2494 DYLIB_CURRENT_VERSION = 1;
2381 2495 DYLIB_INSTALL_NAME_BASE = "@rpath";
2382   - GCC_PREFIX_HEADER = "Target Support Files/YBImageBrowser_DSCnliveShop/YBImageBrowser_DSCnliveShop-prefix.pch";
2383   - INFOPLIST_FILE = "Target Support Files/YBImageBrowser_DSCnliveShop/YBImageBrowser_DSCnliveShop-Info.plist";
  2496 + GCC_PREFIX_HEADER = "Target Support Files/YYKit/YYKit-prefix.pch";
  2497 + INFOPLIST_FILE = "Target Support Files/YYKit/YYKit-Info.plist";
2384 2498 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2385   - IPHONEOS_DEPLOYMENT_TARGET = 9.0;
  2499 + IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2386 2500 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2387   - MODULEMAP_FILE = "Target Support Files/YBImageBrowser_DSCnliveShop/YBImageBrowser_DSCnliveShop.modulemap";
2388   - PRODUCT_MODULE_NAME = YBImageBrowser_DSCnliveShop;
2389   - PRODUCT_NAME = YBImageBrowser_DSCnliveShop;
  2501 + MODULEMAP_FILE = "Target Support Files/YYKit/YYKit.modulemap";
  2502 + PRODUCT_MODULE_NAME = YYKit;
  2503 + PRODUCT_NAME = YYKit;
2390 2504 SDKROOT = iphoneos;
2391 2505 SKIP_INSTALL = YES;
2392 2506 SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
2393 2507 SWIFT_VERSION = 4.0;
2394 2508 TARGETED_DEVICE_FAMILY = "1,2";
2395   - VALIDATE_PRODUCT = YES;
2396 2509 VERSIONING_SYSTEM = "apple-generic";
2397 2510 VERSION_INFO_PREFIX = "";
2398 2511 };
2399   - name = Release;
2400   - };
2401   - 4BE66A09A74FD25164AAB3C2645B9B93 /* Release */ = {
2402   - isa = XCBuildConfiguration;
2403   - buildSettings = {
2404   - ALWAYS_SEARCH_USER_PATHS = NO;
2405   - CLANG_ANALYZER_NONNULL = YES;
2406   - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
2407   - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
2408   - CLANG_CXX_LIBRARY = "libc++";
2409   - CLANG_ENABLE_MODULES = YES;
2410   - CLANG_ENABLE_OBJC_ARC = YES;
2411   - CLANG_ENABLE_OBJC_WEAK = YES;
2412   - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
2413   - CLANG_WARN_BOOL_CONVERSION = YES;
2414   - CLANG_WARN_COMMA = YES;
2415   - CLANG_WARN_CONSTANT_CONVERSION = YES;
2416   - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
2417   - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
2418   - CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
2419   - CLANG_WARN_EMPTY_BODY = YES;
2420   - CLANG_WARN_ENUM_CONVERSION = YES;
2421   - CLANG_WARN_INFINITE_RECURSION = YES;
2422   - CLANG_WARN_INT_CONVERSION = YES;
2423   - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
2424   - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
2425   - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
2426   - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
2427   - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
2428   - CLANG_WARN_STRICT_PROTOTYPES = YES;
2429   - CLANG_WARN_SUSPICIOUS_MOVE = YES;
2430   - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
2431   - CLANG_WARN_UNREACHABLE_CODE = YES;
2432   - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
2433   - COPY_PHASE_STRIP = NO;
2434   - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
2435   - ENABLE_NS_ASSERTIONS = NO;
2436   - ENABLE_STRICT_OBJC_MSGSEND = YES;
2437   - GCC_C_LANGUAGE_STANDARD = gnu11;
2438   - GCC_NO_COMMON_BLOCKS = YES;
2439   - GCC_PREPROCESSOR_DEFINITIONS = (
2440   - "POD_CONFIGURATION_RELEASE=1",
2441   - "$(inherited)",
2442   - );
2443   - GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
2444   - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
2445   - GCC_WARN_UNDECLARED_SELECTOR = YES;
2446   - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
2447   - GCC_WARN_UNUSED_FUNCTION = YES;
2448   - GCC_WARN_UNUSED_VARIABLE = YES;
2449   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2450   - MTL_ENABLE_DEBUG_INFO = NO;
2451   - MTL_FAST_MATH = YES;
2452   - PRODUCT_NAME = "$(TARGET_NAME)";
2453   - STRIP_INSTALLED_PRODUCT = NO;
2454   - SWIFT_COMPILATION_MODE = wholemodule;
2455   - SWIFT_OPTIMIZATION_LEVEL = "-O";
2456   - SWIFT_VERSION = 5.0;
2457   - SYMROOT = "${SRCROOT}/../build";
2458   - };
2459   - name = Release;
  2512 + name = Debug;
2460 2513 };
2461   - 65CAD0DB9ACC9D380CF17B3A59007744 /* Debug */ = {
  2514 + 47DAF87FCCCAB26DF692F7F33319AEE3 /* Release */ = {
2462 2515 isa = XCBuildConfiguration;
2463   - baseConfigurationReference = C468387A3C29B551DAA6C6AF5145ACB1 /* Pods-YBImageBrowser_DSCnliveShop_Tests.debug.xcconfig */;
  2516 + baseConfigurationReference = 2FA8DD8E17F9BA15127FBA5142430978 /* YBImageBrowser_DSCnliveShop.release.xcconfig */;
2464 2517 buildSettings = {
2465   - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
2466 2518 CODE_SIGN_IDENTITY = "";
2467 2519 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
2468 2520 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
... ... @@ -2472,24 +2524,24 @@
2472 2524 DYLIB_COMPATIBILITY_VERSION = 1;
2473 2525 DYLIB_CURRENT_VERSION = 1;
2474 2526 DYLIB_INSTALL_NAME_BASE = "@rpath";
2475   - INFOPLIST_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Tests/Pods-YBImageBrowser_DSCnliveShop_Tests-Info.plist";
  2527 + GCC_PREFIX_HEADER = "Target Support Files/YBImageBrowser_DSCnliveShop/YBImageBrowser_DSCnliveShop-prefix.pch";
  2528 + INFOPLIST_FILE = "Target Support Files/YBImageBrowser_DSCnliveShop/YBImageBrowser_DSCnliveShop-Info.plist";
2476 2529 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2477   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2530 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
2478 2531 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2479   - MACH_O_TYPE = staticlib;
2480   - MODULEMAP_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Tests/Pods-YBImageBrowser_DSCnliveShop_Tests.modulemap";
2481   - OTHER_LDFLAGS = "";
2482   - OTHER_LIBTOOLFLAGS = "";
2483   - PODS_ROOT = "$(SRCROOT)";
2484   - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
2485   - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
  2532 + MODULEMAP_FILE = "Target Support Files/YBImageBrowser_DSCnliveShop/YBImageBrowser_DSCnliveShop.modulemap";
  2533 + PRODUCT_MODULE_NAME = YBImageBrowser_DSCnliveShop;
  2534 + PRODUCT_NAME = YBImageBrowser_DSCnliveShop;
2486 2535 SDKROOT = iphoneos;
2487 2536 SKIP_INSTALL = YES;
  2537 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
  2538 + SWIFT_VERSION = 4.0;
2488 2539 TARGETED_DEVICE_FAMILY = "1,2";
  2540 + VALIDATE_PRODUCT = YES;
2489 2541 VERSIONING_SYSTEM = "apple-generic";
2490 2542 VERSION_INFO_PREFIX = "";
2491 2543 };
2492   - name = Debug;
  2544 + name = Release;
2493 2545 };
2494 2546 6966535A7DBCE30F3B4CF73894B214CD /* Debug */ = {
2495 2547 isa = XCBuildConfiguration;
... ... @@ -2554,41 +2606,67 @@
2554 2606 };
2555 2607 name = Release;
2556 2608 };
2557   - 7DA921B4081D5F0D0F536BC991584013 /* Release */ = {
  2609 + 8F17DC3A99F99FBAD606CE6963886315 /* Release */ = {
2558 2610 isa = XCBuildConfiguration;
2559   - baseConfigurationReference = C6E9A2826ED6D4338904F22C672B4751 /* Pods-YBImageBrowser_DSCnliveShop_Tests.release.xcconfig */;
2560 2611 buildSettings = {
2561   - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
2562   - CODE_SIGN_IDENTITY = "";
2563   - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
2564   - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
2565   - "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
2566   - CURRENT_PROJECT_VERSION = 1;
2567   - DEFINES_MODULE = YES;
2568   - DYLIB_COMPATIBILITY_VERSION = 1;
2569   - DYLIB_CURRENT_VERSION = 1;
2570   - DYLIB_INSTALL_NAME_BASE = "@rpath";
2571   - INFOPLIST_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Tests/Pods-YBImageBrowser_DSCnliveShop_Tests-Info.plist";
2572   - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2573   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2574   - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2575   - MACH_O_TYPE = staticlib;
2576   - MODULEMAP_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Tests/Pods-YBImageBrowser_DSCnliveShop_Tests.modulemap";
2577   - OTHER_LDFLAGS = "";
2578   - OTHER_LIBTOOLFLAGS = "";
2579   - PODS_ROOT = "$(SRCROOT)";
2580   - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
2581   - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
2582   - SDKROOT = iphoneos;
2583   - SKIP_INSTALL = YES;
2584   - TARGETED_DEVICE_FAMILY = "1,2";
2585   - VALIDATE_PRODUCT = YES;
2586   - VERSIONING_SYSTEM = "apple-generic";
2587   - VERSION_INFO_PREFIX = "";
  2612 + ALWAYS_SEARCH_USER_PATHS = NO;
  2613 + CLANG_ANALYZER_NONNULL = YES;
  2614 + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
  2615 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
  2616 + CLANG_CXX_LIBRARY = "libc++";
  2617 + CLANG_ENABLE_MODULES = YES;
  2618 + CLANG_ENABLE_OBJC_ARC = YES;
  2619 + CLANG_ENABLE_OBJC_WEAK = YES;
  2620 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  2621 + CLANG_WARN_BOOL_CONVERSION = YES;
  2622 + CLANG_WARN_COMMA = YES;
  2623 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  2624 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  2625 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  2626 + CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
  2627 + CLANG_WARN_EMPTY_BODY = YES;
  2628 + CLANG_WARN_ENUM_CONVERSION = YES;
  2629 + CLANG_WARN_INFINITE_RECURSION = YES;
  2630 + CLANG_WARN_INT_CONVERSION = YES;
  2631 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  2632 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
  2633 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  2634 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  2635 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  2636 + CLANG_WARN_STRICT_PROTOTYPES = YES;
  2637 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  2638 + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
  2639 + CLANG_WARN_UNREACHABLE_CODE = YES;
  2640 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
  2641 + COPY_PHASE_STRIP = NO;
  2642 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  2643 + ENABLE_NS_ASSERTIONS = NO;
  2644 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  2645 + GCC_C_LANGUAGE_STANDARD = gnu11;
  2646 + GCC_NO_COMMON_BLOCKS = YES;
  2647 + GCC_PREPROCESSOR_DEFINITIONS = (
  2648 + "POD_CONFIGURATION_RELEASE=1",
  2649 + "$(inherited)",
  2650 + );
  2651 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  2652 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  2653 + GCC_WARN_UNDECLARED_SELECTOR = YES;
  2654 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  2655 + GCC_WARN_UNUSED_FUNCTION = YES;
  2656 + GCC_WARN_UNUSED_VARIABLE = YES;
  2657 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
  2658 + MTL_ENABLE_DEBUG_INFO = NO;
  2659 + MTL_FAST_MATH = YES;
  2660 + PRODUCT_NAME = "$(TARGET_NAME)";
  2661 + STRIP_INSTALLED_PRODUCT = NO;
  2662 + SWIFT_COMPILATION_MODE = wholemodule;
  2663 + SWIFT_OPTIMIZATION_LEVEL = "-O";
  2664 + SWIFT_VERSION = 5.0;
  2665 + SYMROOT = "${SRCROOT}/../build";
2588 2666 };
2589 2667 name = Release;
2590 2668 };
2591   - 7EF7227D9B20A1D549000096ACCB23D7 /* Debug */ = {
  2669 + 916E0404255105F480DC4950B7625F7A /* Debug */ = {
2592 2670 isa = XCBuildConfiguration;
2593 2671 buildSettings = {
2594 2672 ALWAYS_SEARCH_USER_PATHS = NO;
... ... @@ -2639,7 +2717,7 @@
2639 2717 GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
2640 2718 GCC_WARN_UNUSED_FUNCTION = YES;
2641 2719 GCC_WARN_UNUSED_VARIABLE = YES;
2642   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2720 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
2643 2721 MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
2644 2722 MTL_FAST_MATH = YES;
2645 2723 ONLY_ACTIVE_ARCH = YES;
... ... @@ -2652,9 +2730,9 @@
2652 2730 };
2653 2731 name = Debug;
2654 2732 };
2655   - 9BED370792FF2E3FFBF58B383A0F80DC /* Release */ = {
  2733 + E795E7E265DDC88CE4D069201368C872 /* Release */ = {
2656 2734 isa = XCBuildConfiguration;
2657   - baseConfigurationReference = 3F544E13A1E9FD128E0AF79DBF99E602 /* Pods-YBImageBrowser_DSCnliveShop_Example.release.xcconfig */;
  2735 + baseConfigurationReference = C6E9A2826ED6D4338904F22C672B4751 /* Pods-YBImageBrowser_DSCnliveShop_Tests.release.xcconfig */;
2658 2736 buildSettings = {
2659 2737 ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
2660 2738 CODE_SIGN_IDENTITY = "";
... ... @@ -2666,12 +2744,12 @@
2666 2744 DYLIB_COMPATIBILITY_VERSION = 1;
2667 2745 DYLIB_CURRENT_VERSION = 1;
2668 2746 DYLIB_INSTALL_NAME_BASE = "@rpath";
2669   - INFOPLIST_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Example/Pods-YBImageBrowser_DSCnliveShop_Example-Info.plist";
  2747 + INFOPLIST_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Tests/Pods-YBImageBrowser_DSCnliveShop_Tests-Info.plist";
2670 2748 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2671   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2749 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
2672 2750 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2673 2751 MACH_O_TYPE = staticlib;
2674   - MODULEMAP_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Example/Pods-YBImageBrowser_DSCnliveShop_Example.modulemap";
  2752 + MODULEMAP_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Tests/Pods-YBImageBrowser_DSCnliveShop_Tests.modulemap";
2675 2753 OTHER_LDFLAGS = "";
2676 2754 OTHER_LIBTOOLFLAGS = "";
2677 2755 PODS_ROOT = "$(SRCROOT)";
... ... @@ -2686,10 +2764,11 @@
2686 2764 };
2687 2765 name = Release;
2688 2766 };
2689   - BEA610A857E2D8D010A0A55145F83675 /* Debug */ = {
  2767 + FF4BFE2A81294464234F9404FF9BB79B /* Debug */ = {
2690 2768 isa = XCBuildConfiguration;
2691   - baseConfigurationReference = 35974735D558DD140EC7A519306676BF /* SDWebImage.debug.xcconfig */;
  2769 + baseConfigurationReference = C468387A3C29B551DAA6C6AF5145ACB1 /* Pods-YBImageBrowser_DSCnliveShop_Tests.debug.xcconfig */;
2692 2770 buildSettings = {
  2771 + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
2693 2772 CODE_SIGN_IDENTITY = "";
2694 2773 "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
2695 2774 "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
... ... @@ -2699,25 +2778,26 @@
2699 2778 DYLIB_COMPATIBILITY_VERSION = 1;
2700 2779 DYLIB_CURRENT_VERSION = 1;
2701 2780 DYLIB_INSTALL_NAME_BASE = "@rpath";
2702   - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch";
2703   - INFOPLIST_FILE = "Target Support Files/SDWebImage/SDWebImage-Info.plist";
  2781 + INFOPLIST_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Tests/Pods-YBImageBrowser_DSCnliveShop_Tests-Info.plist";
2704 2782 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2705   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2783 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
2706 2784 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2707   - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap";
2708   - PRODUCT_MODULE_NAME = SDWebImage;
2709   - PRODUCT_NAME = SDWebImage;
  2785 + MACH_O_TYPE = staticlib;
  2786 + MODULEMAP_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Tests/Pods-YBImageBrowser_DSCnliveShop_Tests.modulemap";
  2787 + OTHER_LDFLAGS = "";
  2788 + OTHER_LIBTOOLFLAGS = "";
  2789 + PODS_ROOT = "$(SRCROOT)";
  2790 + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
  2791 + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
2710 2792 SDKROOT = iphoneos;
2711 2793 SKIP_INSTALL = YES;
2712   - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
2713   - SWIFT_VERSION = 4.0;
2714 2794 TARGETED_DEVICE_FAMILY = "1,2";
2715 2795 VERSIONING_SYSTEM = "apple-generic";
2716 2796 VERSION_INFO_PREFIX = "";
2717 2797 };
2718 2798 name = Debug;
2719 2799 };
2720   - EA56C50E93CDB934316EBC888CDCBFA9 /* Debug */ = {
  2800 + FF589B472AB97CF036E0C55E1D0ED859 /* Debug */ = {
2721 2801 isa = XCBuildConfiguration;
2722 2802 baseConfigurationReference = 32AA9B50FD45F8829F9B21411363EC98 /* Pods-YBImageBrowser_DSCnliveShop_Example.debug.xcconfig */;
2723 2803 buildSettings = {
... ... @@ -2733,7 +2813,7 @@
2733 2813 DYLIB_INSTALL_NAME_BASE = "@rpath";
2734 2814 INFOPLIST_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Example/Pods-YBImageBrowser_DSCnliveShop_Example-Info.plist";
2735 2815 INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2736   - IPHONEOS_DEPLOYMENT_TARGET = 8.0;
  2816 + IPHONEOS_DEPLOYMENT_TARGET = 9.0;
2737 2817 LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
2738 2818 MACH_O_TYPE = staticlib;
2739 2819 MODULEMAP_FILE = "Target Support Files/Pods-YBImageBrowser_DSCnliveShop_Example/Pods-YBImageBrowser_DSCnliveShop_Example.modulemap";
... ... @@ -2765,8 +2845,8 @@
2765 2845 136A218DAAC157615BAC2D4978A8D3E4 /* Build configuration list for PBXNativeTarget "Pods-YBImageBrowser_DSCnliveShop_Example" */ = {
2766 2846 isa = XCConfigurationList;
2767 2847 buildConfigurations = (
2768   - EA56C50E93CDB934316EBC888CDCBFA9 /* Debug */,
2769   - 9BED370792FF2E3FFBF58B383A0F80DC /* Release */,
  2848 + FF589B472AB97CF036E0C55E1D0ED859 /* Debug */,
  2849 + 08BD4C03DE661802FE73864480E43F7C /* Release */,
2770 2850 );
2771 2851 defaultConfigurationIsVisible = 0;
2772 2852 defaultConfigurationName = Release;
... ... @@ -2774,8 +2854,8 @@
2774 2854 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
2775 2855 isa = XCConfigurationList;
2776 2856 buildConfigurations = (
2777   - 7EF7227D9B20A1D549000096ACCB23D7 /* Debug */,
2778   - 4BE66A09A74FD25164AAB3C2645B9B93 /* Release */,
  2857 + 916E0404255105F480DC4950B7625F7A /* Debug */,
  2858 + 8F17DC3A99F99FBAD606CE6963886315 /* Release */,
2779 2859 );
2780 2860 defaultConfigurationIsVisible = 0;
2781 2861 defaultConfigurationName = Release;
... ... @@ -2783,17 +2863,17 @@
2783 2863 5A6D95389D2189EF0D281DDF2B2691A9 /* Build configuration list for PBXNativeTarget "Pods-YBImageBrowser_DSCnliveShop_Tests" */ = {
2784 2864 isa = XCConfigurationList;
2785 2865 buildConfigurations = (
2786   - 65CAD0DB9ACC9D380CF17B3A59007744 /* Debug */,
2787   - 7DA921B4081D5F0D0F536BC991584013 /* Release */,
  2866 + FF4BFE2A81294464234F9404FF9BB79B /* Debug */,
  2867 + E795E7E265DDC88CE4D069201368C872 /* Release */,
2788 2868 );
2789 2869 defaultConfigurationIsVisible = 0;
2790 2870 defaultConfigurationName = Release;
2791 2871 };
2792   - 74451F5A9D7B9165630F6C64F97C5913 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = {
  2872 + AC6F755EB18559BA16F3A7501A53F36A /* Build configuration list for PBXNativeTarget "SDWebImage" */ = {
2793 2873 isa = XCConfigurationList;
2794 2874 buildConfigurations = (
2795   - BEA610A857E2D8D010A0A55145F83675 /* Debug */,
2796   - 0D51E6D665830E8C0F6875C54D2AC40B /* Release */,
  2875 + 10ED6ADB52D8B1FCFB0CF456419C6894 /* Debug */,
  2876 + 0E0881E1CF6CB5CB69A59B5DB8946635 /* Release */,
2797 2877 );
2798 2878 defaultConfigurationIsVisible = 0;
2799 2879 defaultConfigurationName = Release;
... ...
Example/Pods/SDWebImage/README.md
... ... @@ -19,8 +19,9 @@ This library provides an async image downloader with cache support. For convenie
19 19 - [x] Categories for `UIImageView`, `UIButton`, `MKAnnotationView` adding web image and cache management
20 20 - [x] An asynchronous image downloader
21 21 - [x] An asynchronous memory + disk image caching with automatic cache expiration handling
22   -- [x] A background image decompression
23   -- [x] Progressive image loading (including animated image, like GIF showing in Web browser)
  22 +- [x] A background image decompression to avoid frame rate drop
  23 +- [x] [Progressive image loading](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#progressive-animation) (including animated image, like GIF showing in Web browser)
  24 +- [x] [Thumbnail image decoding](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#thumbnail-decoding-550) to save CPU && Memory for large images
24 25 - [x] [Extendable image coder](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#custom-coder-420) to support massive image format, like WebP
25 26 - [x] [Full-stack solution for animated images](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#animated-image-50) which keep a balance between CPU && Memory
26 27 - [x] [Customizable and composable transformations](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#transformer-50) can be applied to the images right after download
... ... @@ -36,11 +37,11 @@ This library provides an async image downloader with cache support. For convenie
36 37  
37 38 ## Supported Image Formats
38 39  
39   -- Image formats supported by UIImage (JPEG, PNG, HEIC, ...), including GIF/APNG/HEIC animation
  40 +- Image formats supported by Apple system (JPEG, PNG, TIFF, HEIC, ...), including GIF/APNG/HEIC animation
40 41 - WebP format, including animated WebP (use the [SDWebImageWebPCoder](https://github.com/SDWebImage/SDWebImageWebPCoder) project)
41 42 - Support extendable coder plugins for new image formats like BPG, AVIF. And vector format like PDF, SVG. See all the list in [Image coder plugin List](https://github.com/SDWebImage/SDWebImage/wiki/Coder-Plugin-List)
42 43  
43   -## Additional modules
  44 +## Additional modules and Ecosystem
44 45  
45 46 In order to keep SDWebImage focused and limited to the core features, but also allow extensibility and custom behaviors, during the 5.0 refactoring we focused on modularizing the library.
46 47 As such, we have moved/built new modules to [SDWebImage org](https://github.com/SDWebImage).
... ... @@ -48,29 +49,47 @@ As such, we have moved/built new modules to [SDWebImage org](https://github.com/
48 49 #### SwiftUI
49 50 [SwiftUI](https://developer.apple.com/xcode/swiftui/) is an innovative UI framework written in Swift to build user interfaces across all Apple platforms.
50 51  
51   -We support SwiftUI by building with the functions (caching, loading and animation) powered by SDWebImage. You can have a try with [SDWebImageSwiftUI](https://github.com/SDWebImage/SDWebImageSwiftUI)
  52 +We support SwiftUI by building a brand new framework called [SDWebImageSwiftUI](https://github.com/SDWebImage/SDWebImageSwiftUI), which is built on top of SDWebImage core functions (caching, loading and animation).
  53 +
  54 +The new framework introduce two View structs `WebImage` and `AnimatedImage` for SwiftUI world, `ImageIndicator` modifier for any View, `ImageManager` observable object for data source. Supports iOS 13+/macOS 10.15+/tvOS 13+/watchOS 6+ and Swift 5.1. Have a nice try and provide feedback!
52 55  
53 56 #### Coders for additional image formats
54   -- [SDWebImageWebPCoder](https://github.com/SDWebImage/SDWebImageWebPCoder) - coder for WebP image format. Based on [libwebp](https://chromium.googlesource.com/webm/libwebp)
55   -- [SDWebImageHEIFCoder](https://github.com/SDWebImage/SDWebImageHEIFCoder) - coder to support HEIF image without Apple's `Image/IO framework`, iOS 8+/macOS 10.10+ support.
56   -- [SDWebImageBPGCoder](https://github.com/SDWebImage/SDWebImageBPGCoder) - coder for BPG format
57   -- [SDWebImageFLIFCoder](https://github.com/SDWebImage/SDWebImageFLIFCoder) - coder for FLIF format
58   -- [SDWebImageAVIFCoder](https://github.com/SDWebImage/SDWebImageAVIFCoder) - coder for AVIF (AV1-based) format
  57 +- [SDWebImageWebPCoder](https://github.com/SDWebImage/SDWebImageWebPCoder) - coder for WebP format. Based on [libwebp](https://chromium.googlesource.com/webm/libwebp)
  58 +- [SDWebImageHEIFCoder](https://github.com/SDWebImage/SDWebImageHEIFCoder) - coder for HEIF format, iOS 8+/macOS 10.10+ support. Based on [libheif](https://github.com/strukturag/libheif)
  59 +- [SDWebImageBPGCoder](https://github.com/SDWebImage/SDWebImageBPGCoder) - coder for BPG format. Based on [libbpg](https://github.com/mirrorer/libbpg)
  60 +- [SDWebImageFLIFCoder](https://github.com/SDWebImage/SDWebImageFLIFCoder) - coder for FLIF format. Based on [libflif](https://github.com/FLIF-hub/FLIF)
  61 +- [SDWebImageAVIFCoder](https://github.com/SDWebImage/SDWebImageAVIFCoder) - coder for AVIF (AV1-based) format. Based on [libavif](https://github.com/AOMediaCodec/libavif)
  62 +- [SDWebImagePDFCoder](https://github.com/SDWebImage/SDWebImagePDFCoder) - coder for PDF vector format. Using built-in frameworks
  63 +- [SDWebImageSVGCoder](https://github.com/SDWebImage/SDWebImageSVGCoder) - coder for SVG vector format. Using built-in frameworks
  64 +- [SDWebImageLottieCoder](https://github.com/SDWebImage/SDWebImageLottieCoder) - coder for Lottie animation format. Based on [rlottie](https://github.com/Samsung/rlottie)
59 65 - and more from community!
60 66  
61   -#### Loaders
  67 +#### Custom Caches
  68 +- [SDWebImageYYPlugin](https://github.com/SDWebImage/SDWebImageYYPlugin) - plugin to support caching images with [YYCache](https://github.com/ibireme/YYCache)
  69 +- [SDWebImagePINPlugin](https://github.com/SDWebImage/SDWebImagePINPlugin) - plugin to support caching images with [PINCache](https://github.com/pinterest/PINCache)
  70 +
  71 +#### Custom Loaders
62 72 - [SDWebImagePhotosPlugin](https://github.com/SDWebImage/SDWebImagePhotosPlugin) - plugin to support loading images from Photos (using `Photos.framework`)
  73 +- [SDWebImageLinkPlugin](https://github.com/SDWebImage/SDWebImageLinkPlugin) - plugin to support loading images from rich link url, as well as `LPLinkView` (using `LinkPresentation.framework`)
63 74  
64 75 #### Integration with 3rd party libraries
  76 +- [SDWebImageLottiePlugin](https://github.com/SDWebImage/SDWebImageLottiePlugin) - plugin to support [Lottie-iOS](https://github.com/airbnb/lottie-ios), vector animation rending with remote JSON files
  77 +- [SDWebImageSVGKitPlugin](https://github.com/SDWebImage/SDWebImageLottiePlugin) - plugin to support [SVGKit](https://github.com/SVGKit/SVGKit), SVG rendering using Core Animation, iOS 8+/macOS 10.10+ support
65 78 - [SDWebImageFLPlugin](https://github.com/SDWebImage/SDWebImageFLPlugin) - plugin to support [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) as the engine for animated GIFs
66 79 - [SDWebImageYYPlugin](https://github.com/SDWebImage/SDWebImageYYPlugin) - plugin to integrate [YYImage](https://github.com/ibireme/YYImage) & [YYCache](https://github.com/ibireme/YYCache) for image rendering & caching
67 80  
  81 +#### Community driven popular libraries
  82 +- [FirebaseUI](https://github.com/firebase/FirebaseUI-iOS) - Firebase Storage binding for query images, based on SDWebImage loader system
  83 +- [react-native-fast-image](https://github.com/DylanVann/react-native-fast-image) - React Native fast image component, based on SDWebImage Animated Image solution
  84 +- [flutter_image_compress](https://github.com/OpenFlutter/flutter_image_compress) - Flutter compresses image plugin, based on SDWebImage WebP coder plugin
  85 +
68 86 #### Make our lives easier
69 87 - [libwebp-Xcode](https://github.com/SDWebImage/libwebp-Xcode) - A wrapper for [libwebp](https://chromium.googlesource.com/webm/libwebp) + an Xcode project.
70 88 - [libheif-Xcode](https://github.com/SDWebImage/libheif-Xcode) - A wrapper for [libheif](https://github.com/strukturag/libheif) + an Xcode project.
71   -- and more third-party C/C++ image codec libraries with CocoaPods/Carthage support.
  89 +- [libavif-Xcode](https://github.com/SDWebImage/libavif-Xcode) - A wrapper for [libavif](https://github.com/AOMediaCodec/libavif) + an Xcode project.
  90 +- and more third-party C/C++ image codec libraries with CocoaPods/Carthage/SwiftPM support.
72 91  
73   -You can use those directly, or create similar components of your own.
  92 +You can use those directly, or create similar components of your own, by using the customizable architecture of SDWebImage.
74 93  
75 94 ## Requirements
76 95  
... ... @@ -108,11 +127,13 @@ You can use those directly, or create similar components of your own.
108 127 - If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/sdwebimage).
109 128 - If you **found a bug**, open an issue.
110 129 - If you **have a feature request**, open an issue.
  130 +- If you **need IRC channel**, use [Gitter](https://gitter.im/SDWebImage/community).
111 131  
112 132 ## Contribution
113 133  
114 134 - If you **want to contribute**, read the [Contributing Guide](https://github.com/SDWebImage/SDWebImage/blob/master/.github/CONTRIBUTING.md)
115 135 - For **development contribution guide**, read the [How-To-Contribute](https://github.com/SDWebImage/SDWebImage/wiki/How-to-Contribute)
  136 +- For **understanding code architecture**, read the [Code Architecture Analysis](https://github.com/SDWebImage/SDWebImage/wiki/5.6-Code-Architecture-Analysis)
116 137  
117 138 ## How To Use
118 139  
... ... @@ -138,7 +159,30 @@ imageView.sd_setImage(with: URL(string: &quot;http://www.domain.com/path/to/image.jpg
138 159 ## Animated Images (GIF) support
139 160  
140 161 In 5.0, we introduced a brand new mechanism for supporting animated images. This includes animated image loading, rendering, decoding, and also supports customizations (for advanced users).
141   -This animated image solution is available for `iOS`/`tvOS`/`macOS`. The `SDAnimatedImage` is subclass of `UIImage/NSImage`, and `SDAnimatedImageView` is subclass of `UIImageView/NSImageView`, to make them compatible with the common frameworks APIs. See [Animated Image](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#animated-image-50) for more detailed information.
  162 +
  163 +This animated image solution is available for `iOS`/`tvOS`/`macOS`. The `SDAnimatedImage` is subclass of `UIImage/NSImage`, and `SDAnimatedImageView` is subclass of `UIImageView/NSImageView`, to make them compatible with the common frameworks APIs.
  164 +
  165 +The `SDAnimatedImageView` supports the familiar image loading category methods, works like drop-in replacement for `UIImageView/NSImageView`.
  166 +
  167 +Don't have UIView (like WatchKit or CALayer)? you can still use `SDAnimatedPlayer` the player engine for advanced playback and rendering.
  168 +
  169 +See [Animated Image](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#animated-image-50) for more detailed information.
  170 +
  171 +* Objective-C
  172 +
  173 +```objective-c
  174 +SDAnimatedImageView *imageView = [SDAnimatedImageView new];
  175 +SDAnimatedImage *animatedImage = [SDAnimatedImage imageNamed:@"image.gif"];
  176 +imageView.image = animatedImage;
  177 +```
  178 +
  179 +* Swift
  180 +
  181 +```swift
  182 +let imageView = SDAnimatedImageView()
  183 +let animatedImage = SDAnimatedImage(named: "image.gif")
  184 +imageView.image = animatedImage
  185 +```
142 186  
143 187 #### FLAnimatedImage integration has its own dedicated repo
144 188 In order to clean up things and make our core project do less things, we decided that the `FLAnimatedImage` integration does not belong here. From 5.0, this will still be available, but under a dedicated repo [SDWebImageFLPlugin](https://github.com/SDWebImage/SDWebImageFLPlugin).
... ... @@ -240,6 +284,12 @@ In the source files where you need to use the library, import the umbrella heade
240 284 #import <SDWebImage/SDWebImage.h>
241 285 ```
242 286  
  287 +It's also recommend to use the module import syntax, available for CocoaPods(enable `modular_headers`)/Carthage/SwiftPM.
  288 +
  289 +```objecitivec
  290 +@import SDWebImage;
  291 +```
  292 +
243 293 ### Build Project
244 294  
245 295 At this point your workspace should build without error. If you are having problem, post to the Issue and the
... ... @@ -267,6 +317,8 @@ All source code is licensed under the [MIT License](https://github.com/SDWebImag
267 317  
268 318 ## Architecture
269 319  
  320 +To learn about SDWebImage's architecture design for contribution, read [The Core of SDWebImage v5.6 Architecture](https://github.com/SDWebImage/SDWebImage/wiki/5.6-Code-Architecture-Analysis). Thanks @looseyi for the post and translation.
  321 +
270 322 #### High Level Diagram
271 323 <p align="center" >
272 324 <img src="https://raw.githubusercontent.com/SDWebImage/SDWebImage/master/Docs/Diagrams/SDWebImageHighLevelDiagram.jpeg" title="SDWebImage high level diagram">
... ...
Example/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h
... ... @@ -23,6 +23,8 @@ static const SDImageFormat SDImageFormatTIFF = 3;
23 23 static const SDImageFormat SDImageFormatWebP = 4;
24 24 static const SDImageFormat SDImageFormatHEIC = 5;
25 25 static const SDImageFormat SDImageFormatHEIF = 6;
  26 +static const SDImageFormat SDImageFormatPDF = 7;
  27 +static const SDImageFormat SDImageFormatSVG = 8;
26 28  
27 29 /**
28 30 NSData category about the image content type and UTI.
... ... @@ -43,14 +45,16 @@ static const SDImageFormat SDImageFormatHEIF = 6;
43 45 *
44 46 * @param format Format as SDImageFormat
45 47 * @return The UTType as CFStringRef
  48 + * @note For unknown format, `kUTTypeImage` abstract type will return
46 49 */
47 50 + (nonnull CFStringRef)sd_UTTypeFromImageFormat:(SDImageFormat)format CF_RETURNS_NOT_RETAINED NS_SWIFT_NAME(sd_UTType(from:));
48 51  
49 52 /**
50   - * Convert UTTyppe to SDImageFormat
  53 + * Convert UTType to SDImageFormat
51 54 *
52 55 * @param uttype The UTType as CFStringRef
53 56 * @return The Format as SDImageFormat
  57 + * @note For unknown type, `SDImageFormatUndefined` will return
54 58 */
55 59 + (SDImageFormat)sd_imageFormatFromUTType:(nonnull CFStringRef)uttype;
56 60  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.m
... ... @@ -17,6 +17,7 @@
17 17  
18 18 // Currently Image/IO does not support WebP
19 19 #define kSDUTTypeWebP ((__bridge CFStringRef)@"public.webp")
  20 +#define kSVGTagEnd @"</svg>"
20 21  
21 22 @implementation NSData (ImageContentType)
22 23  
... ... @@ -65,6 +66,24 @@
65 66 }
66 67 break;
67 68 }
  69 + case 0x25: {
  70 + if (data.length >= 4) {
  71 + //%PDF
  72 + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(1, 3)] encoding:NSASCIIStringEncoding];
  73 + if ([testString isEqualToString:@"PDF"]) {
  74 + return SDImageFormatPDF;
  75 + }
  76 + }
  77 + }
  78 + case 0x3C: {
  79 + if (data.length > 100) {
  80 + // Check end with SVG tag
  81 + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(data.length - 100, 100)] encoding:NSASCIIStringEncoding];
  82 + if ([testString containsString:kSVGTagEnd]) {
  83 + return SDImageFormatSVG;
  84 + }
  85 + }
  86 + }
68 87 }
69 88 return SDImageFormatUndefined;
70 89 }
... ... @@ -93,9 +112,15 @@
93 112 case SDImageFormatHEIF:
94 113 UTType = kSDUTTypeHEIF;
95 114 break;
  115 + case SDImageFormatPDF:
  116 + UTType = kUTTypePDF;
  117 + break;
  118 + case SDImageFormatSVG:
  119 + UTType = kUTTypeScalableVectorGraphics;
  120 + break;
96 121 default:
97   - // default is kUTTypePNG
98   - UTType = kUTTypePNG;
  122 + // default is kUTTypeImage abstract type
  123 + UTType = kUTTypeImage;
99 124 break;
100 125 }
101 126 return UTType;
... ... @@ -120,6 +145,10 @@
120 145 imageFormat = SDImageFormatHEIC;
121 146 } else if (CFStringCompare(uttype, kSDUTTypeHEIF, 0) == kCFCompareEqualTo) {
122 147 imageFormat = SDImageFormatHEIF;
  148 + } else if (CFStringCompare(uttype, kUTTypePDF, 0) == kCFCompareEqualTo) {
  149 + imageFormat = SDImageFormatPDF;
  150 + } else if (CFStringCompare(uttype, kUTTypeScalableVectorGraphics, 0) == kCFCompareEqualTo) {
  151 + imageFormat = SDImageFormatSVG;
123 152 } else {
124 153 imageFormat = SDImageFormatUndefined;
125 154 }
... ...
Example/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.h
... ... @@ -20,6 +20,10 @@ The underlying Core Graphics image object. This will actually use `CGImageForPro
20 20 */
21 21 @property (nonatomic, readonly, nullable) CGImageRef CGImage;
22 22 /**
  23 + The underlying Core Image data. This will actually use `bestRepresentationForRect` with the image size to find the `NSCIImageRep`.
  24 + */
  25 +@property (nonatomic, readonly, nullable) CIImage *CIImage;
  26 +/**
23 27 The scale factor of the image. This wil actually use `bestRepresentationForRect` with image size and pixel size to calculate the scale factor. If failed, use the default value 1.0. Should be greater than or equal to 1.0.
24 28 */
25 29 @property (nonatomic, readonly) CGFloat scale;
... ... @@ -39,6 +43,16 @@ The underlying Core Graphics image object. This will actually use `CGImageForPro
39 43 - (nonnull instancetype)initWithCGImage:(nonnull CGImageRef)cgImage scale:(CGFloat)scale orientation:(CGImagePropertyOrientation)orientation;
40 44  
41 45 /**
  46 + Initializes and returns an image object with the specified Core Image object. The representation is `NSCIImageRep`.
  47 +
  48 + @param ciImage A Core Image image object
  49 + @param scale The image scale factor
  50 + @param orientation The orientation of the image data
  51 + @return The image object
  52 + */
  53 +- (nonnull instancetype)initWithCIImage:(nonnull CIImage *)ciImage scale:(CGFloat)scale orientation:(CGImagePropertyOrientation)orientation;
  54 +
  55 +/**
42 56 Returns an image object with the scale factor. The representation is created from the image data.
43 57 @note The difference between these this and `initWithData:` is that `initWithData:` will always use `backingScaleFactor` as scale factor.
44 58  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.m
... ... @@ -20,6 +20,15 @@
20 20 return cgImage;
21 21 }
22 22  
  23 +- (nullable CIImage *)CIImage {
  24 + NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
  25 + NSImageRep *imageRep = [self bestRepresentationForRect:imageRect context:nil hints:nil];
  26 + if (![imageRep isKindOfClass:NSCIImageRep.class]) {
  27 + return nil;
  28 + }
  29 + return ((NSCIImageRep *)imageRep).CIImage;
  30 +}
  31 +
23 32 - (CGFloat)scale {
24 33 CGFloat scale = 1;
25 34 NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
... ... @@ -65,6 +74,28 @@
65 74 return self;
66 75 }
67 76  
  77 +- (instancetype)initWithCIImage:(nonnull CIImage *)ciImage scale:(CGFloat)scale orientation:(CGImagePropertyOrientation)orientation {
  78 + NSCIImageRep *imageRep;
  79 + if (orientation != kCGImagePropertyOrientationUp) {
  80 + CIImage *rotatedCIImage = [ciImage imageByApplyingOrientation:orientation];
  81 + imageRep = [[NSCIImageRep alloc] initWithCIImage:rotatedCIImage];
  82 + } else {
  83 + imageRep = [[NSCIImageRep alloc] initWithCIImage:ciImage];
  84 + }
  85 + if (scale < 1) {
  86 + scale = 1;
  87 + }
  88 + CGFloat pixelWidth = imageRep.pixelsWide;
  89 + CGFloat pixelHeight = imageRep.pixelsHigh;
  90 + NSSize size = NSMakeSize(pixelWidth / scale, pixelHeight / scale);
  91 + self = [self initWithSize:size];
  92 + if (self) {
  93 + imageRep.size = size;
  94 + [self addRepresentation:imageRep];
  95 + }
  96 + return self;
  97 +}
  98 +
68 99 - (instancetype)initWithData:(nonnull NSData *)data scale:(CGFloat)scale {
69 100 NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithData:data];
70 101 if (!imageRep) {
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h
... ... @@ -57,6 +57,12 @@
57 57 */
58 58 @property (nonatomic, assign, readonly, getter=isAllFramesLoaded) BOOL allFramesLoaded;
59 59  
  60 +/**
  61 + Return the animated image coder if the image is created with `initWithAnimatedCoder:scale:` method.
  62 + @note We use this with animated coder which conforms to `SDProgressiveImageCoder` for progressive animation decoding.
  63 + */
  64 +@property (nonatomic, strong, readonly, nullable) id<SDAnimatedImageCoder> animatedCoder;
  65 +
60 66 @end
61 67  
62 68 /**
... ... @@ -66,6 +72,7 @@
66 72  
67 73 // This class override these methods from UIImage(NSImage), and it supports NSSecureCoding.
68 74 // You should use these methods to create a new animated image. Use other methods just call super instead.
  75 +// Pay attention, when the animated image frame count <= 1, all the `SDAnimatedImageProvider` protocol methods will return nil or 0 value, you'd better check the frame count before usage and keep fallback.
69 76 + (nullable instancetype)imageNamed:(nonnull NSString *)name; // Cache in memory, no Asset Catalog support
70 77 #if __has_include(<UIKit/UITraitCollection.h>)
71 78 + (nullable instancetype)imageNamed:(nonnull NSString *)name inBundle:(nullable NSBundle *)bundle compatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection; // Cache in memory, no Asset Catalog support
... ... @@ -94,11 +101,11 @@
94 101 The scale factor of the image.
95 102  
96 103 @note For UIKit, this just call super instead.
97   - @note For AppKit, `NSImage` can contains multiple image representations with different scales. However, this class does not do that from the design. We processs the scale like UIKit. This wil actually be calculated from image size and pixel size.
  104 + @note For AppKit, `NSImage` can contains multiple image representations with different scales. However, this class does not do that from the design. We process the scale like UIKit. This will actually be calculated from image size and pixel size.
98 105 */
99 106 @property (nonatomic, readonly) CGFloat scale;
100 107  
101   -// By default, animated image frames are returned by decoding just in time without keeping into memory. But you can choose to preload them into memory as well, See the decsription in `SDAnimatedImage` protocol.
  108 +// By default, animated image frames are returned by decoding just in time without keeping into memory. But you can choose to preload them into memory as well, See the description in `SDAnimatedImage` protocol.
102 109 // After preloaded, there is no huge difference on performance between this and UIImage's `animatedImageWithImages:duration:`. But UIImage's animation have some issues such like blanking and pausing during segue when using in `UIImageView`. It's recommend to use only if need.
103 110 - (void)preloadAllFrames;
104 111 - (void)unloadAllFrames;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m
... ... @@ -12,6 +12,9 @@
12 12 #import "SDImageCodersManager.h"
13 13 #import "SDImageFrame.h"
14 14 #import "UIImage+MemoryCacheCost.h"
  15 +#import "UIImage+Metadata.h"
  16 +#import "UIImage+MultiFormat.h"
  17 +#import "SDImageCoderHelper.h"
15 18 #import "SDImageAssetManager.h"
16 19 #import "objc/runtime.h"
17 20  
... ... @@ -32,7 +35,7 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
32 35  
33 36 @interface SDAnimatedImage ()
34 37  
35   -@property (nonatomic, strong) id<SDAnimatedImageCoder> coder;
  38 +@property (nonatomic, strong) id<SDAnimatedImageCoder> animatedCoder;
36 39 @property (nonatomic, assign, readwrite) SDImageFormat animatedImageFormat;
37 40 @property (atomic, copy) NSArray<SDImageFrame *> *loadedAnimatedImageFrames; // Mark as atomic to keep thread-safe
38 41 @property (nonatomic, assign, getter=isAllFramesLoaded) BOOL allFramesLoaded;
... ... @@ -156,7 +159,10 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
156 159 self = [super initWithCGImage:image.CGImage scale:MAX(scale, 1) orientation:image.imageOrientation];
157 160 #endif
158 161 if (self) {
159   - _coder = animatedCoder;
  162 + // Only keep the animated coder if frame count > 1, save RAM usage for non-animated image format (APNG/WebP)
  163 + if (animatedCoder.animatedImageFrameCount > 1) {
  164 + _animatedCoder = animatedCoder;
  165 + }
160 166 NSData *data = [animatedCoder animatedImageData];
161 167 SDImageFormat format = [NSData sd_imageFormatForImageData:data];
162 168 _animatedImageFormat = format;
... ... @@ -166,6 +172,9 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
166 172  
167 173 #pragma mark - Preload
168 174 - (void)preloadAllFrames {
  175 + if (!_animatedCoder) {
  176 + return;
  177 + }
169 178 if (!self.isAllFramesLoaded) {
170 179 NSMutableArray<SDImageFrame *> *frames = [NSMutableArray arrayWithCapacity:self.animatedImageFrameCount];
171 180 for (size_t i = 0; i < self.animatedImageFrameCount; i++) {
... ... @@ -180,6 +189,9 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
180 189 }
181 190  
182 191 - (void)unloadAllFrames {
  192 + if (!_animatedCoder) {
  193 + return;
  194 + }
183 195 if (self.isAllFramesLoaded) {
184 196 self.loadedAnimatedImageFrames = nil;
185 197 self.allFramesLoaded = NO;
... ... @@ -190,11 +202,12 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
190 202 - (instancetype)initWithCoder:(NSCoder *)aDecoder {
191 203 self = [super initWithCoder:aDecoder];
192 204 if (self) {
  205 + _animatedImageFormat = [aDecoder decodeIntegerForKey:NSStringFromSelector(@selector(animatedImageFormat))];
193 206 NSData *animatedImageData = [aDecoder decodeObjectOfClass:[NSData class] forKey:NSStringFromSelector(@selector(animatedImageData))];
194   - CGFloat scale = self.scale;
195 207 if (!animatedImageData) {
196 208 return self;
197 209 }
  210 + CGFloat scale = self.scale;
198 211 id<SDAnimatedImageCoder> animatedCoder = nil;
199 212 for (id<SDImageCoder>coder in [SDImageCodersManager sharedManager].coders) {
200 213 if ([coder conformsToProtocol:@protocol(SDAnimatedImageCoder)]) {
... ... @@ -207,15 +220,16 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
207 220 if (!animatedCoder) {
208 221 return self;
209 222 }
210   - _coder = animatedCoder;
211   - SDImageFormat format = [NSData sd_imageFormatForImageData:animatedImageData];
212   - _animatedImageFormat = format;
  223 + if (animatedCoder.animatedImageFrameCount > 1) {
  224 + _animatedCoder = animatedCoder;
  225 + }
213 226 }
214 227 return self;
215 228 }
216 229  
217 230 - (void)encodeWithCoder:(NSCoder *)aCoder {
218 231 [super encodeWithCoder:aCoder];
  232 + [aCoder encodeInteger:self.animatedImageFormat forKey:NSStringFromSelector(@selector(animatedImageFormat))];
219 233 NSData *animatedImageData = self.animatedImageData;
220 234 if (animatedImageData) {
221 235 [aCoder encodeObject:animatedImageData forKey:NSStringFromSelector(@selector(animatedImageData))];
... ... @@ -226,18 +240,18 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
226 240 return YES;
227 241 }
228 242  
229   -#pragma mark - SDAnimatedImage
  243 +#pragma mark - SDAnimatedImageProvider
230 244  
231 245 - (NSData *)animatedImageData {
232   - return [self.coder animatedImageData];
  246 + return [self.animatedCoder animatedImageData];
233 247 }
234 248  
235 249 - (NSUInteger)animatedImageLoopCount {
236   - return [self.coder animatedImageLoopCount];
  250 + return [self.animatedCoder animatedImageLoopCount];
237 251 }
238 252  
239 253 - (NSUInteger)animatedImageFrameCount {
240   - return [self.coder animatedImageFrameCount];
  254 + return [self.animatedCoder animatedImageFrameCount];
241 255 }
242 256  
243 257 - (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index {
... ... @@ -248,7 +262,7 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
248 262 SDImageFrame *frame = [self.loadedAnimatedImageFrames objectAtIndex:index];
249 263 return frame.image;
250 264 }
251   - return [self.coder animatedImageFrameAtIndex:index];
  265 + return [self.animatedCoder animatedImageFrameAtIndex:index];
252 266 }
253 267  
254 268 - (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index {
... ... @@ -259,7 +273,7 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
259 273 SDImageFrame *frame = [self.loadedAnimatedImageFrames objectAtIndex:index];
260 274 return frame.duration;
261 275 }
262   - return [self.coder animatedImageDurationAtIndex:index];
  276 + return [self.animatedCoder animatedImageDurationAtIndex:index];
263 277 }
264 278  
265 279 @end
... ... @@ -287,3 +301,90 @@ static CGFloat SDImageScaleFromPath(NSString *string) {
287 301 }
288 302  
289 303 @end
  304 +
  305 +@implementation SDAnimatedImage (Metadata)
  306 +
  307 +- (BOOL)sd_isAnimated {
  308 + return YES;
  309 +}
  310 +
  311 +- (NSUInteger)sd_imageLoopCount {
  312 + return self.animatedImageLoopCount;
  313 +}
  314 +
  315 +- (void)setSd_imageLoopCount:(NSUInteger)sd_imageLoopCount {
  316 + return;
  317 +}
  318 +
  319 +- (SDImageFormat)sd_imageFormat {
  320 + return self.animatedImageFormat;
  321 +}
  322 +
  323 +- (void)setSd_imageFormat:(SDImageFormat)sd_imageFormat {
  324 + return;
  325 +}
  326 +
  327 +- (BOOL)sd_isVector {
  328 + return NO;
  329 +}
  330 +
  331 +@end
  332 +
  333 +@implementation SDAnimatedImage (MultiFormat)
  334 +
  335 ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data {
  336 + return [self sd_imageWithData:data scale:1];
  337 +}
  338 +
  339 ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data scale:(CGFloat)scale {
  340 + return [self sd_imageWithData:data scale:scale firstFrameOnly:NO];
  341 +}
  342 +
  343 ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data scale:(CGFloat)scale firstFrameOnly:(BOOL)firstFrameOnly {
  344 + if (!data) {
  345 + return nil;
  346 + }
  347 + return [[self alloc] initWithData:data scale:scale options:@{SDImageCoderDecodeFirstFrameOnly : @(firstFrameOnly)}];
  348 +}
  349 +
  350 +- (nullable NSData *)sd_imageData {
  351 + NSData *imageData = self.animatedImageData;
  352 + if (imageData) {
  353 + return imageData;
  354 + } else {
  355 + return [self sd_imageDataAsFormat:self.animatedImageFormat];
  356 + }
  357 +}
  358 +
  359 +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat {
  360 + return [self sd_imageDataAsFormat:imageFormat compressionQuality:1];
  361 +}
  362 +
  363 +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat compressionQuality:(double)compressionQuality {
  364 + return [self sd_imageDataAsFormat:imageFormat compressionQuality:compressionQuality firstFrameOnly:NO];
  365 +}
  366 +
  367 +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat compressionQuality:(double)compressionQuality firstFrameOnly:(BOOL)firstFrameOnly {
  368 + if (firstFrameOnly) {
  369 + // First frame, use super implementation
  370 + return [super sd_imageDataAsFormat:imageFormat compressionQuality:compressionQuality firstFrameOnly:firstFrameOnly];
  371 + }
  372 + NSUInteger frameCount = self.animatedImageFrameCount;
  373 + if (frameCount <= 1) {
  374 + // Static image, use super implementation
  375 + return [super sd_imageDataAsFormat:imageFormat compressionQuality:compressionQuality firstFrameOnly:firstFrameOnly];
  376 + }
  377 + // Keep animated image encoding, loop each frame.
  378 + NSMutableArray<SDImageFrame *> *frames = [NSMutableArray arrayWithCapacity:frameCount];
  379 + for (size_t i = 0; i < frameCount; i++) {
  380 + UIImage *image = [self animatedImageFrameAtIndex:i];
  381 + NSTimeInterval duration = [self animatedImageDurationAtIndex:i];
  382 + SDImageFrame *frame = [SDImageFrame frameWithImage:image duration:duration];
  383 + [frames addObject:frame];
  384 + }
  385 + UIImage *animatedImage = [SDImageCoderHelper animatedImageWithFrames:frames];
  386 + NSData *imageData = [animatedImage sd_imageDataAsFormat:imageFormat compressionQuality:compressionQuality firstFrameOnly:firstFrameOnly];
  387 + return imageData;
  388 +}
  389 +
  390 +@end
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.m
... ... @@ -27,13 +27,13 @@
27 27 }
28 28 }
29 29  
30   -// `NSBitmapImageRep`'s `imageRepWithData:` is not designed initlizer
  30 +// `NSBitmapImageRep`'s `imageRepWithData:` is not designed initializer
31 31 + (instancetype)imageRepWithData:(NSData *)data {
32 32 SDAnimatedImageRep *imageRep = [[SDAnimatedImageRep alloc] initWithData:data];
33 33 return imageRep;
34 34 }
35 35  
36   -// We should override init method for `NSBitmapImageRep` to do initlize about animated image format
  36 +// We should override init method for `NSBitmapImageRep` to do initialize about animated image format
37 37 - (instancetype)initWithData:(NSData *)data {
38 38 self = [super initWithData:data];
39 39 if (self) {
... ... @@ -58,14 +58,14 @@
58 58 [self setProperty:NSImageLoopCount withValue:@(loopCount)];
59 59 } else if (CFStringCompare(type, kUTTypePNG, 0) == kCFCompareEqualTo) {
60 60 // APNG
61   - // Do initilize about frame count, current frame/duration and loop count
  61 + // Do initialize about frame count, current frame/duration and loop count
62 62 [self setProperty:NSImageFrameCount withValue:@(frameCount)];
63 63 [self setProperty:NSImageCurrentFrame withValue:@(0)];
64 64 NSUInteger loopCount = [SDImageAPNGCoder imageLoopCountWithSource:imageSource];
65 65 [self setProperty:NSImageLoopCount withValue:@(loopCount)];
66 66 } else if (CFStringCompare(type, kSDUTTypeHEICS, 0) == kCFCompareEqualTo) {
67 67 // HEIC
68   - // Do initilize about frame count, current frame/duration and loop count
  68 + // Do initialize about frame count, current frame/duration and loop count
69 69 [self setProperty:NSImageFrameCount withValue:@(frameCount)];
70 70 [self setProperty:NSImageCurrentFrame withValue:@(0)];
71 71 NSUInteger loopCount = [SDImageHEICCoder imageLoopCountWithSource:imageSource];
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.h
... ... @@ -21,7 +21,7 @@
21 21 @interface SDAnimatedImageView : UIImageView
22 22  
23 23 /**
24   - Current display frame image.
  24 + Current display frame image. This value is KVO Compliance.
25 25 */
26 26 @property (nonatomic, strong, readonly, nullable) UIImage *currentFrame;
27 27 /**
... ... @@ -44,6 +44,15 @@
44 44 */
45 45 @property (nonatomic, assign) NSInteger animationRepeatCount;
46 46 /**
  47 + The animation playback rate. Default is 1.0.
  48 + `1.0` means the normal speed.
  49 + `0.0` means stopping the animation.
  50 + `0.0-1.0` means the slow speed.
  51 + `> 1.0` means the fast speed.
  52 + `< 0.0` is not supported currently and stop animation. (may support reverse playback in the future)
  53 + */
  54 +@property (nonatomic, assign) double playbackRate;
  55 +/**
47 56 Provide a max buffer size by bytes. This is used to adjust frame buffer count and can be useful when the decoding cost is expensive (such as Animated WebP software decoding). Default is 0.
48 57 `0` means automatically adjust by calculating current memory usage.
49 58 `1` means without any buffer cache, each of frames will be decoded and then be freed after rendering. (Lowest Memory and Highest CPU)
... ... @@ -72,13 +81,19 @@
72 81 */
73 82 @property (nonatomic, assign) BOOL resetFrameIndexWhenStopped;
74 83  
75   -#if SD_UIKIT
  84 +/**
  85 + If the image has more than one frame, set this value to `YES` will automatically
  86 + play/stop the animation when the view become visible/invisible.
  87 + Default is YES.
  88 + */
  89 +@property (nonatomic, assign) BOOL autoPlayAnimatedImage;
  90 +
76 91 /**
77 92 You can specify a runloop mode to let it rendering.
78   - Default is NSRunLoopCommonModes on multi-core iOS device, NSDefaultRunLoopMode on single-core iOS device
  93 + Default is NSRunLoopCommonModes on multi-core device, NSDefaultRunLoopMode on single-core device
  94 + @note This is useful for some cases, for example, always specify NSDefaultRunLoopMode, if you want to pause the animation when user scroll (for Mac user, drag the mouse or touchpad)
79 95 */
80 96 @property (nonatomic, copy, nonnull) NSRunLoopMode runLoopMode;
81   -#endif
82 97 @end
83 98  
84 99 #endif
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.m
... ... @@ -10,61 +10,28 @@
10 10  
11 11 #if SD_UIKIT || SD_MAC
12 12  
  13 +#import "SDAnimatedImagePlayer.h"
13 14 #import "UIImage+Metadata.h"
14 15 #import "NSImage+Compatibility.h"
15   -#import "SDWeakProxy.h"
16 16 #import "SDInternalMacros.h"
17   -#import <mach/mach.h>
18   -#import <objc/runtime.h>
  17 +#import "objc/runtime.h"
19 18  
20   -#if SD_MAC
21   -#import <CoreVideo/CoreVideo.h>
22   -static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext);
23   -#endif
24   -
25   -static NSUInteger SDDeviceTotalMemory() {
26   - return (NSUInteger)[[NSProcessInfo processInfo] physicalMemory];
27   -}
28   -
29   -static NSUInteger SDDeviceFreeMemory() {
30   - mach_port_t host_port = mach_host_self();
31   - mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
32   - vm_size_t page_size;
33   - vm_statistics_data_t vm_stat;
34   - kern_return_t kern;
35   -
36   - kern = host_page_size(host_port, &page_size);
37   - if (kern != KERN_SUCCESS) return 0;
38   - kern = host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
39   - if (kern != KERN_SUCCESS) return 0;
40   - return vm_stat.free_count * page_size;
41   -}
  19 +@interface UIImageView () <CALayerDelegate>
  20 +@end
42 21  
43   -@interface SDAnimatedImageView () <CALayerDelegate> {
44   - NSRunLoopMode _runLoopMode;
  22 +@interface SDAnimatedImageView () {
45 23 BOOL _initFinished; // Extra flag to mark the `commonInit` is called
  24 + NSRunLoopMode _runLoopMode;
  25 + NSUInteger _maxBufferSize;
  26 + double _playbackRate;
46 27 }
47 28  
48 29 @property (nonatomic, strong, readwrite) UIImage *currentFrame;
49 30 @property (nonatomic, assign, readwrite) NSUInteger currentFrameIndex;
50 31 @property (nonatomic, assign, readwrite) NSUInteger currentLoopCount;
51   -@property (nonatomic, assign) NSUInteger totalFrameCount;
52   -@property (nonatomic, assign) NSUInteger totalLoopCount;
53   -@property (nonatomic, strong) UIImage<SDAnimatedImage> *animatedImage;
54   -@property (nonatomic, strong) NSMutableDictionary<NSNumber *, UIImage *> *frameBuffer;
55   -@property (nonatomic, assign) NSTimeInterval currentTime;
56   -@property (nonatomic, assign) BOOL bufferMiss;
57 32 @property (nonatomic, assign) BOOL shouldAnimate;
58 33 @property (nonatomic, assign) BOOL isProgressive;
59   -@property (nonatomic, assign) NSUInteger maxBufferCount;
60   -@property (nonatomic, strong) NSOperationQueue *fetchQueue;
61   -@property (nonatomic, strong) dispatch_semaphore_t lock;
62   -@property (nonatomic, assign) CGFloat animatedImageScale;
63   -#if SD_MAC
64   -@property (nonatomic, assign) CVDisplayLinkRef displayLink;
65   -#else
66   -@property (nonatomic, strong) CADisplayLink *displayLink;
67   -#endif
  34 +@property (nonatomic,strong) SDAnimatedImagePlayer *player; // The animation player.
68 35 @property (nonatomic) CALayer *imageViewLayer; // The actual rendering layer.
69 36  
70 37 @end
... ... @@ -129,63 +96,17 @@ static NSUInteger SDDeviceFreeMemory() {
129 96 {
130 97 // Pay attention that UIKit's `initWithImage:` will trigger a `setImage:` during initialization before this `commonInit`.
131 98 // So the properties which rely on this order, should using lazy-evaluation or do extra check in `setImage:`.
  99 + self.autoPlayAnimatedImage = YES;
132 100 self.shouldCustomLoopCount = NO;
133 101 self.shouldIncrementalLoad = YES;
  102 + self.playbackRate = 1.0;
134 103 #if SD_MAC
135 104 self.wantsLayer = YES;
136 105 #endif
137   -#if SD_UIKIT
138   - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
139   -#endif
140 106 // Mark commonInit finished
141 107 _initFinished = YES;
142 108 }
143 109  
144   -- (void)resetAnimatedImage
145   -{
146   - self.animatedImage = nil;
147   - self.totalFrameCount = 0;
148   - self.totalLoopCount = 0;
149   - // reset current state
150   - [self resetCurrentFrameIndex];
151   - self.shouldAnimate = NO;
152   - self.isProgressive = NO;
153   - self.maxBufferCount = 0;
154   - self.animatedImageScale = 1;
155   - [_fetchQueue cancelAllOperations];
156   - // clear buffer cache
157   - [self clearFrameBuffer];
158   -}
159   -
160   -- (void)resetProgressiveImage
161   -{
162   - self.animatedImage = nil;
163   - self.totalFrameCount = 0;
164   - self.totalLoopCount = 0;
165   - // preserve current state
166   - self.shouldAnimate = NO;
167   - self.isProgressive = YES;
168   - self.maxBufferCount = 0;
169   - self.animatedImageScale = 1;
170   - // preserve buffer cache
171   -}
172   -
173   -- (void)resetCurrentFrameIndex
174   -{
175   - self.currentFrame = nil;
176   - self.currentFrameIndex = 0;
177   - self.currentLoopCount = 0;
178   - self.currentTime = 0;
179   - self.bufferMiss = NO;
180   -}
181   -
182   -- (void)clearFrameBuffer
183   -{
184   - SD_LOCK(self.lock);
185   - [_frameBuffer removeAllObjects];
186   - SD_UNLOCK(self.lock);
187   -}
188   -
189 110 #pragma mark - Accessors
190 111 #pragma mark Public
191 112  
... ... @@ -198,71 +119,87 @@ static NSUInteger SDDeviceFreeMemory() {
198 119 // Check Progressive rendering
199 120 [self updateIsProgressiveWithImage:image];
200 121  
201   - if (self.isProgressive) {
202   - // Reset all value, but keep current state
203   - [self resetProgressiveImage];
204   - } else {
  122 + if (!self.isProgressive) {
205 123 // Stop animating
206   - [self stopAnimating];
207   - // Reset all value
208   - [self resetAnimatedImage];
  124 + self.player = nil;
  125 + self.currentFrame = nil;
  126 + self.currentFrameIndex = 0;
  127 + self.currentLoopCount = 0;
209 128 }
210 129  
211 130 // We need call super method to keep function. This will impliedly call `setNeedsDisplay`. But we have no way to avoid this when using animated image. So we call `setNeedsDisplay` again at the end.
212 131 super.image = image;
213 132 if ([image.class conformsToProtocol:@protocol(SDAnimatedImage)]) {
214   - NSUInteger animatedImageFrameCount = ((UIImage<SDAnimatedImage> *)image).animatedImageFrameCount;
215   - // Check the frame count
216   - if (animatedImageFrameCount <= 1) {
217   - return;
  133 + if (!self.player) {
  134 + id<SDAnimatedImageProvider> provider;
  135 + // Check progressive loading
  136 + if (self.isProgressive) {
  137 + provider = [self progressiveAnimatedCoderForImage:image];
  138 + } else {
  139 + provider = (id<SDAnimatedImage>)image;
  140 + }
  141 + // Create animated player
  142 + self.player = [SDAnimatedImagePlayer playerWithProvider:provider];
  143 + } else {
  144 + // Update Frame Count
  145 + self.player.totalFrameCount = [(id<SDAnimatedImage>)image animatedImageFrameCount];
218 146 }
219   - // If progressive rendering is disabled but animated image is incremental. Only show poster image
220   - if (!self.isProgressive && image.sd_isIncremental) {
  147 +
  148 + if (!self.player) {
  149 + // animated player nil means the image format is not supported, or frame count <= 1
221 150 return;
222 151 }
223   - self.animatedImage = (UIImage<SDAnimatedImage> *)image;
224   - self.totalFrameCount = animatedImageFrameCount;
225   - // Get the current frame and loop count.
226   - self.totalLoopCount = self.animatedImage.animatedImageLoopCount;
227   - // Get the scale
228   - self.animatedImageScale = image.scale;
229   - if (!self.isProgressive) {
230   - self.currentFrame = image;
231   - SD_LOCK(self.lock);
232   - self.frameBuffer[@(self.currentFrameIndex)] = self.currentFrame;
233   - SD_UNLOCK(self.lock);
  152 +
  153 + // Custom Loop Count
  154 + if (self.shouldCustomLoopCount) {
  155 + self.player.totalLoopCount = self.animationRepeatCount;
234 156 }
235 157  
  158 + // RunLoop Mode
  159 + self.player.runLoopMode = self.runLoopMode;
  160 +
  161 + // Max Buffer Size
  162 + self.player.maxBufferSize = self.maxBufferSize;
  163 +
  164 + // Play Rate
  165 + self.player.playbackRate = self.playbackRate;
  166 +
  167 + // Setup handler
  168 + @weakify(self);
  169 + self.player.animationFrameHandler = ^(NSUInteger index, UIImage * frame) {
  170 + @strongify(self);
  171 + self.currentFrameIndex = index;
  172 + self.currentFrame = frame;
  173 + [self.imageViewLayer setNeedsDisplay];
  174 + };
  175 + self.player.animationLoopHandler = ^(NSUInteger loopCount) {
  176 + @strongify(self);
  177 + // Progressive image reach the current last frame index. Keep the state and pause animating. Wait for later restart
  178 + if (self.isProgressive) {
  179 + NSUInteger lastFrameIndex = self.player.totalFrameCount - 1;
  180 + [self.player seekToFrameAtIndex:lastFrameIndex loopCount:0];
  181 + [self.player pausePlaying];
  182 + } else {
  183 + self.currentLoopCount = loopCount;
  184 + }
  185 + };
  186 +
236 187 // Ensure disabled highlighting; it's not supported (see `-setHighlighted:`).
237 188 super.highlighted = NO;
238 189  
239   - // Calculate max buffer size
240   - [self calculateMaxBufferCount];
241   - // Update should animate
242   - [self updateShouldAnimate];
243   - if (self.shouldAnimate) {
244   - [self startAnimating];
245   - }
  190 + [self stopAnimating];
  191 + [self checkPlay];
246 192  
247 193 [self.imageViewLayer setNeedsDisplay];
248 194 }
249 195 }
250 196  
251   -#if SD_UIKIT
  197 +#pragma mark - Configuration
  198 +
252 199 - (void)setRunLoopMode:(NSRunLoopMode)runLoopMode
253 200 {
254   - if ([_runLoopMode isEqual:runLoopMode]) {
255   - return;
256   - }
257   - if (_displayLink) {
258   - if (_runLoopMode) {
259   - [_displayLink removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:_runLoopMode];
260   - }
261   - if (runLoopMode.length > 0) {
262   - [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:runLoopMode];
263   - }
264   - }
265 201 _runLoopMode = [runLoopMode copy];
  202 + self.player.runLoopMode = runLoopMode;
266 203 }
267 204  
268 205 - (NSRunLoopMode)runLoopMode
... ... @@ -272,99 +209,42 @@ static NSUInteger SDDeviceFreeMemory() {
272 209 }
273 210 return _runLoopMode;
274 211 }
275   -#endif
276 212  
277   -- (BOOL)shouldIncrementalLoad {
278   - if (!_initFinished) {
279   - return YES; // Defaults to YES
280   - }
281   - return _initFinished;
282   -}
283   -
284   -#pragma mark - Private
285   -- (NSOperationQueue *)fetchQueue
286   -{
287   - if (!_fetchQueue) {
288   - _fetchQueue = [[NSOperationQueue alloc] init];
289   - _fetchQueue.maxConcurrentOperationCount = 1;
290   - }
291   - return _fetchQueue;
  213 ++ (NSString *)defaultRunLoopMode {
  214 + // Key off `activeProcessorCount` (as opposed to `processorCount`) since the system could shut down cores in certain situations.
  215 + return [NSProcessInfo processInfo].activeProcessorCount > 1 ? NSRunLoopCommonModes : NSDefaultRunLoopMode;
292 216 }
293 217  
294   -- (NSMutableDictionary<NSNumber *,UIImage *> *)frameBuffer
  218 +- (void)setMaxBufferSize:(NSUInteger)maxBufferSize
295 219 {
296   - if (!_frameBuffer) {
297   - _frameBuffer = [NSMutableDictionary dictionary];
298   - }
299   - return _frameBuffer;
  220 + _maxBufferSize = maxBufferSize;
  221 + self.player.maxBufferSize = maxBufferSize;
300 222 }
301 223  
302   -- (dispatch_semaphore_t)lock {
303   - if (!_lock) {
304   - _lock = dispatch_semaphore_create(1);
305   - }
306   - return _lock;
  224 +- (NSUInteger)maxBufferSize {
  225 + return _maxBufferSize; // Defaults to 0
307 226 }
308 227  
309   -#if SD_MAC
310   -- (CVDisplayLinkRef)displayLink
  228 +- (void)setPlaybackRate:(double)playbackRate
311 229 {
312   - if (!_displayLink) {
313   - CVReturn error = CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink);
314   - if (error) {
315   - return NULL;
316   - }
317   - CVDisplayLinkSetOutputCallback(_displayLink, DisplayLinkCallback, (__bridge void *)self);
318   - }
319   - return _displayLink;
  230 + _playbackRate = playbackRate;
  231 + self.player.playbackRate = playbackRate;
320 232 }
321   -#else
322   -- (CADisplayLink *)displayLink
  233 +
  234 +- (double)playbackRate
323 235 {
324   - if (!_displayLink) {
325   - // It is important to note the use of a weak proxy here to avoid a retain cycle. `-displayLinkWithTarget:selector:`
326   - // will retain its target until it is invalidated. We use a weak proxy so that the image view will get deallocated
327   - // independent of the display link's lifetime. Upon image view deallocation, we invalidate the display
328   - // link which will lead to the deallocation of both the display link and the weak proxy.
329   - SDWeakProxy *weakProxy = [SDWeakProxy proxyWithTarget:self];
330   - _displayLink = [CADisplayLink displayLinkWithTarget:weakProxy selector:@selector(displayDidRefresh:)];
331   - [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:self.runLoopMode];
  236 + if (!_initFinished) {
  237 + return 1.0; // Defaults to 1.0
332 238 }
333   - return _displayLink;
  239 + return _playbackRate;
334 240 }
335   -#endif
336   -
337   -#pragma mark - Life Cycle
338 241  
339   -- (void)dealloc
  242 +- (BOOL)shouldIncrementalLoad
340 243 {
341   - // Removes the display link from all run loop modes.
342   -#if SD_MAC
343   - if (_displayLink) {
344   - CVDisplayLinkRelease(_displayLink);
345   - _displayLink = NULL;
  244 + if (!_initFinished) {
  245 + return YES; // Defaults to YES
346 246 }
347   -#else
348   - [_displayLink invalidate];
349   - _displayLink = nil;
350   - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
351   -#endif
352   -}
353   -
354   -- (void)didReceiveMemoryWarning:(NSNotification *)notification {
355   - [_fetchQueue cancelAllOperations];
356   - [_fetchQueue addOperationWithBlock:^{
357   - NSNumber *currentFrameIndex = @(self.currentFrameIndex);
358   - SD_LOCK(self.lock);
359   - NSArray *keys = self.frameBuffer.allKeys;
360   - // only keep the next frame for later rendering
361   - for (NSNumber * key in keys) {
362   - if (![key isEqualToNumber:currentFrameIndex]) {
363   - [self.frameBuffer removeObjectForKey:key];
364   - }
365   - }
366   - SD_UNLOCK(self.lock);
367   - }];
  247 + return _initFinished;
368 248 }
369 249  
370 250 #pragma mark - UIView Method Overrides
... ... @@ -382,12 +262,7 @@ static NSUInteger SDDeviceFreeMemory() {
382 262 [super didMoveToSuperview];
383 263 #endif
384 264  
385   - [self updateShouldAnimate];
386   - if (self.shouldAnimate) {
387   - [self startAnimating];
388   - } else {
389   - [self stopAnimating];
390   - }
  265 + [self checkPlay];
391 266 }
392 267  
393 268 #if SD_MAC
... ... @@ -402,12 +277,7 @@ static NSUInteger SDDeviceFreeMemory() {
402 277 [super didMoveToWindow];
403 278 #endif
404 279  
405   - [self updateShouldAnimate];
406   - if (self.shouldAnimate) {
407   - [self startAnimating];
408   - } else {
409   - [self stopAnimating];
410   - }
  280 + [self checkPlay];
411 281 }
412 282  
413 283 #if SD_MAC
... ... @@ -422,88 +292,91 @@ static NSUInteger SDDeviceFreeMemory() {
422 292 [super setAlpha:alpha];
423 293 #endif
424 294  
425   - [self updateShouldAnimate];
426   - if (self.shouldAnimate) {
427   - [self startAnimating];
428   - } else {
429   - [self stopAnimating];
430   - }
  295 + [self checkPlay];
431 296 }
432 297  
433 298 - (void)setHidden:(BOOL)hidden
434 299 {
435 300 [super setHidden:hidden];
436 301  
437   - [self updateShouldAnimate];
438   - if (self.shouldAnimate) {
439   - [self startAnimating];
440   - } else {
441   - [self stopAnimating];
442   - }
  302 + [self checkPlay];
443 303 }
444 304  
445 305 #pragma mark - UIImageView Method Overrides
446 306 #pragma mark Image Data
447 307  
448   -- (void)startAnimating
  308 +- (void)setAnimationRepeatCount:(NSInteger)animationRepeatCount
449 309 {
450   - if (self.animatedImage) {
451   -#if SD_MAC
452   - CVDisplayLinkStart(self.displayLink);
  310 +#if SD_UIKIT
  311 + [super setAnimationRepeatCount:animationRepeatCount];
453 312 #else
454   - self.displayLink.paused = NO;
  313 + _animationRepeatCount = animationRepeatCount;
455 314 #endif
  315 +
  316 + if (self.shouldCustomLoopCount) {
  317 + self.player.totalLoopCount = animationRepeatCount;
  318 + }
  319 +}
  320 +
  321 +- (void)startAnimating
  322 +{
  323 + if (self.player) {
  324 + [self updateShouldAnimate];
  325 + if (self.shouldAnimate) {
  326 + [self.player startPlaying];
  327 + }
456 328 } else {
457 329 #if SD_UIKIT
458 330 [super startAnimating];
  331 +#else
  332 + [super setAnimates:YES];
459 333 #endif
460 334 }
461 335 }
462 336  
463 337 - (void)stopAnimating
464 338 {
465   - if (self.animatedImage) {
466   - [_fetchQueue cancelAllOperations];
467   - // Using `_displayLink` here because when UIImageView dealloc, it may trigger `[self stopAnimating]`, we already release the display link in SDAnimatedImageView's dealloc method.
468   -#if SD_MAC
469   - CVDisplayLinkStop(_displayLink);
470   -#else
471   - _displayLink.paused = YES;
472   -#endif
  339 + if (self.player) {
473 340 if (self.resetFrameIndexWhenStopped) {
474   - [self resetCurrentFrameIndex];
  341 + [self.player stopPlaying];
  342 + } else {
  343 + [self.player pausePlaying];
475 344 }
476 345 if (self.clearBufferWhenStopped) {
477   - [self clearFrameBuffer];
  346 + [self.player clearFrameBuffer];
478 347 }
479 348 } else {
480 349 #if SD_UIKIT
481 350 [super stopAnimating];
  351 +#else
  352 + [super setAnimates:NO];
482 353 #endif
483 354 }
484 355 }
485 356  
  357 +#if SD_UIKIT
486 358 - (BOOL)isAnimating
487 359 {
488   - BOOL isAnimating = NO;
489   - if (self.animatedImage) {
490   -#if SD_MAC
491   - isAnimating = CVDisplayLinkIsRunning(self.displayLink);
492   -#else
493   - isAnimating = !self.displayLink.isPaused;
494   -#endif
  360 + if (self.player) {
  361 + return self.player.isPlaying;
495 362 } else {
496   -#if SD_UIKIT
497   - isAnimating = [super isAnimating];
498   -#endif
  363 + return [super isAnimating];
499 364 }
500   - return isAnimating;
501 365 }
  366 +#endif
502 367  
503 368 #if SD_MAC
  369 +- (BOOL)animates
  370 +{
  371 + if (self.player) {
  372 + return self.player.isPlaying;
  373 + } else {
  374 + return [super animates];
  375 + }
  376 +}
  377 +
504 378 - (void)setAnimates:(BOOL)animates
505 379 {
506   - [super setAnimates:animates];
507 380 if (animates) {
508 381 [self startAnimating];
509 382 } else {
... ... @@ -517,7 +390,7 @@ static NSUInteger SDDeviceFreeMemory() {
517 390 - (void)setHighlighted:(BOOL)highlighted
518 391 {
519 392 // Highlighted image is unsupported for animated images, but implementing it breaks the image view when embedded in a UICollectionViewCell.
520   - if (!self.animatedImage) {
  393 + if (!self.player) {
521 394 [super setHighlighted:highlighted];
522 395 }
523 396 }
... ... @@ -526,6 +399,19 @@ static NSUInteger SDDeviceFreeMemory() {
526 399 #pragma mark - Private Methods
527 400 #pragma mark Animation
528 401  
  402 +/// Check if it should be played
  403 +- (void)checkPlay
  404 +{
  405 + if (self.autoPlayAnimatedImage) {
  406 + [self updateShouldAnimate];
  407 + if (self.shouldAnimate) {
  408 + [self startAnimating];
  409 + } else {
  410 + [self stopAnimating];
  411 + }
  412 + }
  413 +}
  414 +
529 415 // Don't repeatedly check our window & superview in `-displayDidRefresh:` for performance reasons.
530 416 // Just update our cached value whenever the animated image or visibility (window, superview, hidden, alpha) is changed.
531 417 - (void)updateShouldAnimate
... ... @@ -535,7 +421,7 @@ static NSUInteger SDDeviceFreeMemory() {
535 421 #else
536 422 BOOL isVisible = self.window && self.superview && ![self isHidden] && self.alpha > 0.0;
537 423 #endif
538   - self.shouldAnimate = self.animatedImage && self.totalFrameCount > 1 && isVisible;
  424 + self.shouldAnimate = self.player && isVisible;
539 425 }
540 426  
541 427 // Update progressive status only after `setImage:` call.
... ... @@ -548,170 +434,32 @@ static NSUInteger SDDeviceFreeMemory() {
548 434 }
549 435 // We must use `image.class conformsToProtocol:` instead of `image conformsToProtocol:` here
550 436 // Because UIKit on macOS, using internal hard-coded override method, which returns NO
551   - if ([image.class conformsToProtocol:@protocol(SDAnimatedImage)] && image.sd_isIncremental) {
  437 + id<SDAnimatedImageCoder> currentAnimatedCoder = [self progressiveAnimatedCoderForImage:image];
  438 + if (currentAnimatedCoder) {
552 439 UIImage *previousImage = self.image;
553   - if ([previousImage.class conformsToProtocol:@protocol(SDAnimatedImage)] && previousImage.sd_isIncremental) {
554   - NSData *previousData = [((UIImage<SDAnimatedImage> *)previousImage) animatedImageData];
555   - NSData *currentData = [((UIImage<SDAnimatedImage> *)image) animatedImageData];
556   - // Check whether to use progressive rendering or not
557   - if (!previousData || !currentData) {
558   - // Early return
559   - return;
560   - }
561   -
562   - // Warning: normally the `previousData` is same instance as `currentData` because our `SDAnimatedImage` class share the same `coder` instance internally. But there may be a race condition, that later retrived `currentData` is already been updated and it's not the same instance as `previousData`.
563   - // And for protocol extensible design, we should not assume `SDAnimatedImage` protocol implementations always share same instance. So both of two reasons, we need that `rangeOfData` check.
564   - if ([currentData isEqualToData:previousData]) {
565   - // If current data is the same data (or instance) as previous data
  440 + if (!previousImage) {
  441 + // If current animated coder supports progressive, and no previous image to check, start progressive loading
  442 + self.isProgressive = YES;
  443 + } else {
  444 + id<SDAnimatedImageCoder> previousAnimatedCoder = [self progressiveAnimatedCoderForImage:previousImage];
  445 + if (previousAnimatedCoder == currentAnimatedCoder) {
  446 + // If current animated coder is the same as previous, start progressive loading
566 447 self.isProgressive = YES;
567   - } else if (currentData.length > previousData.length) {
568   - // If current data is appended by previous data, use `NSDataSearchAnchored`, search is limited to start of currentData
569   - NSRange range = [currentData rangeOfData:previousData options:NSDataSearchAnchored range:NSMakeRange(0, previousData.length)];
570   - if (range.location != NSNotFound) {
571   - // Contains hole previous data and they start with the same beginning
572   - self.isProgressive = YES;
573   - }
574 448 }
575   - } else {
576   - // Previous image is not progressive, so start progressive rendering
577   - self.isProgressive = YES;
578 449 }
579 450 }
580 451 }
581 452  
582   -#if SD_MAC
583   -- (void)displayDidRefresh:(CVDisplayLinkRef)displayLink duration:(NSTimeInterval)duration
584   -#else
585   -- (void)displayDidRefresh:(CADisplayLink *)displayLink
586   -#endif
  453 +// Check if image can represent a `Progressive Animated Image` during loading
  454 +- (id<SDAnimatedImageCoder, SDProgressiveImageCoder>)progressiveAnimatedCoderForImage:(UIImage *)image
587 455 {
588   - // If for some reason a wild call makes it through when we shouldn't be animating, bail.
589   - // Early return!
590   - if (!self.shouldAnimate) {
591   - return;
592   - }
593   - // Calculate refresh duration
594   -#if SD_UIKIT
595   -#pragma clang diagnostic push
596   -#pragma clang diagnostic ignored "-Wdeprecated-declarations"
597   - NSTimeInterval duration = displayLink.duration * displayLink.frameInterval;
598   -#pragma clang diagnostic pop
599   -#endif
600   - NSUInteger totalFrameCount = self.totalFrameCount;
601   - NSUInteger currentFrameIndex = self.currentFrameIndex;
602   - NSUInteger nextFrameIndex = (currentFrameIndex + 1) % totalFrameCount;
603   -
604   - // Check if we have the frame buffer firstly to improve performance
605   - if (!self.bufferMiss) {
606   - // Then check if timestamp is reached
607   - self.currentTime += duration;
608   - NSTimeInterval currentDuration = [self.animatedImage animatedImageDurationAtIndex:currentFrameIndex];
609   - if (self.currentTime < currentDuration) {
610   - // Current frame timestamp not reached, return
611   - return;
612   - }
613   - self.currentTime -= currentDuration;
614   - NSTimeInterval nextDuration = [self.animatedImage animatedImageDurationAtIndex:nextFrameIndex];
615   - if (self.currentTime > nextDuration) {
616   - // Do not skip frame
617   - self.currentTime = nextDuration;
618   - }
619   - }
620   -
621   - // Update the current frame
622   - UIImage *currentFrame;
623   - UIImage *fetchFrame;
624   - SD_LOCK(self.lock);
625   - currentFrame = self.frameBuffer[@(currentFrameIndex)];
626   - fetchFrame = currentFrame ? self.frameBuffer[@(nextFrameIndex)] : nil;
627   - SD_UNLOCK(self.lock);
628   - BOOL bufferFull = NO;
629   - if (currentFrame) {
630   - SD_LOCK(self.lock);
631   - // Remove the frame buffer if need
632   - if (self.frameBuffer.count > self.maxBufferCount) {
633   - self.frameBuffer[@(currentFrameIndex)] = nil;
634   - }
635   - // Check whether we can stop fetch
636   - if (self.frameBuffer.count == totalFrameCount) {
637   - bufferFull = YES;
638   - }
639   - SD_UNLOCK(self.lock);
640   - self.currentFrame = currentFrame;
641   - self.currentFrameIndex = nextFrameIndex;
642   - self.bufferMiss = NO;
643   - [self.imageViewLayer setNeedsDisplay];
644   - } else {
645   - self.bufferMiss = YES;
646   - }
647   -
648   - // Update the loop count when last frame rendered
649   - if (nextFrameIndex == 0 && !self.bufferMiss) {
650   - // Progressive image reach the current last frame index. Keep the state and stop animating. Wait for later restart
651   - if (self.isProgressive) {
652   - // Recovery the current frame index and removed frame buffer (See above)
653   - self.currentFrameIndex = currentFrameIndex;
654   - SD_LOCK(self.lock);
655   - self.frameBuffer[@(currentFrameIndex)] = self.currentFrame;
656   - SD_UNLOCK(self.lock);
657   - [self stopAnimating];
658   - return;
659   - }
660   - // Update the loop count
661   - self.currentLoopCount++;
662   - // if reached the max loop count, stop animating, 0 means loop indefinitely
663   - NSUInteger maxLoopCount = self.shouldCustomLoopCount ? self.animationRepeatCount : self.totalLoopCount;
664   - if (maxLoopCount != 0 && (self.currentLoopCount >= maxLoopCount)) {
665   - [self stopAnimating];
666   - return;
  456 + if ([image.class conformsToProtocol:@protocol(SDAnimatedImage)] && image.sd_isIncremental && [image respondsToSelector:@selector(animatedCoder)]) {
  457 + id<SDAnimatedImageCoder> animatedCoder = [(id<SDAnimatedImage>)image animatedCoder];
  458 + if ([animatedCoder conformsToProtocol:@protocol(SDProgressiveImageCoder)]) {
  459 + return (id<SDAnimatedImageCoder, SDProgressiveImageCoder>)animatedCoder;
667 460 }
668 461 }
669   -
670   - // Check if we should prefetch next frame or current frame
671   - NSUInteger fetchFrameIndex;
672   - if (self.bufferMiss) {
673   - // When buffer miss, means the decode speed is slower than render speed, we fetch current miss frame
674   - fetchFrameIndex = currentFrameIndex;
675   - } else {
676   - // Or, most cases, the decode speed is faster than render speed, we fetch next frame
677   - fetchFrameIndex = nextFrameIndex;
678   - }
679   -
680   - if (!fetchFrame && !bufferFull && self.fetchQueue.operationCount == 0) {
681   - // Prefetch next frame in background queue
682   - UIImage<SDAnimatedImage> *animatedImage = self.animatedImage;
683   - @weakify(self);
684   - NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
685   - @strongify(self);
686   - if (!self) {
687   - return;
688   - }
689   - UIImage *frame = [animatedImage animatedImageFrameAtIndex:fetchFrameIndex];
690   -
691   - BOOL isAnimating = NO;
692   -#if SD_MAC
693   - isAnimating = CVDisplayLinkIsRunning(self.displayLink);
694   -#else
695   - isAnimating = !self.displayLink.isPaused;
696   -#endif
697   - if (isAnimating) {
698   - SD_LOCK(self.lock);
699   - self.frameBuffer[@(fetchFrameIndex)] = frame;
700   - SD_UNLOCK(self.lock);
701   - }
702   - // Ensure when self dealloc, it dealloced on the main queue (UIKit/AppKit rule)
703   - dispatch_async(dispatch_get_main_queue(), ^{
704   - [self class];
705   - });
706   - }];
707   - [self.fetchQueue addOperation:operation];
708   - }
709   -}
710   -
711   -+ (NSString *)defaultRunLoopMode
712   -{
713   - // Key off `activeProcessorCount` (as opposed to `processorCount`) since the system could shut down cores in certain situations.
714   - return [NSProcessInfo processInfo].activeProcessorCount > 1 ? NSRunLoopCommonModes : NSDefaultRunLoopMode;
  462 + return nil;
715 463 }
716 464  
717 465  
... ... @@ -720,9 +468,15 @@ static NSUInteger SDDeviceFreeMemory() {
720 468  
721 469 - (void)displayLayer:(CALayer *)layer
722 470 {
723   - if (self.currentFrame) {
724   - layer.contentsScale = self.animatedImageScale;
725   - layer.contents = (__bridge id)self.currentFrame.CGImage;
  471 + UIImage *currentFrame = self.currentFrame;
  472 + if (currentFrame) {
  473 + layer.contentsScale = currentFrame.scale;
  474 + layer.contents = (__bridge id)currentFrame.CGImage;
  475 + } else {
  476 + // If we have no animation frames, call super implementation. iOS 14+ UIImageView use this delegate method for rendering.
  477 + if ([UIImageView instancesRespondToSelector:@selector(displayLayer:)]) {
  478 + [super displayLayer:layer];
  479 + }
726 480 }
727 481 }
728 482  
... ... @@ -730,10 +484,10 @@ static NSUInteger SDDeviceFreeMemory() {
730 484 // NSImageView use a subview. We need this subview's layer for actual rendering.
731 485 // Why using this design may because of properties like `imageAlignment` and `imageScaling`, which it's not available for UIImageView.contentMode (it's impossible to align left and keep aspect ratio at the same time)
732 486 - (NSView *)imageView {
733   - NSImageView *imageView = imageView = objc_getAssociatedObject(self, NSSelectorFromString(@"_imageView"));
  487 + NSImageView *imageView = objc_getAssociatedObject(self, SD_SEL_SPI(imageView));
734 488 if (!imageView) {
735 489 // macOS 10.14
736   - imageView = objc_getAssociatedObject(self, NSSelectorFromString(@"_imageSubview"));
  490 + imageView = objc_getAssociatedObject(self, SD_SEL_SPI(imageSubview));
737 491 }
738 492 return imageView;
739 493 }
... ... @@ -760,45 +514,6 @@ static NSUInteger SDDeviceFreeMemory() {
760 514  
761 515 #endif
762 516  
763   -
764   -#pragma mark - Util
765   -- (void)calculateMaxBufferCount {
766   - NSUInteger bytes = CGImageGetBytesPerRow(self.currentFrame.CGImage) * CGImageGetHeight(self.currentFrame.CGImage);
767   - if (bytes == 0) bytes = 1024;
768   -
769   - NSUInteger max = 0;
770   - if (self.maxBufferSize > 0) {
771   - max = self.maxBufferSize;
772   - } else {
773   - // Calculate based on current memory, these factors are by experience
774   - NSUInteger total = SDDeviceTotalMemory();
775   - NSUInteger free = SDDeviceFreeMemory();
776   - max = MIN(total * 0.2, free * 0.6);
777   - }
778   -
779   - NSUInteger maxBufferCount = (double)max / (double)bytes;
780   - if (!maxBufferCount) {
781   - // At least 1 frame
782   - maxBufferCount = 1;
783   - }
784   -
785   - self.maxBufferCount = maxBufferCount;
786   -}
787   -
788 517 @end
789 518  
790   -#if SD_MAC
791   -static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) {
792   - // Calculate refresh duration
793   - NSTimeInterval duration = (double)inOutputTime->videoRefreshPeriod / ((double)inOutputTime->videoTimeScale * inOutputTime->rateScalar);
794   - // CVDisplayLink callback is not on main queue
795   - SDAnimatedImageView *imageView = (__bridge SDAnimatedImageView *)displayLinkContext;
796   - __weak SDAnimatedImageView *weakImageView = imageView;
797   - dispatch_async(dispatch_get_main_queue(), ^{
798   - [weakImageView displayDidRefresh:displayLink duration:duration];
799   - });
800   - return kCVReturnSuccess;
801   -}
802   -#endif
803   -
804 519 #endif
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.h
... ... @@ -55,6 +55,26 @@
55 55 - (void)setData:(nullable NSData *)data forKey:(nonnull NSString *)key;
56 56  
57 57 /**
  58 + Returns the extended data associated with a given key.
  59 + This method may blocks the calling thread until file read finished.
  60 +
  61 + @param key A string identifying the data. If nil, just return nil.
  62 + @return The value associated with key, or nil if no value is associated with key.
  63 + */
  64 +- (nullable NSData *)extendedDataForKey:(nonnull NSString *)key;
  65 +
  66 +/**
  67 + Set extended data with a given key.
  68 +
  69 + @discussion You can set any extended data to exist cache key. Without override the exist disk file data.
  70 + on UNIX, the common way for this is to use the Extended file attributes (xattr)
  71 +
  72 + @param extendedData The extended data (pass nil to remove).
  73 + @param key The key with which to associate the value. If nil, this method has no effect.
  74 +*/
  75 +- (void)setExtendedData:(nullable NSData *)extendedData forKey:(nonnull NSString *)key;
  76 +
  77 +/**
58 78 Removes the value of the specified key in the cache.
59 79 This method may blocks the calling thread until file delete finished.
60 80  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m
... ... @@ -8,8 +8,11 @@
8 8  
9 9 #import "SDDiskCache.h"
10 10 #import "SDImageCacheConfig.h"
  11 +#import "SDFileAttributeHelper.h"
11 12 #import <CommonCrypto/CommonDigest.h>
12 13  
  14 +static NSString * const SDDiskCacheExtendedAttributeName = @"com.hackemist.SDDiskCache";
  15 +
13 16 @interface SDDiskCache ()
14 17  
15 18 @property (nonatomic, copy) NSString *diskCachePath;
... ... @@ -83,7 +86,7 @@
83 86  
84 87 // get cache Path for image key
85 88 NSString *cachePathForKey = [self cachePathForKey:key];
86   - // transform to NSUrl
  89 + // transform to NSURL
87 90 NSURL *fileURL = [NSURL fileURLWithPath:cachePathForKey];
88 91  
89 92 [data writeToURL:fileURL options:self.config.diskCacheWritingOptions error:nil];
... ... @@ -95,6 +98,31 @@
95 98 }
96 99 }
97 100  
  101 +- (NSData *)extendedDataForKey:(NSString *)key {
  102 + NSParameterAssert(key);
  103 +
  104 + // get cache Path for image key
  105 + NSString *cachePathForKey = [self cachePathForKey:key];
  106 +
  107 + NSData *extendedData = [SDFileAttributeHelper extendedAttribute:SDDiskCacheExtendedAttributeName atPath:cachePathForKey traverseLink:NO error:nil];
  108 +
  109 + return extendedData;
  110 +}
  111 +
  112 +- (void)setExtendedData:(NSData *)extendedData forKey:(NSString *)key {
  113 + NSParameterAssert(key);
  114 + // get cache Path for image key
  115 + NSString *cachePathForKey = [self cachePathForKey:key];
  116 +
  117 + if (!extendedData) {
  118 + // Remove
  119 + [SDFileAttributeHelper removeExtendedAttribute:SDDiskCacheExtendedAttributeName atPath:cachePathForKey traverseLink:NO error:nil];
  120 + } else {
  121 + // Override
  122 + [SDFileAttributeHelper setExtendedAttribute:SDDiskCacheExtendedAttributeName value:extendedData atPath:cachePathForKey traverseLink:NO overwrite:YES error:nil];
  123 + }
  124 +}
  125 +
98 126 - (void)removeDataForKey:(NSString *)key {
99 127 NSParameterAssert(key);
100 128 NSString *filePath = [self cachePathForKey:key];
... ... @@ -118,11 +146,15 @@
118 146 case SDImageCacheConfigExpireTypeAccessDate:
119 147 cacheContentDateKey = NSURLContentAccessDateKey;
120 148 break;
121   -
122 149 case SDImageCacheConfigExpireTypeModificationDate:
123 150 cacheContentDateKey = NSURLContentModificationDateKey;
124 151 break;
125   -
  152 + case SDImageCacheConfigExpireTypeCreationDate:
  153 + cacheContentDateKey = NSURLCreationDateKey;
  154 + break;
  155 + case SDImageCacheConfigExpireTypeChangeDate:
  156 + cacheContentDateKey = NSURLAttributeModificationDateKey;
  157 + break;
126 158 default:
127 159 break;
128 160 }
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.m
... ... @@ -13,7 +13,7 @@
13 13 #import <MobileCoreServices/MobileCoreServices.h>
14 14 #endif
15 15  
16   -// iOS 8 Image/IO framework binary does not contains these APNG contants, so we define them. Thanks Apple :)
  16 +// iOS 8 Image/IO framework binary does not contains these APNG constants, so we define them. Thanks Apple :)
17 17 // We can not use runtime @available check for this issue, because it's a global symbol and should be loaded during launch time by dyld. So hack if the min deployment target version < iOS 9.0, whatever it running on iOS 9+ or not.
18 18 #if (__IPHONE_OS_VERSION_MIN_REQUIRED && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0)
19 19 const CFStringRef kCGImagePropertyAPNGLoopCount = (__bridge CFStringRef)@"LoopCount";
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h
... ... @@ -40,7 +40,7 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
40 40 */
41 41 SDImageCacheAvoidDecodeImage = 1 << 4,
42 42 /**
43   - * By default, we decode the animated image. This flag can force decode the first frame only and produece the static image.
  43 + * By default, we decode the animated image. This flag can force decode the first frame only and produce the static image.
44 44 */
45 45 SDImageCacheDecodeFirstFrameOnly = 1 << 5,
46 46 /**
... ... @@ -49,7 +49,7 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
49 49 SDImageCachePreloadAllFrames = 1 << 6,
50 50 /**
51 51 * By default, when you use `SDWebImageContextAnimatedImageClass` context option (like using `SDAnimatedImageView` which designed to use `SDAnimatedImage`), we may still use `UIImage` when the memory cache hit, or image decoder is not available, to behave as a fallback solution.
52   - * Using this option, can ensure we always produce image with your provided class. If failed, a error with code `SDWebImageErrorBadImageData` will been used.
  52 + * Using this option, can ensure we always produce image with your provided class. If failed, an error with code `SDWebImageErrorBadImageData` will be used.
53 53 * Note this options is not compatible with `SDImageCacheDecodeFirstFrameOnly`, which always produce a UIImage/NSImage.
54 54 */
55 55 SDImageCacheMatchAnimatedImageClass = 1 << 7,
... ... @@ -65,7 +65,7 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
65 65  
66 66 /**
67 67 * Cache Config object - storing all kind of settings.
68   - * The property is copy so change of currrent config will not accidentally affect other cache's config.
  68 + * The property is copy so change of current config will not accidentally affect other cache's config.
69 69 */
70 70 @property (nonatomic, copy, nonnull, readonly) SDImageCacheConfig *config;
71 71  
... ... @@ -162,6 +162,7 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
162 162 * @param key The unique image cache key, usually it's image absolute URL
163 163 * @param toDisk Store the image to disk cache if YES. If NO, the completion block is called synchronously
164 164 * @param completionBlock A block executed after the operation is finished
  165 + * @note If no image data is provided and encode to disk, we will try to detect the image format (using either `sd_imageFormat` or `SDAnimatedImage` protocol method) and animation status, to choose the best matched format, including GIF, JPEG or PNG.
165 166 */
166 167 - (void)storeImage:(nullable UIImage *)image
167 168 forKey:(nullable NSString *)key
... ... @@ -178,6 +179,7 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
178 179 * @param key The unique image cache key, usually it's image absolute URL
179 180 * @param toDisk Store the image to disk cache if YES. If NO, the completion block is called synchronously
180 181 * @param completionBlock A block executed after the operation is finished
  182 + * @note If no image data is provided and encode to disk, we will try to detect the image format (using either `sd_imageFormat` or `SDAnimatedImage` protocol method) and animation status, to choose the best matched format, including GIF, JPEG or PNG.
181 183 */
182 184 - (void)storeImage:(nullable UIImage *)image
183 185 imageData:(nullable NSData *)imageData
... ... @@ -225,8 +227,7 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
225 227 #pragma mark - Query and Retrieve Ops
226 228  
227 229 /**
228   - * Asynchronously queries the cache with operation and call the completion when done.
229   - * Query the image data for the given key synchronously.
  230 + * Synchronously query the image data for the given key in disk cache. You can decode the image data to image after loaded.
230 231 *
231 232 * @param key The unique key used to store the wanted image
232 233 * @return The image data for the given key, or nil if not found.
... ... @@ -234,9 +235,18 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
234 235 - (nullable NSData *)diskImageDataForKey:(nullable NSString *)key;
235 236  
236 237 /**
237   - * Operation that queries the cache asynchronously and call the completion when done.
  238 + * Asynchronously query the image data for the given key in disk cache. You can decode the image data to image after loaded.
238 239 *
239   - * @param key The unique key used to store the wanted image
  240 + * @param key The unique key used to store the wanted image
  241 + * @param completionBlock the block to be executed when the query is done.
  242 + * @note the completion block will be always executed on the main queue
  243 + */
  244 +- (void)diskImageDataQueryForKey:(nullable NSString *)key completion:(nullable SDImageCacheQueryDataCompletionBlock)completionBlock;
  245 +
  246 +/**
  247 + * Asynchronously queries the cache with operation and call the completion when done.
  248 + *
  249 + * @param key The unique key used to store the wanted image. If you want transformed or thumbnail image, calculate the key with `SDTransformedKeyForKey`, `SDThumbnailedKeyForKey`, or generate the cache key from url with `cacheKeyForURL:context:`.
240 250 * @param doneBlock The completion block. Will not get called if the operation is cancelled
241 251 *
242 252 * @return a NSOperation instance containing the cache op
... ... @@ -246,7 +256,7 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
246 256 /**
247 257 * Asynchronously queries the cache with operation and call the completion when done.
248 258 *
249   - * @param key The unique key used to store the wanted image
  259 + * @param key The unique key used to store the wanted image. If you want transformed or thumbnail image, calculate the key with `SDTransformedKeyForKey`, `SDThumbnailedKeyForKey`, or generate the cache key from url with `cacheKeyForURL:context:`.
250 260 * @param options A mask to specify options to use for this cache query
251 261 * @param doneBlock The completion block. Will not get called if the operation is cancelled
252 262 *
... ... @@ -257,7 +267,7 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
257 267 /**
258 268 * Asynchronously queries the cache with operation and call the completion when done.
259 269 *
260   - * @param key The unique key used to store the wanted image
  270 + * @param key The unique key used to store the wanted image. If you want transformed or thumbnail image, calculate the key with `SDTransformedKeyForKey`, `SDThumbnailedKeyForKey`, or generate the cache key from url with `cacheKeyForURL:context:`.
261 271 * @param options A mask to specify options to use for this cache query
262 272 * @param context A context contains different options to perform specify changes or processes, see `SDWebImageContextOption`. This hold the extra objects which `options` enum can not hold.
263 273 * @param doneBlock The completion block. Will not get called if the operation is cancelled
... ... @@ -267,6 +277,19 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
267 277 - (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context done:(nullable SDImageCacheQueryCompletionBlock)doneBlock;
268 278  
269 279 /**
  280 + * Asynchronously queries the cache with operation and call the completion when done.
  281 + *
  282 + * @param key The unique key used to store the wanted image. If you want transformed or thumbnail image, calculate the key with `SDTransformedKeyForKey`, `SDThumbnailedKeyForKey`, or generate the cache key from url with `cacheKeyForURL:context:`.
  283 + * @param options A mask to specify options to use for this cache query
  284 + * @param context A context contains different options to perform specify changes or processes, see `SDWebImageContextOption`. This hold the extra objects which `options` enum can not hold.
  285 + * @param queryCacheType Specify where to query the cache from. By default we use `.all`, which means both memory cache and disk cache. You can choose to query memory only or disk only as well. Pass `.none` is invalid and callback with nil immediately.
  286 + * @param doneBlock The completion block. Will not get called if the operation is cancelled
  287 + *
  288 + * @return a NSOperation instance containing the cache op
  289 + */
  290 +- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context cacheType:(SDImageCacheType)queryCacheType done:(nullable SDImageCacheQueryCompletionBlock)doneBlock;
  291 +
  292 +/**
270 293 * Synchronously query the memory cache.
271 294 *
272 295 * @param key The unique key used to store the image
... ... @@ -283,6 +306,16 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
283 306 - (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key;
284 307  
285 308 /**
  309 + * Synchronously query the disk cache. With the options and context which may effect the image generation. (Such as transformer, animated image, thumbnail, etc)
  310 + *
  311 + * @param key The unique key used to store the image
  312 + * @param options A mask to specify options to use for this cache query
  313 + * @param context A context contains different options to perform specify changes or processes, see `SDWebImageContextOption`. This hold the extra objects which `options` enum can not hold.
  314 + * @return The image for the given key, or nil if not found.
  315 + */
  316 +- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context;
  317 +
  318 +/**
286 319 * Synchronously query the cache (memory and or disk) after checking the memory cache.
287 320 *
288 321 * @param key The unique key used to store the image
... ... @@ -290,6 +323,16 @@ typedef NS_OPTIONS(NSUInteger, SDImageCacheOptions) {
290 323 */
291 324 - (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key;
292 325  
  326 +/**
  327 + * Synchronously query the cache (memory and or disk) after checking the memory cache. With the options and context which may effect the image generation. (Such as transformer, animated image, thumbnail, etc)
  328 + *
  329 + * @param key The unique key used to store the image
  330 + * @param options A mask to specify options to use for this cache query
  331 + * @param context A context contains different options to perform specify changes or processes, see `SDWebImageContextOption`. This hold the extra objects which `options` enum can not hold.
  332 + * @return The image for the given key, or nil if not found.
  333 + */
  334 +- (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context;;
  335 +
293 336 #pragma mark - Remove Ops
294 337  
295 338 /**
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m
... ... @@ -9,11 +9,11 @@
9 9 #import "SDImageCache.h"
10 10 #import "NSImage+Compatibility.h"
11 11 #import "SDImageCodersManager.h"
12   -#import "SDImageTransformer.h"
13 12 #import "SDImageCoderHelper.h"
14 13 #import "SDAnimatedImage.h"
15 14 #import "UIImage+MemoryCacheCost.h"
16 15 #import "UIImage+Metadata.h"
  16 +#import "UIImage+ExtendedCacheData.h"
17 17  
18 18 @interface SDImageCache ()
19 19  
... ... @@ -186,17 +186,55 @@
186 186 dispatch_async(self.ioQueue, ^{
187 187 @autoreleasepool {
188 188 NSData *data = imageData;
  189 + if (!data && [image conformsToProtocol:@protocol(SDAnimatedImage)]) {
  190 + // If image is custom animated image class, prefer its original animated data
  191 + data = [((id<SDAnimatedImage>)image) animatedImageData];
  192 + }
189 193 if (!data && image) {
190   - // If we do not have any data to detect image format, check whether it contains alpha channel to use PNG or JPEG format
191   - SDImageFormat format;
192   - if ([SDImageCoderHelper CGImageContainsAlpha:image.CGImage]) {
193   - format = SDImageFormatPNG;
194   - } else {
195   - format = SDImageFormatJPEG;
  194 + // Check image's associated image format, may return .undefined
  195 + SDImageFormat format = image.sd_imageFormat;
  196 + if (format == SDImageFormatUndefined) {
  197 + // If image is animated, use GIF (APNG may be better, but has bugs before macOS 10.14)
  198 + if (image.sd_isAnimated) {
  199 + format = SDImageFormatGIF;
  200 + } else {
  201 + // If we do not have any data to detect image format, check whether it contains alpha channel to use PNG or JPEG format
  202 + if ([SDImageCoderHelper CGImageContainsAlpha:image.CGImage]) {
  203 + format = SDImageFormatPNG;
  204 + } else {
  205 + format = SDImageFormatJPEG;
  206 + }
  207 + }
196 208 }
197 209 data = [[SDImageCodersManager sharedManager] encodedDataWithImage:image format:format options:nil];
198 210 }
199 211 [self _storeImageDataToDisk:data forKey:key];
  212 + if (image) {
  213 + // Check extended data
  214 + id extendedObject = image.sd_extendedObject;
  215 + if ([extendedObject conformsToProtocol:@protocol(NSCoding)]) {
  216 + NSData *extendedData;
  217 + if (@available(iOS 11, tvOS 11, macOS 10.13, watchOS 4, *)) {
  218 + NSError *error;
  219 + extendedData = [NSKeyedArchiver archivedDataWithRootObject:extendedObject requiringSecureCoding:NO error:&error];
  220 + if (error) {
  221 + NSLog(@"NSKeyedArchiver archive failed with error: %@", error);
  222 + }
  223 + } else {
  224 + @try {
  225 +#pragma clang diagnostic push
  226 +#pragma clang diagnostic ignored "-Wdeprecated-declarations"
  227 + extendedData = [NSKeyedArchiver archivedDataWithRootObject:extendedObject];
  228 +#pragma clang diagnostic pop
  229 + } @catch (NSException *exception) {
  230 + NSLog(@"NSKeyedArchiver archive failed with exception: %@", exception);
  231 + }
  232 + }
  233 + if (extendedData) {
  234 + [self.diskCache setExtendedData:extendedData forKey:key];
  235 + }
  236 + }
  237 + }
200 238 }
201 239  
202 240 if (completionBlock) {
... ... @@ -275,6 +313,17 @@
275 313 return [self.diskCache containsDataForKey:key];
276 314 }
277 315  
  316 +- (void)diskImageDataQueryForKey:(NSString *)key completion:(SDImageCacheQueryDataCompletionBlock)completionBlock {
  317 + dispatch_async(self.ioQueue, ^{
  318 + NSData *imageData = [self diskImageDataBySearchingAllPathsForKey:key];
  319 + if (completionBlock) {
  320 + dispatch_async(dispatch_get_main_queue(), ^{
  321 + completionBlock(imageData);
  322 + });
  323 + }
  324 + });
  325 +}
  326 +
278 327 - (nullable NSData *)diskImageDataForKey:(nullable NSString *)key {
279 328 if (!key) {
280 329 return nil;
... ... @@ -292,7 +341,12 @@
292 341 }
293 342  
294 343 - (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key {
295   - UIImage *diskImage = [self diskImageForKey:key];
  344 + return [self imageFromDiskCacheForKey:key options:0 context:nil];
  345 +}
  346 +
  347 +- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context {
  348 + NSData *data = [self diskImageDataForKey:key];
  349 + UIImage *diskImage = [self diskImageForKey:key data:data options:options context:context];
296 350 if (diskImage && self.config.shouldCacheImagesInMemory) {
297 351 NSUInteger cost = diskImage.sd_memoryCost;
298 352 [self.memoryCache setObject:diskImage forKey:key cost:cost];
... ... @@ -302,6 +356,10 @@
302 356 }
303 357  
304 358 - (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key {
  359 + return [self imageFromCacheForKey:key options:0 context:nil];
  360 +}
  361 +
  362 +- (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context {
305 363 // First check the in-memory cache...
306 364 UIImage *image = [self imageFromMemoryCacheForKey:key];
307 365 if (image) {
... ... @@ -309,7 +367,7 @@
309 367 }
310 368  
311 369 // Second check the disk cache...
312   - image = [self imageFromDiskCacheForKey:key];
  370 + image = [self imageFromDiskCacheForKey:key options:options context:context];
313 371 return image;
314 372 }
315 373  
... ... @@ -346,6 +404,32 @@
346 404 - (nullable UIImage *)diskImageForKey:(nullable NSString *)key data:(nullable NSData *)data options:(SDImageCacheOptions)options context:(SDWebImageContext *)context {
347 405 if (data) {
348 406 UIImage *image = SDImageCacheDecodeImageData(data, key, [[self class] imageOptionsFromCacheOptions:options], context);
  407 + if (image) {
  408 + // Check extended data
  409 + NSData *extendedData = [self.diskCache extendedDataForKey:key];
  410 + if (extendedData) {
  411 + id extendedObject;
  412 + if (@available(iOS 11, tvOS 11, macOS 10.13, watchOS 4, *)) {
  413 + NSError *error;
  414 + NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:extendedData error:&error];
  415 + unarchiver.requiresSecureCoding = NO;
  416 + extendedObject = [unarchiver decodeTopLevelObjectForKey:NSKeyedArchiveRootObjectKey error:&error];
  417 + if (error) {
  418 + NSLog(@"NSKeyedUnarchiver unarchive failed with error: %@", error);
  419 + }
  420 + } else {
  421 + @try {
  422 +#pragma clang diagnostic push
  423 +#pragma clang diagnostic ignored "-Wdeprecated-declarations"
  424 + extendedObject = [NSKeyedUnarchiver unarchiveObjectWithData:extendedData];
  425 +#pragma clang diagnostic pop
  426 + } @catch (NSException *exception) {
  427 + NSLog(@"NSKeyedUnarchiver unarchive failed with exception: %@", exception);
  428 + }
  429 + }
  430 + image.sd_extendedObject = extendedObject;
  431 + }
  432 + }
349 433 return image;
350 434 } else {
351 435 return nil;
... ... @@ -361,22 +445,29 @@
361 445 }
362 446  
363 447 - (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context done:(nullable SDImageCacheQueryCompletionBlock)doneBlock {
  448 + return [self queryCacheOperationForKey:key options:options context:context cacheType:SDImageCacheTypeAll done:doneBlock];
  449 +}
  450 +
  451 +- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options context:(nullable SDWebImageContext *)context cacheType:(SDImageCacheType)queryCacheType done:(nullable SDImageCacheQueryCompletionBlock)doneBlock {
364 452 if (!key) {
365 453 if (doneBlock) {
366 454 doneBlock(nil, nil, SDImageCacheTypeNone);
367 455 }
368 456 return nil;
369 457 }
370   -
371   - id<SDImageTransformer> transformer = context[SDWebImageContextImageTransformer];
372   - if (transformer) {
373   - // grab the transformed disk image if transformer provided
374   - NSString *transformerKey = [transformer transformerKey];
375   - key = SDTransformedKeyForKey(key, transformerKey);
  458 + // Invalid cache type
  459 + if (queryCacheType == SDImageCacheTypeNone) {
  460 + if (doneBlock) {
  461 + doneBlock(nil, nil, SDImageCacheTypeNone);
  462 + }
  463 + return nil;
376 464 }
377 465  
378 466 // First check the in-memory cache...
379   - UIImage *image = [self imageFromMemoryCacheForKey:key];
  467 + UIImage *image;
  468 + if (queryCacheType != SDImageCacheTypeDisk) {
  469 + image = [self imageFromMemoryCacheForKey:key];
  470 + }
380 471  
381 472 if (image) {
382 473 if (options & SDImageCacheDecodeFirstFrameOnly) {
... ... @@ -399,7 +490,7 @@
399 490 }
400 491 }
401 492  
402   - BOOL shouldQueryMemoryOnly = (image && !(options & SDImageCacheQueryMemoryData));
  493 + BOOL shouldQueryMemoryOnly = (queryCacheType == SDImageCacheTypeMemory) || (image && !(options & SDImageCacheQueryMemoryData));
403 494 if (shouldQueryMemoryOnly) {
404 495 if (doneBlock) {
405 496 doneBlock(image, nil, SDImageCacheTypeMemory);
... ... @@ -513,7 +604,7 @@
513 604 });
514 605 }
515 606  
516   -// Make sure to call form io queue by caller
  607 +// Make sure to call from io queue by caller
517 608 - (void)_removeImageFromDiskForKey:(NSString *)key {
518 609 if (!key) {
519 610 return;
... ... @@ -634,6 +725,10 @@
634 725 #pragma mark - SDImageCache
635 726  
636 727 - (id<SDWebImageOperation>)queryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context completion:(nullable SDImageCacheQueryCompletionBlock)completionBlock {
  728 + return [self queryImageForKey:key options:options context:context cacheType:SDImageCacheTypeAll completion:completionBlock];
  729 +}
  730 +
  731 +- (id<SDWebImageOperation>)queryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context cacheType:(SDImageCacheType)cacheType completion:(nullable SDImageCacheQueryCompletionBlock)completionBlock {
637 732 SDImageCacheOptions cacheOptions = 0;
638 733 if (options & SDWebImageQueryMemoryData) cacheOptions |= SDImageCacheQueryMemoryData;
639 734 if (options & SDWebImageQueryMemoryDataSync) cacheOptions |= SDImageCacheQueryMemoryDataSync;
... ... @@ -644,7 +739,7 @@
644 739 if (options & SDWebImagePreloadAllFrames) cacheOptions |= SDImageCachePreloadAllFrames;
645 740 if (options & SDWebImageMatchAnimatedImageClass) cacheOptions |= SDImageCacheMatchAnimatedImageClass;
646 741  
647   - return [self queryCacheOperationForKey:key options:cacheOptions context:context done:completionBlock];
  742 + return [self queryCacheOperationForKey:key options:cacheOptions context:context cacheType:cacheType done:completionBlock];
648 743 }
649 744  
650 745 - (void)storeImage:(UIImage *)image imageData:(NSData *)imageData forKey:(nullable NSString *)key cacheType:(SDImageCacheType)cacheType completion:(nullable SDWebImageNoParamsBlock)completionBlock {
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.h
... ... @@ -12,13 +12,21 @@
12 12 /// Image Cache Expire Type
13 13 typedef NS_ENUM(NSUInteger, SDImageCacheConfigExpireType) {
14 14 /**
15   - * When the image is accessed it will update this value
  15 + * When the image cache is accessed it will update this value
16 16 */
17 17 SDImageCacheConfigExpireTypeAccessDate,
18 18 /**
19   - * The image was obtained from the disk cache (Default)
  19 + * When the image cache is created or modified it will update this value (Default)
20 20 */
21   - SDImageCacheConfigExpireTypeModificationDate
  21 + SDImageCacheConfigExpireTypeModificationDate,
  22 + /**
  23 + * When the image cache is created it will update this value
  24 + */
  25 + SDImageCacheConfigExpireTypeCreationDate,
  26 + /**
  27 + * When the image cache is created, modified, renamed, file attribute updated (like permission, xattr) it will update this value
  28 + */
  29 + SDImageCacheConfigExpireTypeChangeDate,
22 30 };
23 31  
24 32 /**
... ... @@ -49,7 +57,7 @@ typedef NS_ENUM(NSUInteger, SDImageCacheConfigExpireType) {
49 57 /*
50 58 * The option to control weak memory cache for images. When enable, `SDImageCache`'s memory cache will use a weak maptable to store the image at the same time when it stored to memory, and get removed at the same time.
51 59 * However when memory warning is triggered, since the weak maptable does not hold a strong reference to image instance, even when the memory cache itself is purged, some images which are held strongly by UIImageViews or other live instances can be recovered again, to avoid later re-query from disk cache or network. This may be helpful for the case, for example, when app enter background and memory is purged, cause cell flashing after re-enter foreground.
52   - * Defautls to YES. You can change this option dynamically.
  60 + * Defaults to YES. You can change this option dynamically.
53 61 */
54 62 @property (assign, nonatomic) BOOL shouldUseWeakMemoryCache;
55 63  
... ... @@ -107,7 +115,7 @@ typedef NS_ENUM(NSUInteger, SDImageCacheConfigExpireType) {
107 115 /**
108 116 * The custom file manager for disk cache. Pass nil to let disk cache choose the proper file manager.
109 117 * Defaults to nil.
110   - * @note This value does not support dynamic changes. Which means further modification on this value after cache initlized has no effect.
  118 + * @note This value does not support dynamic changes. Which means further modification on this value after cache initialized has no effect.
111 119 * @note Since `NSFileManager` does not support `NSCopying`. We just pass this by reference during copying. So it's not recommend to set this value on `defaultCacheConfig`.
112 120 */
113 121 @property (strong, nonatomic, nullable) NSFileManager *fileManager;
... ... @@ -115,14 +123,14 @@ typedef NS_ENUM(NSUInteger, SDImageCacheConfigExpireType) {
115 123 /**
116 124 * The custom memory cache class. Provided class instance must conform to `SDMemoryCache` protocol to allow usage.
117 125 * Defaults to built-in `SDMemoryCache` class.
118   - * @note This value does not support dynamic changes. Which means further modification on this value after cache initlized has no effect.
  126 + * @note This value does not support dynamic changes. Which means further modification on this value after cache initialized has no effect.
119 127 */
120 128 @property (assign, nonatomic, nonnull) Class memoryCacheClass;
121 129  
122 130 /**
123 131 * The custom disk cache class. Provided class instance must conform to `SDDiskCache` protocol to allow usage.
124 132 * Defaults to built-in `SDDiskCache` class.
125   - * @note This value does not support dynamic changes. Which means further modification on this value after cache initlized has no effect.
  133 + * @note This value does not support dynamic changes. Which means further modification on this value after cache initialized has no effect.
126 134 */
127 135 @property (assign ,nonatomic, nonnull) Class diskCacheClass;
128 136  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.h
... ... @@ -36,6 +36,7 @@ typedef NS_ENUM(NSInteger, SDImageCacheType) {
36 36 };
37 37  
38 38 typedef void(^SDImageCacheCheckCompletionBlock)(BOOL isInCache);
  39 +typedef void(^SDImageCacheQueryDataCompletionBlock)(NSData * _Nullable data);
39 40 typedef void(^SDImageCacheCalculateSizeBlock)(NSUInteger fileCount, NSUInteger totalSize);
40 41 typedef NSString * _Nullable (^SDImageCacheAdditionalCachePathBlock)(NSString * _Nonnull key);
41 42 typedef void(^SDImageCacheQueryCompletionBlock)(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType);
... ... @@ -63,7 +64,7 @@ FOUNDATION_EXPORT UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonn
63 64 @required
64 65 /**
65 66 Query the cached image from image cache for given key. The operation can be used to cancel the query.
66   - If image is cached in memory, completion is called synchronously, else aynchronously and depends on the options arg (See `SDWebImageQueryDiskSync`)
  67 + If image is cached in memory, completion is called synchronously, else asynchronously and depends on the options arg (See `SDWebImageQueryDiskSync`)
67 68  
68 69 @param key The image cache key
69 70 @param options A mask to specify options to use for this query
... ... @@ -77,7 +78,24 @@ FOUNDATION_EXPORT UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonn
77 78 completion:(nullable SDImageCacheQueryCompletionBlock)completionBlock;
78 79  
79 80 /**
80   - Store the image into image cache for the given key. If cache type is memory only, completion is called synchronously, else aynchronously.
  81 + Query the cached image from image cache for given key. The operation can be used to cancel the query.
  82 + If image is cached in memory, completion is called synchronously, else asynchronously and depends on the options arg (See `SDWebImageQueryDiskSync`)
  83 +
  84 + @param key The image cache key
  85 + @param options A mask to specify options to use for this query
  86 + @param context A context contains different options to perform specify changes or processes, see `SDWebImageContextOption`. This hold the extra objects which `options` enum can not hold.
  87 + @param cacheType Specify where to query the cache from. By default we use `.all`, which means both memory cache and disk cache. You can choose to query memory only or disk only as well. Pass `.none` is invalid and callback with nil immediately.
  88 + @param completionBlock The completion block. Will not get called if the operation is cancelled
  89 + @return The operation for this query
  90 + */
  91 +- (nullable id<SDWebImageOperation>)queryImageForKey:(nullable NSString *)key
  92 + options:(SDWebImageOptions)options
  93 + context:(nullable SDWebImageContext *)context
  94 + cacheType:(SDImageCacheType)cacheType
  95 + completion:(nullable SDImageCacheQueryCompletionBlock)completionBlock;
  96 +
  97 +/**
  98 + Store the image into image cache for the given key. If cache type is memory only, completion is called synchronously, else asynchronously.
81 99  
82 100 @param image The image to store
83 101 @param imageData The image data to be used for disk storage
... ... @@ -92,7 +110,7 @@ FOUNDATION_EXPORT UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonn
92 110 completion:(nullable SDWebImageNoParamsBlock)completionBlock;
93 111  
94 112 /**
95   - Remove the image from image cache for the given key. If cache type is memory only, completion is called synchronously, else aynchronously.
  113 + Remove the image from image cache for the given key. If cache type is memory only, completion is called synchronously, else asynchronously.
96 114  
97 115 @param key The image cache key
98 116 @param cacheType The image remove op cache type
... ... @@ -103,7 +121,7 @@ FOUNDATION_EXPORT UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonn
103 121 completion:(nullable SDWebImageNoParamsBlock)completionBlock;
104 122  
105 123 /**
106   - Check if image cache contains the image for the given key (does not load the image). If image is cached in memory, completion is called synchronously, else aynchronously.
  124 + Check if image cache contains the image for the given key (does not load the image). If image is cached in memory, completion is called synchronously, else asynchronously.
107 125  
108 126 @param key The image cache key
109 127 @param cacheType The image contains op cache type
... ... @@ -114,7 +132,7 @@ FOUNDATION_EXPORT UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonn
114 132 completion:(nullable SDImageCacheContainsCompletionBlock)completionBlock;
115 133  
116 134 /**
117   - Clear all the cached images for image cache. If cache type is memory only, completion is called synchronously, else aynchronously.
  135 + Clear all the cached images for image cache. If cache type is memory only, completion is called synchronously, else asynchronously.
118 136  
119 137 @param cacheType The image clear op cache type
120 138 @param completionBlock A block executed after the operation is finished
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m
... ... @@ -18,11 +18,32 @@ UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonnull imageData, NSS
18 18 BOOL decodeFirstFrame = SD_OPTIONS_CONTAINS(options, SDWebImageDecodeFirstFrameOnly);
19 19 NSNumber *scaleValue = context[SDWebImageContextImageScaleFactor];
20 20 CGFloat scale = scaleValue.doubleValue >= 1 ? scaleValue.doubleValue : SDImageScaleFactorForKey(cacheKey);
21   - SDImageCoderOptions *coderOptions = @{SDImageCoderDecodeFirstFrameOnly : @(decodeFirstFrame), SDImageCoderDecodeScaleFactor : @(scale)};
22   - if (context) {
23   - SDImageCoderMutableOptions *mutableCoderOptions = [coderOptions mutableCopy];
24   - [mutableCoderOptions setValue:context forKey:SDImageCoderWebImageContext];
25   - coderOptions = [mutableCoderOptions copy];
  21 + NSNumber *preserveAspectRatioValue = context[SDWebImageContextImagePreserveAspectRatio];
  22 + NSValue *thumbnailSizeValue;
  23 + BOOL shouldScaleDown = SD_OPTIONS_CONTAINS(options, SDWebImageScaleDownLargeImages);
  24 + if (shouldScaleDown) {
  25 + CGFloat thumbnailPixels = SDImageCoderHelper.defaultScaleDownLimitBytes / 4;
  26 + CGFloat dimension = ceil(sqrt(thumbnailPixels));
  27 + thumbnailSizeValue = @(CGSizeMake(dimension, dimension));
  28 + }
  29 + if (context[SDWebImageContextImageThumbnailPixelSize]) {
  30 + thumbnailSizeValue = context[SDWebImageContextImageThumbnailPixelSize];
  31 + }
  32 +
  33 + SDImageCoderMutableOptions *mutableCoderOptions = [NSMutableDictionary dictionaryWithCapacity:2];
  34 + mutableCoderOptions[SDImageCoderDecodeFirstFrameOnly] = @(decodeFirstFrame);
  35 + mutableCoderOptions[SDImageCoderDecodeScaleFactor] = @(scale);
  36 + mutableCoderOptions[SDImageCoderDecodePreserveAspectRatio] = preserveAspectRatioValue;
  37 + mutableCoderOptions[SDImageCoderDecodeThumbnailPixelSize] = thumbnailSizeValue;
  38 + mutableCoderOptions[SDImageCoderWebImageContext] = context;
  39 + SDImageCoderOptions *coderOptions = [mutableCoderOptions copy];
  40 +
  41 + // Grab the image coder
  42 + id<SDImageCoder> imageCoder;
  43 + if ([context[SDWebImageContextImageCoder] conformsToProtocol:@protocol(SDImageCoder)]) {
  44 + imageCoder = context[SDWebImageContextImageCoder];
  45 + } else {
  46 + imageCoder = [SDImageCodersManager sharedManager];
26 47 }
27 48  
28 49 if (!decodeFirstFrame) {
... ... @@ -44,7 +65,7 @@ UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonnull imageData, NSS
44 65 }
45 66 }
46 67 if (!image) {
47   - image = [[SDImageCodersManager sharedManager] decodedImageWithData:imageData options:coderOptions];
  68 + image = [imageCoder decodedImageWithData:imageData options:coderOptions];
48 69 }
49 70 if (image) {
50 71 BOOL shouldDecode = !SD_OPTIONS_CONTAINS(options, SDWebImageAvoidDecodeImage);
... ... @@ -56,12 +77,7 @@ UIImage * _Nullable SDImageCacheDecodeImageData(NSData * _Nonnull imageData, NSS
56 77 shouldDecode = NO;
57 78 }
58 79 if (shouldDecode) {
59   - BOOL shouldScaleDown = SD_OPTIONS_CONTAINS(options, SDWebImageScaleDownLargeImages);
60   - if (shouldScaleDown) {
61   - image = [SDImageCoderHelper decodedAndScaledDownImageWithImage:image limitBytes:0];
62   - } else {
63   - image = [SDImageCoderHelper decodedImageWithImage:image];
64   - }
  80 + image = [SDImageCoderHelper decodedImageWithImage:image];
65 81 }
66 82 }
67 83  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.m
... ... @@ -85,6 +85,10 @@
85 85 #pragma mark - SDImageCache
86 86  
87 87 - (id<SDWebImageOperation>)queryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(SDWebImageContext *)context completion:(SDImageCacheQueryCompletionBlock)completionBlock {
  88 + return [self queryImageForKey:key options:options context:context cacheType:SDImageCacheTypeAll completion:completionBlock];
  89 +}
  90 +
  91 +- (id<SDWebImageOperation>)queryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(SDWebImageContext *)context cacheType:(SDImageCacheType)cacheType completion:(SDImageCacheQueryCompletionBlock)completionBlock {
88 92 if (!key) {
89 93 return nil;
90 94 }
... ... @@ -93,30 +97,30 @@
93 97 if (count == 0) {
94 98 return nil;
95 99 } else if (count == 1) {
96   - return [caches.firstObject queryImageForKey:key options:options context:context completion:completionBlock];
  100 + return [caches.firstObject queryImageForKey:key options:options context:context cacheType:cacheType completion:completionBlock];
97 101 }
98 102 switch (self.queryOperationPolicy) {
99 103 case SDImageCachesManagerOperationPolicyHighestOnly: {
100 104 id<SDImageCache> cache = caches.lastObject;
101   - return [cache queryImageForKey:key options:options context:context completion:completionBlock];
  105 + return [cache queryImageForKey:key options:options context:context cacheType:cacheType completion:completionBlock];
102 106 }
103 107 break;
104 108 case SDImageCachesManagerOperationPolicyLowestOnly: {
105 109 id<SDImageCache> cache = caches.firstObject;
106   - return [cache queryImageForKey:key options:options context:context completion:completionBlock];
  110 + return [cache queryImageForKey:key options:options context:context cacheType:cacheType completion:completionBlock];
107 111 }
108 112 break;
109 113 case SDImageCachesManagerOperationPolicyConcurrent: {
110 114 SDImageCachesManagerOperation *operation = [SDImageCachesManagerOperation new];
111 115 [operation beginWithTotalCount:caches.count];
112   - [self concurrentQueryImageForKey:key options:options context:context completion:completionBlock enumerator:caches.reverseObjectEnumerator operation:operation];
  116 + [self concurrentQueryImageForKey:key options:options context:context cacheType:cacheType completion:completionBlock enumerator:caches.reverseObjectEnumerator operation:operation];
113 117 return operation;
114 118 }
115 119 break;
116 120 case SDImageCachesManagerOperationPolicySerial: {
117 121 SDImageCachesManagerOperation *operation = [SDImageCachesManagerOperation new];
118 122 [operation beginWithTotalCount:caches.count];
119   - [self serialQueryImageForKey:key options:options context:context completion:completionBlock enumerator:caches.reverseObjectEnumerator operation:operation];
  123 + [self serialQueryImageForKey:key options:options context:context cacheType:cacheType completion:completionBlock enumerator:caches.reverseObjectEnumerator operation:operation];
120 124 return operation;
121 125 }
122 126 break;
... ... @@ -279,11 +283,11 @@
279 283  
280 284 #pragma mark - Concurrent Operation
281 285  
282   -- (void)concurrentQueryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(SDWebImageContext *)context completion:(SDImageCacheQueryCompletionBlock)completionBlock enumerator:(NSEnumerator<id<SDImageCache>> *)enumerator operation:(SDImageCachesManagerOperation *)operation {
  286 +- (void)concurrentQueryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(SDWebImageContext *)context cacheType:(SDImageCacheType)queryCacheType completion:(SDImageCacheQueryCompletionBlock)completionBlock enumerator:(NSEnumerator<id<SDImageCache>> *)enumerator operation:(SDImageCachesManagerOperation *)operation {
283 287 NSParameterAssert(enumerator);
284 288 NSParameterAssert(operation);
285 289 for (id<SDImageCache> cache in enumerator) {
286   - [cache queryImageForKey:key options:options context:context completion:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) {
  290 + [cache queryImageForKey:key options:options context:context cacheType:queryCacheType completion:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) {
287 291 if (operation.isCancelled) {
288 292 // Cancelled
289 293 return;
... ... @@ -422,7 +426,7 @@
422 426  
423 427 #pragma mark - Serial Operation
424 428  
425   -- (void)serialQueryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(SDWebImageContext *)context completion:(SDImageCacheQueryCompletionBlock)completionBlock enumerator:(NSEnumerator<id<SDImageCache>> *)enumerator operation:(SDImageCachesManagerOperation *)operation {
  429 +- (void)serialQueryImageForKey:(NSString *)key options:(SDWebImageOptions)options context:(SDWebImageContext *)context cacheType:(SDImageCacheType)queryCacheType completion:(SDImageCacheQueryCompletionBlock)completionBlock enumerator:(NSEnumerator<id<SDImageCache>> *)enumerator operation:(SDImageCachesManagerOperation *)operation {
426 430 NSParameterAssert(enumerator);
427 431 NSParameterAssert(operation);
428 432 id<SDImageCache> cache = enumerator.nextObject;
... ... @@ -435,7 +439,7 @@
435 439 return;
436 440 }
437 441 @weakify(self);
438   - [cache queryImageForKey:key options:options context:context completion:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) {
  442 + [cache queryImageForKey:key options:options context:context cacheType:queryCacheType completion:^(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType) {
439 443 @strongify(self);
440 444 if (operation.isCancelled) {
441 445 // Cancelled
... ... @@ -455,7 +459,7 @@
455 459 return;
456 460 }
457 461 // Next
458   - [self serialQueryImageForKey:key options:options context:context completion:completionBlock enumerator:enumerator operation:operation];
  462 + [self serialQueryImageForKey:key options:options context:context cacheType:queryCacheType completion:completionBlock enumerator:enumerator operation:operation];
459 463 }];
460 464 }
461 465  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h
... ... @@ -21,12 +21,30 @@ typedef NSMutableDictionary&lt;SDImageCoderOption, id&gt; SDImageCoderMutableOptions;
21 21 @note works for `SDImageCoder`.
22 22 */
23 23 FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderDecodeFirstFrameOnly;
  24 +
24 25 /**
25 26 A CGFloat value which is greater than or equal to 1.0. This value specify the image scale factor for decoding. If not provide, use 1.0. (NSNumber)
26 27 @note works for `SDImageCoder`, `SDProgressiveImageCoder`, `SDAnimatedImageCoder`.
27 28 */
28 29 FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderDecodeScaleFactor;
29 30  
  31 +/**
  32 + A Boolean value indicating whether to keep the original aspect ratio when generating thumbnail images (or bitmap images from vector format).
  33 + Defaults to YES.
  34 + @note works for `SDImageCoder`, `SDProgressiveImageCoder`, `SDAnimatedImageCoder`.
  35 + */
  36 +FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderDecodePreserveAspectRatio;
  37 +
  38 +/**
  39 + A CGSize value indicating whether or not to generate the thumbnail images (or bitmap images from vector format). When this value is provided, the decoder will generate a thumbnail image which pixel size is smaller than or equal to (depends the `.preserveAspectRatio`) the value size.
  40 + Defaults to CGSizeZero, which means no thumbnail generation at all.
  41 + @note Supports for animated image as well.
  42 + @note When you pass `.preserveAspectRatio == NO`, the thumbnail image is stretched to match each dimension. When `.preserveAspectRatio == YES`, the thumbnail image's width is limited to pixel size's width, the thumbnail image's height is limited to pixel size's height. For common cases, you can just pass a square size to limit both.
  43 + @note works for `SDImageCoder`, `SDProgressiveImageCoder`, `SDAnimatedImageCoder`.
  44 + */
  45 +FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderDecodeThumbnailPixelSize;
  46 +
  47 +
30 48 // These options are for image encoding
31 49 /**
32 50 A Boolean value indicating whether to encode the first frame only for animated image during encoding. (NSNumber). If not provide, encode animated image if need.
... ... @@ -40,12 +58,42 @@ FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderEncodeFirstFrame
40 58 FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderEncodeCompressionQuality;
41 59  
42 60 /**
  61 + A UIColor(NSColor) value to used for non-alpha image encoding when the input image has alpha channel, the background color will be used to compose the alpha one. If not provide, use white color.
  62 + @note works for `SDImageCoder`
  63 + */
  64 +FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderEncodeBackgroundColor;
  65 +
  66 +/**
  67 + A CGSize value indicating the max image resolution in pixels during encoding. For vector image, this also effect the output vector data information about width and height. The encoder will not generate the encoded image larger than this limit. Note it always use the aspect ratio of input image..
  68 + Defaults to CGSizeZero, which means no max size limit at all.
  69 + @note Supports for animated image as well.
  70 + @note The output image's width is limited to pixel size's width, the output image's height is limited to pixel size's height. For common cases, you can just pass a square size to limit both.
  71 + @note works for `SDImageCoder`
  72 + */
  73 +FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderEncodeMaxPixelSize;
  74 +
  75 +/**
  76 + A NSUInteger value specify the max output data bytes size after encoding. Some lossy format like JPEG/HEIF supports the hint for codec to automatically reduce the quality and match the file size you want. Note this option will override the `SDImageCoderEncodeCompressionQuality`, because now the quality is decided by the encoder. (NSNumber)
  77 + @note This is a hint, no guarantee for output size because of compression algorithm limit. And this options does not works for vector images.
  78 + @note works for `SDImageCoder`
  79 + */
  80 +FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderEncodeMaxFileSize;
  81 +
  82 +/**
  83 + A Boolean value indicating the encoding format should contains a thumbnail image into the output data. Only some of image format (like JPEG/HEIF/AVIF) support this behavior. The embed thumbnail will be used during next time thumbnail decoding (provided `.thumbnailPixelSize`), which is faster than full image thumbnail decoding. (NSNumber)
  84 + Defaults to NO, which does not embed any thumbnail.
  85 + @note The thumbnail image's pixel size is not defined, the encoder can choose the proper pixel size which is suitable for encoding quality.
  86 + @note works for `SDImageCoder`
  87 + */
  88 +FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderEncodeEmbedThumbnail;
  89 +
  90 +/**
43 91 A SDWebImageContext object which hold the original context options from top-level API. (SDWebImageContext)
44 92 This option is ignored for all built-in coders and take no effect.
45   - But this may be useful for some custom coders, because some business logic may dependent on things other than image or image data inforamtion only.
  93 + But this may be useful for some custom coders, because some business logic may dependent on things other than image or image data information only.
46 94 See `SDWebImageContext` for more detailed information.
47 95 */
48   -FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderWebImageContext;
  96 +FOUNDATION_EXPORT SDImageCoderOption _Nonnull const SDImageCoderWebImageContext API_DEPRECATED("The coder component will be seperated from Core subspec in the future. Update your code to not rely on this context option.", macos(10.10, API_TO_BE_DEPRECATED), ios(8.0, API_TO_BE_DEPRECATED), tvos(9.0, API_TO_BE_DEPRECATED), watchos(2.0, API_TO_BE_DEPRECATED));;
49 97  
50 98 #pragma mark - Coder
51 99 /**
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m
... ... @@ -10,8 +10,14 @@
10 10  
11 11 SDImageCoderOption const SDImageCoderDecodeFirstFrameOnly = @"decodeFirstFrameOnly";
12 12 SDImageCoderOption const SDImageCoderDecodeScaleFactor = @"decodeScaleFactor";
  13 +SDImageCoderOption const SDImageCoderDecodePreserveAspectRatio = @"decodePreserveAspectRatio";
  14 +SDImageCoderOption const SDImageCoderDecodeThumbnailPixelSize = @"decodeThumbnailPixelSize";
13 15  
14 16 SDImageCoderOption const SDImageCoderEncodeFirstFrameOnly = @"encodeFirstFrameOnly";
15 17 SDImageCoderOption const SDImageCoderEncodeCompressionQuality = @"encodeCompressionQuality";
  18 +SDImageCoderOption const SDImageCoderEncodeBackgroundColor = @"encodeBackgroundColor";
  19 +SDImageCoderOption const SDImageCoderEncodeMaxPixelSize = @"encodeMaxPixelSize";
  20 +SDImageCoderOption const SDImageCoderEncodeMaxFileSize = @"encodeMaxFileSize";
  21 +SDImageCoderOption const SDImageCoderEncodeEmbedThumbnail = @"encodeEmbedThumbnail";
16 22  
17 23 SDImageCoderOption const SDImageCoderWebImageContext = @"webImageContext";
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h
... ... @@ -74,6 +74,16 @@
74 74 + (CGImageRef _Nullable)CGImageCreateDecoded:(_Nonnull CGImageRef)cgImage orientation:(CGImagePropertyOrientation)orientation CF_RETURNS_RETAINED;
75 75  
76 76 /**
  77 + Create a scaled CGImage by the provided CGImage and size. This follows The Create Rule and you are response to call release after usage.
  78 + It will detect whether the image size matching the scale size, if not, stretch the image to the target size.
  79 +
  80 + @param cgImage The CGImage
  81 + @param size The scale size in pixel.
  82 + @return A new created scaled image
  83 + */
  84 ++ (CGImageRef _Nullable)CGImageCreateScaled:(_Nonnull CGImageRef)cgImage size:(CGSize)size CF_RETURNS_RETAINED;
  85 +
  86 +/**
77 87 Return the decoded image by the provided image. This one unlike `CGImageCreateDecoded:`, will not decode the image which contains alpha channel or animated image
78 88 @param image The image to be decoded
79 89 @return The decoded image
... ... @@ -89,6 +99,12 @@
89 99 */
90 100 + (UIImage * _Nullable)decodedAndScaledDownImageWithImage:(UIImage * _Nullable)image limitBytes:(NSUInteger)bytes;
91 101  
  102 +/**
  103 + Control the default limit bytes to scale down largest images.
  104 + This value must be larger than or equal to 1MB. Defaults to 60MB on iOS/tvOS, 90MB on macOS, 30MB on watchOS.
  105 + */
  106 +@property (class, readwrite) NSUInteger defaultScaleDownLimitBytes;
  107 +
92 108 #if SD_UIKIT || SD_WATCH
93 109 /**
94 110 Convert an EXIF image orientation to an iOS one.
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m
... ... @@ -12,35 +12,35 @@
12 12 #import "NSData+ImageContentType.h"
13 13 #import "SDAnimatedImageRep.h"
14 14 #import "UIImage+ForceDecode.h"
  15 +#import "SDAssociatedObject.h"
15 16 #import "UIImage+Metadata.h"
  17 +#import "SDInternalMacros.h"
  18 +#import <Accelerate/Accelerate.h>
  19 +
  20 +static inline size_t SDByteAlign(size_t size, size_t alignment) {
  21 + return ((size + (alignment - 1)) / alignment) * alignment;
  22 +}
16 23  
17   -#if SD_UIKIT || SD_WATCH
18 24 static const size_t kBytesPerPixel = 4;
19 25 static const size_t kBitsPerComponent = 8;
20 26  
  27 +static const CGFloat kBytesPerMB = 1024.0f * 1024.0f;
  28 +static const CGFloat kPixelsPerMB = kBytesPerMB / kBytesPerPixel;
21 29 /*
22 30 * Defines the maximum size in MB of the decoded image when the flag `SDWebImageScaleDownLargeImages` is set
23 31 * Suggested value for iPad1 and iPhone 3GS: 60.
24 32 * Suggested value for iPad2 and iPhone 4: 120.
25 33 * Suggested value for iPhone 3G and iPod 2 and earlier devices: 30.
26 34 */
27   -static const CGFloat kDestImageSizeMB = 60.f;
28   -
29   -/*
30   - * Defines the maximum size in MB of a tile used to decode image when the flag `SDWebImageScaleDownLargeImages` is set
31   - * Suggested value for iPad1 and iPhone 3GS: 20.
32   - * Suggested value for iPad2 and iPhone 4: 40.
33   - * Suggested value for iPhone 3G and iPod 2 and earlier devices: 10.
34   - */
35   -static const CGFloat kSourceImageTileSizeMB = 20.f;
36   -
37   -static const CGFloat kBytesPerMB = 1024.0f * 1024.0f;
38   -static const CGFloat kPixelsPerMB = kBytesPerMB / kBytesPerPixel;
39   -static const CGFloat kDestTotalPixels = kDestImageSizeMB * kPixelsPerMB;
40   -static const CGFloat kTileTotalPixels = kSourceImageTileSizeMB * kPixelsPerMB;
  35 +#if SD_MAC
  36 +static CGFloat kDestImageLimitBytes = 90.f * kBytesPerMB;
  37 +#elif SD_UIKIT
  38 +static CGFloat kDestImageLimitBytes = 60.f * kBytesPerMB;
  39 +#elif SD_WATCH
  40 +static CGFloat kDestImageLimitBytes = 30.f * kBytesPerMB;
  41 +#endif
41 42  
42 43 static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to overlap the seems where tiles meet.
43   -#endif
44 44  
45 45 @implementation SDImageCoderHelper
46 46  
... ... @@ -277,10 +277,57 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
277 277 return newImageRef;
278 278 }
279 279  
  280 ++ (CGImageRef)CGImageCreateScaled:(CGImageRef)cgImage size:(CGSize)size {
  281 + if (!cgImage) {
  282 + return NULL;
  283 + }
  284 + size_t width = CGImageGetWidth(cgImage);
  285 + size_t height = CGImageGetHeight(cgImage);
  286 + if (width == size.width && height == size.height) {
  287 + CGImageRetain(cgImage);
  288 + return cgImage;
  289 + }
  290 +
  291 + __block vImage_Buffer input_buffer = {}, output_buffer = {};
  292 + @onExit {
  293 + if (input_buffer.data) free(input_buffer.data);
  294 + if (output_buffer.data) free(output_buffer.data);
  295 + };
  296 + BOOL hasAlpha = [self CGImageContainsAlpha:cgImage];
  297 + // iOS display alpha info (BGRA8888/BGRX8888)
  298 + CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Host;
  299 + bitmapInfo |= hasAlpha ? kCGImageAlphaPremultipliedFirst : kCGImageAlphaNoneSkipFirst;
  300 + vImage_CGImageFormat format = (vImage_CGImageFormat) {
  301 + .bitsPerComponent = 8,
  302 + .bitsPerPixel = 32,
  303 + .colorSpace = NULL,
  304 + .bitmapInfo = bitmapInfo,
  305 + .version = 0,
  306 + .decode = NULL,
  307 + .renderingIntent = kCGRenderingIntentDefault,
  308 + };
  309 +
  310 + vImage_Error a_ret = vImageBuffer_InitWithCGImage(&input_buffer, &format, NULL, cgImage, kvImageNoFlags);
  311 + if (a_ret != kvImageNoError) return NULL;
  312 + output_buffer.width = MAX(size.width, 0);
  313 + output_buffer.height = MAX(size.height, 0);
  314 + output_buffer.rowBytes = SDByteAlign(output_buffer.width * 4, 64);
  315 + output_buffer.data = malloc(output_buffer.rowBytes * output_buffer.height);
  316 + if (!output_buffer.data) return NULL;
  317 +
  318 + vImage_Error ret = vImageScale_ARGB8888(&input_buffer, &output_buffer, NULL, kvImageHighQualityResampling);
  319 + if (ret != kvImageNoError) return NULL;
  320 +
  321 + CGImageRef outputImage = vImageCreateCGImageFromBuffer(&output_buffer, &format, NULL, NULL, kvImageNoFlags, &ret);
  322 + if (ret != kvImageNoError) {
  323 + CGImageRelease(outputImage);
  324 + return NULL;
  325 + }
  326 +
  327 + return outputImage;
  328 +}
  329 +
280 330 + (UIImage *)decodedImageWithImage:(UIImage *)image {
281   -#if SD_MAC
282   - return image;
283   -#else
284 331 if (![self shouldDecodeImage:image]) {
285 332 return image;
286 333 }
... ... @@ -289,18 +336,18 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
289 336 if (!imageRef) {
290 337 return image;
291 338 }
  339 +#if SD_MAC
  340 + UIImage *decodedImage = [[UIImage alloc] initWithCGImage:imageRef scale:image.scale orientation:kCGImagePropertyOrientationUp];
  341 +#else
292 342 UIImage *decodedImage = [[UIImage alloc] initWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation];
  343 +#endif
293 344 CGImageRelease(imageRef);
  345 + SDImageCopyAssociatedObject(image, decodedImage);
294 346 decodedImage.sd_isDecoded = YES;
295   - decodedImage.sd_imageFormat = image.sd_imageFormat;
296 347 return decodedImage;
297   -#endif
298 348 }
299 349  
300 350 + (UIImage *)decodedAndScaledDownImageWithImage:(UIImage *)image limitBytes:(NSUInteger)bytes {
301   -#if SD_MAC
302   - return image;
303   -#else
304 351 if (![self shouldDecodeImage:image]) {
305 352 return image;
306 353 }
... ... @@ -311,13 +358,11 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
311 358  
312 359 CGFloat destTotalPixels;
313 360 CGFloat tileTotalPixels;
314   - if (bytes > 0) {
315   - destTotalPixels = bytes / kBytesPerPixel;
316   - tileTotalPixels = destTotalPixels / 3;
317   - } else {
318   - destTotalPixels = kDestTotalPixels;
319   - tileTotalPixels = kTileTotalPixels;
  361 + if (bytes == 0) {
  362 + bytes = kDestImageLimitBytes;
320 363 }
  364 + destTotalPixels = bytes / kBytesPerPixel;
  365 + tileTotalPixels = destTotalPixels / 3;
321 366 CGContextRef destContext;
322 367  
323 368 // autorelease the bitmap context and all vars to help system to free memory when there are memory warning.
... ... @@ -361,13 +406,13 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
361 406 CGContextSetInterpolationQuality(destContext, kCGInterpolationHigh);
362 407  
363 408 // Now define the size of the rectangle to be used for the
364   - // incremental blits from the input image to the output image.
  409 + // incremental bits from the input image to the output image.
365 410 // we use a source tile width equal to the width of the source
366 411 // image due to the way that iOS retrieves image data from disk.
367 412 // iOS must decode an image from disk in full width 'bands', even
368 413 // if current graphics context is clipped to a subrect within that
369 414 // band. Therefore we fully utilize all of the pixel data that results
370   - // from a decoding opertion by achnoring our tile size to the full
  415 + // from a decoding operation by anchoring our tile size to the full
371 416 // width of the input image.
372 417 CGRect sourceTile = CGRectZero;
373 418 sourceTile.size.width = sourceResolution.width;
... ... @@ -383,7 +428,7 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
383 428 destTile.size.height = sourceTile.size.height * imageScale;
384 429 destTile.origin.x = 0.0f;
385 430 // The source seem overlap is proportionate to the destination seem overlap.
386   - // this is the amount of pixels to overlap each tile as we assemble the ouput image.
  431 + // this is the amount of pixels to overlap each tile as we assemble the output image.
387 432 float sourceSeemOverlap = (int)((kDestSeemOverlap/destResolution.height)*sourceResolution.height);
388 433 CGImageRef sourceTileImageRef;
389 434 // calculate the number of read/write operations required to assemble the
... ... @@ -420,16 +465,30 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
420 465 if (destImageRef == NULL) {
421 466 return image;
422 467 }
  468 +#if SD_MAC
  469 + UIImage *destImage = [[UIImage alloc] initWithCGImage:destImageRef scale:image.scale orientation:kCGImagePropertyOrientationUp];
  470 +#else
423 471 UIImage *destImage = [[UIImage alloc] initWithCGImage:destImageRef scale:image.scale orientation:image.imageOrientation];
  472 +#endif
424 473 CGImageRelease(destImageRef);
425 474 if (destImage == nil) {
426 475 return image;
427 476 }
  477 + SDImageCopyAssociatedObject(image, destImage);
428 478 destImage.sd_isDecoded = YES;
429   - destImage.sd_imageFormat = image.sd_imageFormat;
430 479 return destImage;
431 480 }
432   -#endif
  481 +}
  482 +
  483 ++ (NSUInteger)defaultScaleDownLimitBytes {
  484 + return kDestImageLimitBytes;
  485 +}
  486 +
  487 ++ (void)setDefaultScaleDownLimitBytes:(NSUInteger)defaultScaleDownLimitBytes {
  488 + if (defaultScaleDownLimitBytes < kBytesPerMB) {
  489 + return;
  490 + }
  491 + kDestImageLimitBytes = defaultScaleDownLimitBytes;
433 492 }
434 493  
435 494 #if SD_UIKIT || SD_WATCH
... ... @@ -502,19 +561,22 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
502 561 }
503 562 #endif
504 563  
505   -#pragma mark - Helper Fuction
506   -#if SD_UIKIT || SD_WATCH
  564 +#pragma mark - Helper Function
507 565 + (BOOL)shouldDecodeImage:(nullable UIImage *)image {
  566 + // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error
  567 + if (image == nil) {
  568 + return NO;
  569 + }
508 570 // Avoid extra decode
509 571 if (image.sd_isDecoded) {
510 572 return NO;
511 573 }
512   - // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error
513   - if (image == nil) {
  574 + // do not decode animated images
  575 + if (image.sd_isAnimated) {
514 576 return NO;
515 577 }
516   - // do not decode animated images
517   - if (image.images != nil) {
  578 + // do not decode vector images
  579 + if (image.sd_isVector) {
518 580 return NO;
519 581 }
520 582  
... ... @@ -533,11 +595,10 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
533 595 return NO;
534 596 }
535 597 CGFloat destTotalPixels;
536   - if (bytes > 0) {
537   - destTotalPixels = bytes / kBytesPerPixel;
538   - } else {
539   - destTotalPixels = kDestTotalPixels;
  598 + if (bytes == 0) {
  599 + bytes = kDestImageLimitBytes;
540 600 }
  601 + destTotalPixels = bytes / kBytesPerPixel;
541 602 if (destTotalPixels <= kPixelsPerMB) {
542 603 // Too small to scale down
543 604 return NO;
... ... @@ -551,7 +612,6 @@ static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to over
551 612  
552 613 return shouldScaleDown;
553 614 }
554   -#endif
555 615  
556 616 static inline CGAffineTransform SDCGContextTransformFromOrientation(CGImagePropertyOrientation orientation, CGSize size) {
557 617 // Inspiration from @libfeihu
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.h
... ... @@ -13,6 +13,7 @@
13 13 These following graphics context method are provided to easily write cross-platform(AppKit/UIKit) code.
14 14 For UIKit, these methods just call the same method in `UIGraphics.h`. See the documentation for usage.
15 15 For AppKit, these methods use `NSGraphicsContext` to create image context and match the behavior like UIKit.
  16 + @note If you don't care bitmap format (ARGB8888) and just draw image, use `SDGraphicsImageRenderer` instead. It's more performant on RAM usage.`
16 17 */
17 18  
18 19 /// Returns the current graphics context.
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.m
... ... @@ -9,7 +9,7 @@
9 9 #import "SDImageHEICCoder.h"
10 10 #import "SDImageHEICCoderInternal.h"
11 11  
12   -// These constantce are available from iOS 13+ and Xcode 11. This raw value is used for toolchain and firmware compatiblitiy
  12 +// These constants are available from iOS 13+ and Xcode 11. This raw value is used for toolchain and firmware compatibility
13 13 static NSString * kSDCGImagePropertyHEICSDictionary = @"{HEICS}";
14 14 static NSString * kSDCGImagePropertyHEICSLoopCount = @"LoopCount";
15 15 static NSString * kSDCGImagePropertyHEICSDelayTime = @"DelayTime";
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.h
... ... @@ -12,7 +12,7 @@
12 12  
13 13 /**
14 14 This is the abstract class for all animated coder, which use the Image/IO API. You can not use this directly as real coders. A exception will be raised if you use this class.
15   - All of the properties need the subclass to implment and works as expceted.
  15 + All of the properties need the subclass to implement and works as expected.
16 16 For Image/IO, See Apple's documentation: https://developer.apple.com/documentation/imageio
17 17 */
18 18 @interface SDImageIOAnimatedCoder : NSObject <SDProgressiveImageCoder, SDAnimatedImageCoder>
... ... @@ -35,7 +35,7 @@
35 35 */
36 36 @property (class, readonly, nonnull) NSString *dictionaryProperty;
37 37 /**
38   - The image unclamped deply time property key used in Image/IO API. Such as `kCGImagePropertyGIFUnclampedDelayTime`
  38 + The image unclamped delay time property key used in Image/IO API. Such as `kCGImagePropertyGIFUnclampedDelayTime`
39 39 @note Subclass override.
40 40 */
41 41 @property (class, readonly, nonnull) NSString *unclampedDelayTimeProperty;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m
... ... @@ -12,6 +12,12 @@
12 12 #import "NSData+ImageContentType.h"
13 13 #import "SDImageCoderHelper.h"
14 14 #import "SDAnimatedImageRep.h"
  15 +#import "UIImage+ForceDecode.h"
  16 +
  17 +// Specify DPI for vector format in CGImageSource, like PDF
  18 +static NSString * kSDCGImageSourceRasterizationDPI = @"kCGImageSourceRasterizationDPI";
  19 +// Specify File Size for lossy format encoding, like JPEG
  20 +static NSString * kSDCGImageDestinationRequestedFileSize = @"kCGImageDestinationRequestedFileSize";
15 21  
16 22 @interface SDImageIOCoderFrame : NSObject
17 23  
... ... @@ -32,6 +38,8 @@
32 38 NSUInteger _frameCount;
33 39 NSArray<SDImageIOCoderFrame *> *_frames;
34 40 BOOL _finished;
  41 + BOOL _preserveAspectRatio;
  42 + CGSize _thumbnailSize;
35 43 }
36 44  
37 45 - (void)dealloc
... ... @@ -102,7 +110,7 @@
102 110  
103 111 + (NSUInteger)imageLoopCountWithSource:(CGImageSourceRef)source {
104 112 NSUInteger loopCount = self.defaultLoopCount;
105   - NSDictionary *imageProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyProperties(source, nil);
  113 + NSDictionary *imageProperties = (__bridge_transfer NSDictionary *)CGImageSourceCopyProperties(source, NULL);
106 114 NSDictionary *containerProperties = imageProperties[self.dictionaryProperty];
107 115 if (containerProperties) {
108 116 NSNumber *containerLoopCount = containerProperties[self.loopCountProperty];
... ... @@ -114,8 +122,12 @@
114 122 }
115 123  
116 124 + (NSTimeInterval)frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source {
  125 + NSDictionary *options = @{
  126 + (__bridge NSString *)kCGImageSourceShouldCacheImmediately : @(YES),
  127 + (__bridge NSString *)kCGImageSourceShouldCache : @(YES) // Always cache to reduce CPU usage
  128 + };
117 129 NSTimeInterval frameDuration = 0.1;
118   - CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil);
  130 + CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, (__bridge CFDictionaryRef)options);
119 131 if (!cfFrameProperties) {
120 132 return frameDuration;
121 133 }
... ... @@ -145,6 +157,93 @@
145 157 return frameDuration;
146 158 }
147 159  
  160 ++ (UIImage *)createFrameAtIndex:(NSUInteger)index source:(CGImageSourceRef)source scale:(CGFloat)scale preserveAspectRatio:(BOOL)preserveAspectRatio thumbnailSize:(CGSize)thumbnailSize options:(NSDictionary *)options {
  161 + // Some options need to pass to `CGImageSourceCopyPropertiesAtIndex` before `CGImageSourceCreateImageAtIndex`, or ImageIO will ignore them because they parse once :)
  162 + // Parse the image properties
  163 + NSDictionary *properties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source, index, (__bridge CFDictionaryRef)options);
  164 + NSUInteger pixelWidth = [properties[(__bridge NSString *)kCGImagePropertyPixelWidth] unsignedIntegerValue];
  165 + NSUInteger pixelHeight = [properties[(__bridge NSString *)kCGImagePropertyPixelHeight] unsignedIntegerValue];
  166 + CGImagePropertyOrientation exifOrientation = (CGImagePropertyOrientation)[properties[(__bridge NSString *)kCGImagePropertyOrientation] unsignedIntegerValue];
  167 + if (!exifOrientation) {
  168 + exifOrientation = kCGImagePropertyOrientationUp;
  169 + }
  170 +
  171 + CFStringRef uttype = CGImageSourceGetType(source);
  172 + // Check vector format
  173 + BOOL isVector = NO;
  174 + if ([NSData sd_imageFormatFromUTType:uttype] == SDImageFormatPDF) {
  175 + isVector = YES;
  176 + }
  177 +
  178 + NSMutableDictionary *decodingOptions;
  179 + if (options) {
  180 + decodingOptions = [NSMutableDictionary dictionaryWithDictionary:options];
  181 + } else {
  182 + decodingOptions = [NSMutableDictionary dictionary];
  183 + }
  184 + CGImageRef imageRef;
  185 + if (thumbnailSize.width == 0 || thumbnailSize.height == 0 || pixelWidth == 0 || pixelHeight == 0 || (pixelWidth <= thumbnailSize.width && pixelHeight <= thumbnailSize.height)) {
  186 + if (isVector) {
  187 + if (thumbnailSize.width == 0 || thumbnailSize.height == 0) {
  188 + // Provide the default pixel count for vector images, simply just use the screen size
  189 +#if SD_WATCH
  190 + thumbnailSize = WKInterfaceDevice.currentDevice.screenBounds.size;
  191 +#elif SD_UIKIT
  192 + thumbnailSize = UIScreen.mainScreen.bounds.size;
  193 +#elif SD_MAC
  194 + thumbnailSize = NSScreen.mainScreen.frame.size;
  195 +#endif
  196 + }
  197 + CGFloat maxPixelSize = MAX(thumbnailSize.width, thumbnailSize.height);
  198 + NSUInteger DPIPerPixel = 2;
  199 + NSUInteger rasterizationDPI = maxPixelSize * DPIPerPixel;
  200 + decodingOptions[kSDCGImageSourceRasterizationDPI] = @(rasterizationDPI);
  201 + }
  202 + imageRef = CGImageSourceCreateImageAtIndex(source, index, (__bridge CFDictionaryRef)[decodingOptions copy]);
  203 + } else {
  204 + decodingOptions[(__bridge NSString *)kCGImageSourceCreateThumbnailWithTransform] = @(preserveAspectRatio);
  205 + CGFloat maxPixelSize;
  206 + if (preserveAspectRatio) {
  207 + CGFloat pixelRatio = pixelWidth / pixelHeight;
  208 + CGFloat thumbnailRatio = thumbnailSize.width / thumbnailSize.height;
  209 + if (pixelRatio > thumbnailRatio) {
  210 + maxPixelSize = thumbnailSize.width;
  211 + } else {
  212 + maxPixelSize = thumbnailSize.height;
  213 + }
  214 + } else {
  215 + maxPixelSize = MAX(thumbnailSize.width, thumbnailSize.height);
  216 + }
  217 + decodingOptions[(__bridge NSString *)kCGImageSourceThumbnailMaxPixelSize] = @(maxPixelSize);
  218 + decodingOptions[(__bridge NSString *)kCGImageSourceCreateThumbnailFromImageAlways] = @(YES);
  219 + imageRef = CGImageSourceCreateThumbnailAtIndex(source, index, (__bridge CFDictionaryRef)[decodingOptions copy]);
  220 + }
  221 + if (!imageRef) {
  222 + return nil;
  223 + }
  224 +
  225 + if (thumbnailSize.width > 0 && thumbnailSize.height > 0) {
  226 + if (preserveAspectRatio) {
  227 + // kCGImageSourceCreateThumbnailWithTransform will apply EXIF transform as well, we should not apply twice
  228 + exifOrientation = kCGImagePropertyOrientationUp;
  229 + } else {
  230 + // `CGImageSourceCreateThumbnailAtIndex` take only pixel dimension, if not `preserveAspectRatio`, we should manual scale to the target size
  231 + CGImageRef scaledImageRef = [SDImageCoderHelper CGImageCreateScaled:imageRef size:thumbnailSize];
  232 + CGImageRelease(imageRef);
  233 + imageRef = scaledImageRef;
  234 + }
  235 + }
  236 +
  237 +#if SD_UIKIT || SD_WATCH
  238 + UIImageOrientation imageOrientation = [SDImageCoderHelper imageOrientationFromEXIFOrientation:exifOrientation];
  239 + UIImage *image = [[UIImage alloc] initWithCGImage:imageRef scale:scale orientation:imageOrientation];
  240 +#else
  241 + UIImage *image = [[UIImage alloc] initWithCGImage:imageRef scale:scale orientation:exifOrientation];
  242 +#endif
  243 + CGImageRelease(imageRef);
  244 + return image;
  245 +}
  246 +
148 247 #pragma mark - Decode
149 248 - (BOOL)canDecodeFromData:(nullable NSData *)data {
150 249 return ([NSData sd_imageFormatForImageData:data] == self.class.imageFormat);
... ... @@ -160,14 +259,34 @@
160 259 scale = MAX([scaleFactor doubleValue], 1);
161 260 }
162 261  
  262 + CGSize thumbnailSize = CGSizeZero;
  263 + NSValue *thumbnailSizeValue = options[SDImageCoderDecodeThumbnailPixelSize];
  264 + if (thumbnailSizeValue != nil) {
163 265 #if SD_MAC
164   - SDAnimatedImageRep *imageRep = [[SDAnimatedImageRep alloc] initWithData:data];
165   - NSSize size = NSMakeSize(imageRep.pixelsWide / scale, imageRep.pixelsHigh / scale);
166   - imageRep.size = size;
167   - NSImage *animatedImage = [[NSImage alloc] initWithSize:size];
168   - [animatedImage addRepresentation:imageRep];
169   - return animatedImage;
  266 + thumbnailSize = thumbnailSizeValue.sizeValue;
170 267 #else
  268 + thumbnailSize = thumbnailSizeValue.CGSizeValue;
  269 +#endif
  270 + }
  271 +
  272 + BOOL preserveAspectRatio = YES;
  273 + NSNumber *preserveAspectRatioValue = options[SDImageCoderDecodePreserveAspectRatio];
  274 + if (preserveAspectRatioValue != nil) {
  275 + preserveAspectRatio = preserveAspectRatioValue.boolValue;
  276 + }
  277 +
  278 +#if SD_MAC
  279 + // If don't use thumbnail, prefers the built-in generation of frames (GIF/APNG)
  280 + // Which decode frames in time and reduce memory usage
  281 + if (thumbnailSize.width == 0 || thumbnailSize.height == 0) {
  282 + SDAnimatedImageRep *imageRep = [[SDAnimatedImageRep alloc] initWithData:data];
  283 + NSSize size = NSMakeSize(imageRep.pixelsWide / scale, imageRep.pixelsHigh / scale);
  284 + imageRep.size = size;
  285 + NSImage *animatedImage = [[NSImage alloc] initWithSize:size];
  286 + [animatedImage addRepresentation:imageRep];
  287 + return animatedImage;
  288 + }
  289 +#endif
171 290  
172 291 CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
173 292 if (!source) {
... ... @@ -178,19 +297,17 @@
178 297  
179 298 BOOL decodeFirstFrame = [options[SDImageCoderDecodeFirstFrameOnly] boolValue];
180 299 if (decodeFirstFrame || count <= 1) {
181   - animatedImage = [[UIImage alloc] initWithData:data scale:scale];
  300 + animatedImage = [self.class createFrameAtIndex:0 source:source scale:scale preserveAspectRatio:preserveAspectRatio thumbnailSize:thumbnailSize options:nil];
182 301 } else {
183 302 NSMutableArray<SDImageFrame *> *frames = [NSMutableArray array];
184 303  
185 304 for (size_t i = 0; i < count; i++) {
186   - CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, i, NULL);
187   - if (!imageRef) {
  305 + UIImage *image = [self.class createFrameAtIndex:i source:source scale:scale preserveAspectRatio:preserveAspectRatio thumbnailSize:thumbnailSize options:nil];
  306 + if (!image) {
188 307 continue;
189 308 }
190 309  
191 310 NSTimeInterval duration = [self.class frameDurationAtIndex:i source:source];
192   - UIImage *image = [[UIImage alloc] initWithCGImage:imageRef scale:scale orientation:UIImageOrientationUp];
193   - CGImageRelease(imageRef);
194 311  
195 312 SDImageFrame *frame = [SDImageFrame frameWithImage:image duration:duration];
196 313 [frames addObject:frame];
... ... @@ -205,7 +322,6 @@
205 322 CFRelease(source);
206 323  
207 324 return animatedImage;
208   -#endif
209 325 }
210 326  
211 327 #pragma mark - Progressive Decode
... ... @@ -225,6 +341,22 @@
225 341 scale = MAX([scaleFactor doubleValue], 1);
226 342 }
227 343 _scale = scale;
  344 + CGSize thumbnailSize = CGSizeZero;
  345 + NSValue *thumbnailSizeValue = options[SDImageCoderDecodeThumbnailPixelSize];
  346 + if (thumbnailSizeValue != nil) {
  347 + #if SD_MAC
  348 + thumbnailSize = thumbnailSizeValue.sizeValue;
  349 + #else
  350 + thumbnailSize = thumbnailSizeValue.CGSizeValue;
  351 + #endif
  352 + }
  353 + _thumbnailSize = thumbnailSize;
  354 + BOOL preserveAspectRatio = YES;
  355 + NSNumber *preserveAspectRatioValue = options[SDImageCoderDecodePreserveAspectRatio];
  356 + if (preserveAspectRatioValue != nil) {
  357 + preserveAspectRatio = preserveAspectRatioValue.boolValue;
  358 + }
  359 + _preserveAspectRatio = preserveAspectRatio;
228 360 #if SD_UIKIT
229 361 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
230 362 #endif
... ... @@ -246,7 +378,11 @@
246 378 CGImageSourceUpdateData(_imageSource, (__bridge CFDataRef)data, finished);
247 379  
248 380 if (_width + _height == 0) {
249   - CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(_imageSource, 0, NULL);
  381 + NSDictionary *options = @{
  382 + (__bridge NSString *)kCGImageSourceShouldCacheImmediately : @(YES),
  383 + (__bridge NSString *)kCGImageSourceShouldCache : @(YES) // Always cache to reduce CPU usage
  384 + };
  385 + CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(_imageSource, 0, (__bridge CFDictionaryRef)options);
250 386 if (properties) {
251 387 CFTypeRef val = CFDictionaryGetValue(properties, kCGImagePropertyPixelHeight);
252 388 if (val) CFNumberGetValue(val, kCFNumberLongType, &_height);
... ... @@ -265,20 +401,13 @@
265 401  
266 402 if (_width + _height > 0) {
267 403 // Create the image
268   - CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(_imageSource, 0, NULL);
269   -
270   - if (partialImageRef) {
271   - CGFloat scale = _scale;
272   - NSNumber *scaleFactor = options[SDImageCoderDecodeScaleFactor];
273   - if (scaleFactor != nil) {
274   - scale = MAX([scaleFactor doubleValue], 1);
275   - }
276   -#if SD_UIKIT || SD_WATCH
277   - image = [[UIImage alloc] initWithCGImage:partialImageRef scale:scale orientation:UIImageOrientationUp];
278   -#else
279   - image = [[UIImage alloc] initWithCGImage:partialImageRef scale:scale orientation:kCGImagePropertyOrientationUp];
280   -#endif
281   - CGImageRelease(partialImageRef);
  404 + CGFloat scale = _scale;
  405 + NSNumber *scaleFactor = options[SDImageCoderDecodeScaleFactor];
  406 + if (scaleFactor != nil) {
  407 + scale = MAX([scaleFactor doubleValue], 1);
  408 + }
  409 + image = [self.class createFrameAtIndex:0 source:_imageSource scale:scale preserveAspectRatio:_preserveAspectRatio thumbnailSize:_thumbnailSize options:nil];
  410 + if (image) {
282 411 image.sd_imageFormat = self.class.imageFormat;
283 412 }
284 413 }
... ... @@ -295,6 +424,11 @@
295 424 if (!image) {
296 425 return nil;
297 426 }
  427 + CGImageRef imageRef = image.CGImage;
  428 + if (!imageRef) {
  429 + // Earily return, supports CGImage only
  430 + return nil;
  431 + }
298 432  
299 433 if (format != self.class.imageFormat) {
300 434 return nil;
... ... @@ -312,29 +446,69 @@
312 446 return nil;
313 447 }
314 448 NSMutableDictionary *properties = [NSMutableDictionary dictionary];
  449 + // Encoding Options
315 450 double compressionQuality = 1;
316 451 if (options[SDImageCoderEncodeCompressionQuality]) {
317 452 compressionQuality = [options[SDImageCoderEncodeCompressionQuality] doubleValue];
318 453 }
319 454 properties[(__bridge NSString *)kCGImageDestinationLossyCompressionQuality] = @(compressionQuality);
  455 + CGColorRef backgroundColor = [options[SDImageCoderEncodeBackgroundColor] CGColor];
  456 + if (backgroundColor) {
  457 + properties[(__bridge NSString *)kCGImageDestinationBackgroundColor] = (__bridge id)(backgroundColor);
  458 + }
  459 + CGSize maxPixelSize = CGSizeZero;
  460 + NSValue *maxPixelSizeValue = options[SDImageCoderEncodeMaxPixelSize];
  461 + if (maxPixelSizeValue != nil) {
  462 +#if SD_MAC
  463 + maxPixelSize = maxPixelSizeValue.sizeValue;
  464 +#else
  465 + maxPixelSize = maxPixelSizeValue.CGSizeValue;
  466 +#endif
  467 + }
  468 + NSUInteger pixelWidth = CGImageGetWidth(imageRef);
  469 + NSUInteger pixelHeight = CGImageGetHeight(imageRef);
  470 + CGFloat finalPixelSize = 0;
  471 + if (maxPixelSize.width > 0 && maxPixelSize.height > 0 && pixelWidth > maxPixelSize.width && pixelHeight > maxPixelSize.height) {
  472 + CGFloat pixelRatio = pixelWidth / pixelHeight;
  473 + CGFloat maxPixelSizeRatio = maxPixelSize.width / maxPixelSize.height;
  474 + if (pixelRatio > maxPixelSizeRatio) {
  475 + finalPixelSize = maxPixelSize.width;
  476 + } else {
  477 + finalPixelSize = maxPixelSize.height;
  478 + }
  479 + properties[(__bridge NSString *)kCGImageDestinationImageMaxPixelSize] = @(finalPixelSize);
  480 + }
  481 + NSUInteger maxFileSize = [options[SDImageCoderEncodeMaxFileSize] unsignedIntegerValue];
  482 + if (maxFileSize > 0) {
  483 + properties[kSDCGImageDestinationRequestedFileSize] = @(maxFileSize);
  484 + // Remove the quality if we have file size limit
  485 + properties[(__bridge NSString *)kCGImageDestinationLossyCompressionQuality] = nil;
  486 + }
  487 + BOOL embedThumbnail = NO;
  488 + if (options[SDImageCoderEncodeEmbedThumbnail]) {
  489 + embedThumbnail = [options[SDImageCoderEncodeEmbedThumbnail] boolValue];
  490 + }
  491 + properties[(__bridge NSString *)kCGImageDestinationEmbedThumbnail] = @(embedThumbnail);
320 492  
321 493 BOOL encodeFirstFrame = [options[SDImageCoderEncodeFirstFrameOnly] boolValue];
322 494 if (encodeFirstFrame || frames.count == 0) {
323 495 // for static single images
324   - CGImageDestinationAddImage(imageDestination, image.CGImage, (__bridge CFDictionaryRef)properties);
  496 + CGImageDestinationAddImage(imageDestination, imageRef, (__bridge CFDictionaryRef)properties);
325 497 } else {
326 498 // for animated images
327 499 NSUInteger loopCount = image.sd_imageLoopCount;
328   - NSDictionary *containerProperties = @{self.class.loopCountProperty : @(loopCount)};
329   - properties[self.class.dictionaryProperty] = containerProperties;
330   - CGImageDestinationSetProperties(imageDestination, (__bridge CFDictionaryRef)properties);
  500 + NSDictionary *containerProperties = @{
  501 + self.class.dictionaryProperty: @{self.class.loopCountProperty : @(loopCount)}
  502 + };
  503 + // container level properties (applies for `CGImageDestinationSetProperties`, not individual frames)
  504 + CGImageDestinationSetProperties(imageDestination, (__bridge CFDictionaryRef)containerProperties);
331 505  
332 506 for (size_t i = 0; i < frames.count; i++) {
333 507 SDImageFrame *frame = frames[i];
334 508 NSTimeInterval frameDuration = frame.duration;
335 509 CGImageRef frameImageRef = frame.image.CGImage;
336   - NSDictionary *frameProperties = @{self.class.dictionaryProperty : @{self.class.delayTimeProperty : @(frameDuration)}};
337   - CGImageDestinationAddImage(imageDestination, frameImageRef, (__bridge CFDictionaryRef)frameProperties);
  510 + properties[self.class.dictionaryProperty] = @{self.class.delayTimeProperty : @(frameDuration)};
  511 + CGImageDestinationAddImage(imageDestination, frameImageRef, (__bridge CFDictionaryRef)properties);
338 512 }
339 513 }
340 514 // Finalize the destination.
... ... @@ -370,6 +544,22 @@
370 544 scale = MAX([scaleFactor doubleValue], 1);
371 545 }
372 546 _scale = scale;
  547 + CGSize thumbnailSize = CGSizeZero;
  548 + NSValue *thumbnailSizeValue = options[SDImageCoderDecodeThumbnailPixelSize];
  549 + if (thumbnailSizeValue != nil) {
  550 + #if SD_MAC
  551 + thumbnailSize = thumbnailSizeValue.sizeValue;
  552 + #else
  553 + thumbnailSize = thumbnailSizeValue.CGSizeValue;
  554 + #endif
  555 + }
  556 + _thumbnailSize = thumbnailSize;
  557 + BOOL preserveAspectRatio = YES;
  558 + NSNumber *preserveAspectRatioValue = options[SDImageCoderDecodePreserveAspectRatio];
  559 + if (preserveAspectRatioValue != nil) {
  560 + preserveAspectRatio = preserveAspectRatioValue.boolValue;
  561 + }
  562 + _preserveAspectRatio = preserveAspectRatio;
373 563 _imageSource = imageSource;
374 564 _imageData = data;
375 565 #if SD_UIKIT
... ... @@ -421,23 +611,20 @@
421 611 }
422 612  
423 613 - (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index {
424   - CGImageRef imageRef = CGImageSourceCreateImageAtIndex(_imageSource, index, NULL);
425   - if (!imageRef) {
  614 + if (index >= _frameCount) {
426 615 return nil;
427 616 }
428   - // Image/IO create CGImage does not decode, so we do this because this is called background queue, this can avoid main queue block when rendering(especially when one more imageViews use the same image instance)
429   - CGImageRef newImageRef = [SDImageCoderHelper CGImageCreateDecoded:imageRef];
430   - if (!newImageRef) {
431   - newImageRef = imageRef;
432   - } else {
433   - CGImageRelease(imageRef);
  617 + // Animated Image should not use the CGContext solution to force decode. Prefers to use Image/IO built in method, which is safer and memory friendly, see https://github.com/SDWebImage/SDWebImage/issues/2961
  618 + NSDictionary *options = @{
  619 + (__bridge NSString *)kCGImageSourceShouldCacheImmediately : @(YES),
  620 + (__bridge NSString *)kCGImageSourceShouldCache : @(YES) // Always cache to reduce CPU usage
  621 + };
  622 + UIImage *image = [self.class createFrameAtIndex:index source:_imageSource scale:_scale preserveAspectRatio:_preserveAspectRatio thumbnailSize:_thumbnailSize options:options];
  623 + if (!image) {
  624 + return nil;
434 625 }
435   -#if SD_MAC
436   - UIImage *image = [[UIImage alloc] initWithCGImage:newImageRef scale:_scale orientation:kCGImagePropertyOrientationUp];
437   -#else
438   - UIImage *image = [[UIImage alloc] initWithCGImage:newImageRef scale:_scale orientation:UIImageOrientationUp];
439   -#endif
440   - CGImageRelease(newImageRef);
  626 + image.sd_imageFormat = self.class.imageFormat;
  627 + image.sd_isDecoded = YES;;
441 628 return image;
442 629 }
443 630  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m
... ... @@ -12,6 +12,10 @@
12 12 #import <ImageIO/ImageIO.h>
13 13 #import "UIImage+Metadata.h"
14 14 #import "SDImageHEICCoderInternal.h"
  15 +#import "SDImageIOAnimatedCoderInternal.h"
  16 +
  17 +// Specify File Size for lossy format encoding, like JPEG
  18 +static NSString * kSDCGImageDestinationRequestedFileSize = @"kCGImageDestinationRequestedFileSize";
15 19  
16 20 @implementation SDImageIOCoder {
17 21 size_t _width, _height;
... ... @@ -19,6 +23,8 @@
19 23 CGImageSourceRef _imageSource;
20 24 CGFloat _scale;
21 25 BOOL _finished;
  26 + BOOL _preserveAspectRatio;
  27 + CGSize _thumbnailSize;
22 28 }
23 29  
24 30 - (void)dealloc {
... ... @@ -74,7 +80,33 @@
74 80 scale = MAX([scaleFactor doubleValue], 1) ;
75 81 }
76 82  
77   - UIImage *image = [[UIImage alloc] initWithData:data scale:scale];
  83 + CGSize thumbnailSize = CGSizeZero;
  84 + NSValue *thumbnailSizeValue = options[SDImageCoderDecodeThumbnailPixelSize];
  85 + if (thumbnailSizeValue != nil) {
  86 +#if SD_MAC
  87 + thumbnailSize = thumbnailSizeValue.sizeValue;
  88 +#else
  89 + thumbnailSize = thumbnailSizeValue.CGSizeValue;
  90 +#endif
  91 + }
  92 +
  93 + BOOL preserveAspectRatio = YES;
  94 + NSNumber *preserveAspectRatioValue = options[SDImageCoderDecodePreserveAspectRatio];
  95 + if (preserveAspectRatioValue != nil) {
  96 + preserveAspectRatio = preserveAspectRatioValue.boolValue;
  97 + }
  98 +
  99 + CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
  100 + if (!source) {
  101 + return nil;
  102 + }
  103 +
  104 + UIImage *image = [SDImageIOAnimatedCoder createFrameAtIndex:0 source:source scale:scale preserveAspectRatio:preserveAspectRatio thumbnailSize:thumbnailSize options:nil];
  105 + CFRelease(source);
  106 + if (!image) {
  107 + return nil;
  108 + }
  109 +
78 110 image.sd_imageFormat = [NSData sd_imageFormatForImageData:data];
79 111 return image;
80 112 }
... ... @@ -95,6 +127,22 @@
95 127 scale = MAX([scaleFactor doubleValue], 1);
96 128 }
97 129 _scale = scale;
  130 + CGSize thumbnailSize = CGSizeZero;
  131 + NSValue *thumbnailSizeValue = options[SDImageCoderDecodeThumbnailPixelSize];
  132 + if (thumbnailSizeValue != nil) {
  133 + #if SD_MAC
  134 + thumbnailSize = thumbnailSizeValue.sizeValue;
  135 + #else
  136 + thumbnailSize = thumbnailSizeValue.CGSizeValue;
  137 + #endif
  138 + }
  139 + _thumbnailSize = thumbnailSize;
  140 + BOOL preserveAspectRatio = YES;
  141 + NSNumber *preserveAspectRatioValue = options[SDImageCoderDecodePreserveAspectRatio];
  142 + if (preserveAspectRatioValue != nil) {
  143 + preserveAspectRatio = preserveAspectRatioValue.boolValue;
  144 + }
  145 + _preserveAspectRatio = preserveAspectRatio;
98 146 #if SD_UIKIT
99 147 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
100 148 #endif
... ... @@ -140,21 +188,13 @@
140 188  
141 189 if (_width + _height > 0) {
142 190 // Create the image
143   - CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(_imageSource, 0, NULL);
144   -
145   - if (partialImageRef) {
146   - CGFloat scale = _scale;
147   - NSNumber *scaleFactor = options[SDImageCoderDecodeScaleFactor];
148   - if (scaleFactor != nil) {
149   - scale = MAX([scaleFactor doubleValue], 1);
150   - }
151   -#if SD_UIKIT || SD_WATCH
152   - UIImageOrientation imageOrientation = [SDImageCoderHelper imageOrientationFromEXIFOrientation:_orientation];
153   - image = [[UIImage alloc] initWithCGImage:partialImageRef scale:scale orientation:imageOrientation];
154   -#else
155   - image = [[UIImage alloc] initWithCGImage:partialImageRef scale:scale orientation:_orientation];
156   -#endif
157   - CGImageRelease(partialImageRef);
  191 + CGFloat scale = _scale;
  192 + NSNumber *scaleFactor = options[SDImageCoderDecodeScaleFactor];
  193 + if (scaleFactor != nil) {
  194 + scale = MAX([scaleFactor doubleValue], 1);
  195 + }
  196 + image = [SDImageIOAnimatedCoder createFrameAtIndex:0 source:_imageSource scale:scale preserveAspectRatio:_preserveAspectRatio thumbnailSize:_thumbnailSize options:nil];
  197 + if (image) {
158 198 CFStringRef uttype = CGImageSourceGetType(_imageSource);
159 199 image.sd_imageFormat = [NSData sd_imageFormatFromUTType:uttype];
160 200 }
... ... @@ -184,9 +224,14 @@
184 224 if (!image) {
185 225 return nil;
186 226 }
  227 + CGImageRef imageRef = image.CGImage;
  228 + if (!imageRef) {
  229 + // Earily return, supports CGImage only
  230 + return nil;
  231 + }
187 232  
188 233 if (format == SDImageFormatUndefined) {
189   - BOOL hasAlpha = [SDImageCoderHelper CGImageContainsAlpha:image.CGImage];
  234 + BOOL hasAlpha = [SDImageCoderHelper CGImageContainsAlpha:imageRef];
190 235 if (hasAlpha) {
191 236 format = SDImageFormatPNG;
192 237 } else {
... ... @@ -211,14 +256,52 @@
211 256 CGImagePropertyOrientation exifOrientation = kCGImagePropertyOrientationUp;
212 257 #endif
213 258 properties[(__bridge NSString *)kCGImagePropertyOrientation] = @(exifOrientation);
  259 + // Encoding Options
214 260 double compressionQuality = 1;
215 261 if (options[SDImageCoderEncodeCompressionQuality]) {
216 262 compressionQuality = [options[SDImageCoderEncodeCompressionQuality] doubleValue];
217 263 }
218 264 properties[(__bridge NSString *)kCGImageDestinationLossyCompressionQuality] = @(compressionQuality);
  265 + CGColorRef backgroundColor = [options[SDImageCoderEncodeBackgroundColor] CGColor];
  266 + if (backgroundColor) {
  267 + properties[(__bridge NSString *)kCGImageDestinationBackgroundColor] = (__bridge id)(backgroundColor);
  268 + }
  269 + CGSize maxPixelSize = CGSizeZero;
  270 + NSValue *maxPixelSizeValue = options[SDImageCoderEncodeMaxPixelSize];
  271 + if (maxPixelSizeValue != nil) {
  272 +#if SD_MAC
  273 + maxPixelSize = maxPixelSizeValue.sizeValue;
  274 +#else
  275 + maxPixelSize = maxPixelSizeValue.CGSizeValue;
  276 +#endif
  277 + }
  278 + NSUInteger pixelWidth = CGImageGetWidth(imageRef);
  279 + NSUInteger pixelHeight = CGImageGetHeight(imageRef);
  280 + if (maxPixelSize.width > 0 && maxPixelSize.height > 0 && pixelWidth > maxPixelSize.width && pixelHeight > maxPixelSize.height) {
  281 + CGFloat pixelRatio = pixelWidth / pixelHeight;
  282 + CGFloat maxPixelSizeRatio = maxPixelSize.width / maxPixelSize.height;
  283 + CGFloat finalPixelSize;
  284 + if (pixelRatio > maxPixelSizeRatio) {
  285 + finalPixelSize = maxPixelSize.width;
  286 + } else {
  287 + finalPixelSize = maxPixelSize.height;
  288 + }
  289 + properties[(__bridge NSString *)kCGImageDestinationImageMaxPixelSize] = @(finalPixelSize);
  290 + }
  291 + NSUInteger maxFileSize = [options[SDImageCoderEncodeMaxFileSize] unsignedIntegerValue];
  292 + if (maxFileSize > 0) {
  293 + properties[kSDCGImageDestinationRequestedFileSize] = @(maxFileSize);
  294 + // Remove the quality if we have file size limit
  295 + properties[(__bridge NSString *)kCGImageDestinationLossyCompressionQuality] = nil;
  296 + }
  297 + BOOL embedThumbnail = NO;
  298 + if (options[SDImageCoderEncodeEmbedThumbnail]) {
  299 + embedThumbnail = [options[SDImageCoderEncodeEmbedThumbnail] boolValue];
  300 + }
  301 + properties[(__bridge NSString *)kCGImageDestinationEmbedThumbnail] = @(embedThumbnail);
219 302  
220 303 // Add your image to the destination.
221   - CGImageDestinationAddImage(imageDestination, image.CGImage, (__bridge CFDictionaryRef)properties);
  304 + CGImageDestinationAddImage(imageDestination, imageRef, (__bridge CFDictionaryRef)properties);
222 305  
223 306 // Finalize the destination.
224 307 if (CGImageDestinationFinalize(imageDestination) == NO) {
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.h
... ... @@ -18,7 +18,7 @@ typedef void(^SDImageLoaderCompletedBlock)(UIImage * _Nullable image, NSData * _
18 18 /**
19 19 A `UIImage` instance from `SDWebImageManager` when you specify `SDWebImageRefreshCached` and image cache hit.
20 20 This can be a hint for image loader to load the image from network and refresh the image from remote location if needed. If the image from remote location does not change, you should call the completion with `SDWebImageErrorCacheNotModified` error. (UIImage)
21   - @note If you don't implement `SDWebImageRefreshCached` support, you do not need to care abot this context option.
  21 + @note If you don't implement `SDWebImageRefreshCached` support, you do not need to care about this context option.
22 22 */
23 23 FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextLoaderCachedImage;
24 24  
... ... @@ -53,16 +53,16 @@ FOUNDATION_EXPORT UIImage * _Nullable SDImageLoaderDecodeProgressiveImageData(NS
53 53 #pragma mark - SDImageLoader
54 54  
55 55 /**
56   - This is the protocol to specify custom image load process. You can create your own class to conform this protocol and use as a image loader to load image from network or any avaiable remote resources defined by yourself.
  56 + This is the protocol to specify custom image load process. You can create your own class to conform this protocol and use as a image loader to load image from network or any available remote resources defined by yourself.
57 57 If you want to implement custom loader for image download from network or local file, you just need to concentrate on image data download only. After the download finish, call `SDImageLoaderDecodeImageData` or `SDImageLoaderDecodeProgressiveImageData` to use the built-in decoding process and produce image (Remember to call in the global queue). And finally callback the completion block.
58   - If you directlly get the image instance using some third-party SDKs, such as image directlly from Photos framework. You can process the image data and image instance by yourself without that built-in decoding process. And finally callback the completion block.
  58 + If you directly get the image instance using some third-party SDKs, such as image directly from Photos framework. You can process the image data and image instance by yourself without that built-in decoding process. And finally callback the completion block.
59 59 @note It's your responsibility to load the image in the desired global queue(to avoid block main queue). We do not dispatch these method call in a global queue but just from the call queue (For `SDWebImageManager`, it typically call from the main queue).
60 60 */
61 61 @protocol SDImageLoader <NSObject>
62 62  
63 63 /**
64 64 Whether current image loader supports to load the provide image URL.
65   - This will be checked everytime a new image request come for loader. If this return NO, we will mark this image load as failed. If return YES, we will start to call `requestImageWithURL:options:context:progress:completed:`.
  65 + This will be checked every time a new image request come for loader. If this return NO, we will mark this image load as failed. If return YES, we will start to call `requestImageWithURL:options:context:progress:completed:`.
66 66  
67 67 @param url The image URL to be loaded.
68 68 @return YES to continue download, NO to stop download.
... ... @@ -88,7 +88,7 @@ FOUNDATION_EXPORT UIImage * _Nullable SDImageLoaderDecodeProgressiveImageData(NS
88 88  
89 89  
90 90 /**
91   - Whether the error from image loader should be marked indded un-recoverable or not.
  91 + Whether the error from image loader should be marked indeed un-recoverable or not.
92 92 If this return YES, failed URL which does not using `SDWebImageRetryFailed` will be blocked into black list. Else not.
93 93  
94 94 @param url The URL represent the image. Note this may not be a HTTP URL
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m
... ... @@ -32,11 +32,32 @@ UIImage * _Nullable SDImageLoaderDecodeImageData(NSData * _Nonnull imageData, NS
32 32 BOOL decodeFirstFrame = SD_OPTIONS_CONTAINS(options, SDWebImageDecodeFirstFrameOnly);
33 33 NSNumber *scaleValue = context[SDWebImageContextImageScaleFactor];
34 34 CGFloat scale = scaleValue.doubleValue >= 1 ? scaleValue.doubleValue : SDImageScaleFactorForKey(cacheKey);
35   - SDImageCoderOptions *coderOptions = @{SDImageCoderDecodeFirstFrameOnly : @(decodeFirstFrame), SDImageCoderDecodeScaleFactor : @(scale)};
36   - if (context) {
37   - SDImageCoderMutableOptions *mutableCoderOptions = [coderOptions mutableCopy];
38   - [mutableCoderOptions setValue:context forKey:SDImageCoderWebImageContext];
39   - coderOptions = [mutableCoderOptions copy];
  35 + NSNumber *preserveAspectRatioValue = context[SDWebImageContextImagePreserveAspectRatio];
  36 + NSValue *thumbnailSizeValue;
  37 + BOOL shouldScaleDown = SD_OPTIONS_CONTAINS(options, SDWebImageScaleDownLargeImages);
  38 + if (shouldScaleDown) {
  39 + CGFloat thumbnailPixels = SDImageCoderHelper.defaultScaleDownLimitBytes / 4;
  40 + CGFloat dimension = ceil(sqrt(thumbnailPixels));
  41 + thumbnailSizeValue = @(CGSizeMake(dimension, dimension));
  42 + }
  43 + if (context[SDWebImageContextImageThumbnailPixelSize]) {
  44 + thumbnailSizeValue = context[SDWebImageContextImageThumbnailPixelSize];
  45 + }
  46 +
  47 + SDImageCoderMutableOptions *mutableCoderOptions = [NSMutableDictionary dictionaryWithCapacity:2];
  48 + mutableCoderOptions[SDImageCoderDecodeFirstFrameOnly] = @(decodeFirstFrame);
  49 + mutableCoderOptions[SDImageCoderDecodeScaleFactor] = @(scale);
  50 + mutableCoderOptions[SDImageCoderDecodePreserveAspectRatio] = preserveAspectRatioValue;
  51 + mutableCoderOptions[SDImageCoderDecodeThumbnailPixelSize] = thumbnailSizeValue;
  52 + mutableCoderOptions[SDImageCoderWebImageContext] = context;
  53 + SDImageCoderOptions *coderOptions = [mutableCoderOptions copy];
  54 +
  55 + // Grab the image coder
  56 + id<SDImageCoder> imageCoder;
  57 + if ([context[SDWebImageContextImageCoder] conformsToProtocol:@protocol(SDImageCoder)]) {
  58 + imageCoder = context[SDWebImageContextImageCoder];
  59 + } else {
  60 + imageCoder = [SDImageCodersManager sharedManager];
40 61 }
41 62  
42 63 if (!decodeFirstFrame) {
... ... @@ -58,7 +79,7 @@ UIImage * _Nullable SDImageLoaderDecodeImageData(NSData * _Nonnull imageData, NS
58 79 }
59 80 }
60 81 if (!image) {
61   - image = [[SDImageCodersManager sharedManager] decodedImageWithData:imageData options:coderOptions];
  82 + image = [imageCoder decodedImageWithData:imageData options:coderOptions];
62 83 }
63 84 if (image) {
64 85 BOOL shouldDecode = !SD_OPTIONS_CONTAINS(options, SDWebImageAvoidDecodeImage);
... ... @@ -71,12 +92,7 @@ UIImage * _Nullable SDImageLoaderDecodeImageData(NSData * _Nonnull imageData, NS
71 92 }
72 93  
73 94 if (shouldDecode) {
74   - BOOL shouldScaleDown = SD_OPTIONS_CONTAINS(options, SDWebImageScaleDownLargeImages);
75   - if (shouldScaleDown) {
76   - image = [SDImageCoderHelper decodedAndScaledDownImageWithImage:image limitBytes:0];
77   - } else {
78   - image = [SDImageCoderHelper decodedImageWithImage:image];
79   - }
  95 + image = [SDImageCoderHelper decodedImageWithImage:image];
80 96 }
81 97 }
82 98  
... ... @@ -99,21 +115,41 @@ UIImage * _Nullable SDImageLoaderDecodeProgressiveImageData(NSData * _Nonnull im
99 115 BOOL decodeFirstFrame = SD_OPTIONS_CONTAINS(options, SDWebImageDecodeFirstFrameOnly);
100 116 NSNumber *scaleValue = context[SDWebImageContextImageScaleFactor];
101 117 CGFloat scale = scaleValue.doubleValue >= 1 ? scaleValue.doubleValue : SDImageScaleFactorForKey(cacheKey);
102   - SDImageCoderOptions *coderOptions = @{SDImageCoderDecodeFirstFrameOnly : @(decodeFirstFrame), SDImageCoderDecodeScaleFactor : @(scale)};
103   - if (context) {
104   - SDImageCoderMutableOptions *mutableCoderOptions = [coderOptions mutableCopy];
105   - [mutableCoderOptions setValue:context forKey:SDImageCoderWebImageContext];
106   - coderOptions = [mutableCoderOptions copy];
  118 + NSNumber *preserveAspectRatioValue = context[SDWebImageContextImagePreserveAspectRatio];
  119 + NSValue *thumbnailSizeValue;
  120 + BOOL shouldScaleDown = SD_OPTIONS_CONTAINS(options, SDWebImageScaleDownLargeImages);
  121 + if (shouldScaleDown) {
  122 + CGFloat thumbnailPixels = SDImageCoderHelper.defaultScaleDownLimitBytes / 4;
  123 + CGFloat dimension = ceil(sqrt(thumbnailPixels));
  124 + thumbnailSizeValue = @(CGSizeMake(dimension, dimension));
  125 + }
  126 + if (context[SDWebImageContextImageThumbnailPixelSize]) {
  127 + thumbnailSizeValue = context[SDWebImageContextImageThumbnailPixelSize];
107 128 }
108 129  
  130 + SDImageCoderMutableOptions *mutableCoderOptions = [NSMutableDictionary dictionaryWithCapacity:2];
  131 + mutableCoderOptions[SDImageCoderDecodeFirstFrameOnly] = @(decodeFirstFrame);
  132 + mutableCoderOptions[SDImageCoderDecodeScaleFactor] = @(scale);
  133 + mutableCoderOptions[SDImageCoderDecodePreserveAspectRatio] = preserveAspectRatioValue;
  134 + mutableCoderOptions[SDImageCoderDecodeThumbnailPixelSize] = thumbnailSizeValue;
  135 + mutableCoderOptions[SDImageCoderWebImageContext] = context;
  136 + SDImageCoderOptions *coderOptions = [mutableCoderOptions copy];
  137 +
  138 + // Grab the progressive image coder
109 139 id<SDProgressiveImageCoder> progressiveCoder = objc_getAssociatedObject(operation, SDImageLoaderProgressiveCoderKey);
110 140 if (!progressiveCoder) {
111   - // We need to create a new instance for progressive decoding to avoid conflicts
112   - for (id<SDImageCoder>coder in [SDImageCodersManager sharedManager].coders.reverseObjectEnumerator) {
113   - if ([coder conformsToProtocol:@protocol(SDProgressiveImageCoder)] &&
114   - [((id<SDProgressiveImageCoder>)coder) canIncrementalDecodeFromData:imageData]) {
115   - progressiveCoder = [[[coder class] alloc] initIncrementalWithOptions:coderOptions];
116   - break;
  141 + id<SDProgressiveImageCoder> imageCoder = context[SDWebImageContextImageCoder];
  142 + // Check the progressive coder if provided
  143 + if ([imageCoder conformsToProtocol:@protocol(SDProgressiveImageCoder)]) {
  144 + progressiveCoder = [[[imageCoder class] alloc] initIncrementalWithOptions:coderOptions];
  145 + } else {
  146 + // We need to create a new instance for progressive decoding to avoid conflicts
  147 + for (id<SDImageCoder> coder in [SDImageCodersManager sharedManager].coders.reverseObjectEnumerator) {
  148 + if ([coder conformsToProtocol:@protocol(SDProgressiveImageCoder)] &&
  149 + [((id<SDProgressiveImageCoder>)coder) canIncrementalDecodeFromData:imageData]) {
  150 + progressiveCoder = [[[coder class] alloc] initIncrementalWithOptions:coderOptions];
  151 + break;
  152 + }
117 153 }
118 154 }
119 155 objc_setAssociatedObject(operation, SDImageLoaderProgressiveCoderKey, progressiveCoder, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.h
... ... @@ -31,7 +31,7 @@
31 31 - (void)addLoader:(nonnull id<SDImageLoader>)loader;
32 32  
33 33 /**
34   - Remove a image loader in the loaders array.
  34 + Remove an image loader in the loaders array.
35 35  
36 36 @param loader loader
37 37 */
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.h
... ... @@ -19,6 +19,16 @@
19 19 FOUNDATION_EXPORT NSString * _Nullable SDTransformedKeyForKey(NSString * _Nullable key, NSString * _Nonnull transformerKey);
20 20  
21 21 /**
  22 + Return the thumbnailed cache key which applied with specify thumbnailSize and preserveAspectRatio control.
  23 + @param key The original cache key
  24 + @param thumbnailPixelSize The thumbnail pixel size
  25 + @param preserveAspectRatio The preserve aspect ratio option
  26 + @return The thumbnailed cache key
  27 + @note If you have both transformer and thumbnail applied for image, call `SDThumbnailedKeyForKey` firstly and then with `SDTransformedKeyForKey`.`
  28 + */
  29 +FOUNDATION_EXPORT NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullable key, CGSize thumbnailPixelSize, BOOL preserveAspectRatio);
  30 +
  31 +/**
22 32 A transformer protocol to transform the image load from cache or from download.
23 33 You can provide transformer to cache and manager (Through the `transformer` property or context option `SDWebImageContextImageTransformer`).
24 34  
... ... @@ -38,10 +48,10 @@ FOUNDATION_EXPORT NSString * _Nullable SDTransformedKeyForKey(NSString * _Nullab
38 48 Transform the image to another image.
39 49  
40 50 @param image The image to be transformed
41   - @param key The cache key associated to the image
  51 + @param key The cache key associated to the image. This arg is a hint for image source, not always useful and should be nullable. In the future we will remove this arg.
42 52 @return The transformed image, or nil if transform failed
43 53 */
44   -- (nullable UIImage *)transformedImageWithImage:(nonnull UIImage *)image forKey:(nonnull NSString *)key;
  54 +- (nullable UIImage *)transformedImageWithImage:(nonnull UIImage *)image forKey:(nonnull NSString *)key API_DEPRECATED("The key arg will be removed in the future. Update your code and don't rely on that.", macos(10.10, API_TO_BE_DEPRECATED), ios(8.0, API_TO_BE_DEPRECATED), tvos(9.0, API_TO_BE_DEPRECATED), watchos(2.0, API_TO_BE_DEPRECATED));
45 55  
46 56 @end
47 57  
... ... @@ -49,7 +59,7 @@ FOUNDATION_EXPORT NSString * _Nullable SDTransformedKeyForKey(NSString * _Nullab
49 59  
50 60 /**
51 61 Pipeline transformer. Which you can bind multiple transformers together to let the image to be transformed one by one in order and generate the final image.
52   - @note Because transformers are lightweight, if you want to append or arrange transfomers, create another pipeline transformer instead. This class is considered as immutable.
  62 + @note Because transformers are lightweight, if you want to append or arrange transformers, create another pipeline transformer instead. This class is considered as immutable.
53 63 */
54 64 @interface SDImagePipelineTransformer : NSObject <SDImageTransformer>
55 65  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.m
... ... @@ -7,7 +7,7 @@
7 7 */
8 8  
9 9 #import "SDImageTransformer.h"
10   -#import "UIColor+HexString.h"
  10 +#import "UIColor+SDHexString.h"
11 11 #if SD_UIKIT || SD_MAC
12 12 #import <CoreImage/CoreImage.h>
13 13 #endif
... ... @@ -38,6 +38,11 @@ NSString * _Nullable SDTransformedKeyForKey(NSString * _Nullable key, NSString *
38 38 }
39 39 }
40 40  
  41 +NSString * _Nullable SDThumbnailedKeyForKey(NSString * _Nullable key, CGSize thumbnailPixelSize, BOOL preserveAspectRatio) {
  42 + NSString *thumbnailKey = [NSString stringWithFormat:@"Thumbnail({%f,%f},%d)", thumbnailPixelSize.width, thumbnailPixelSize.height, preserveAspectRatio];
  43 + return SDTransformedKeyForKey(key, thumbnailKey);
  44 +}
  45 +
41 46 @interface SDImagePipelineTransformer ()
42 47  
43 48 @property (nonatomic, copy, readwrite, nonnull) NSArray<id<SDImageTransformer>> *transformers;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.h
... ... @@ -15,6 +15,7 @@
15 15 @protocol SDMemoryCache <NSObject>
16 16  
17 17 @required
  18 +
18 19 /**
19 20 Create a new memory cache instance with the specify cache config. You can check `maxMemoryCost` and `maxMemoryCount` used for memory cache.
20 21  
... ... @@ -25,7 +26,7 @@
25 26  
26 27 /**
27 28 Returns the value associated with a given key.
28   -
  29 +
29 30 @param key An object identifying the value. If nil, just return nil.
30 31 @return The value associated with key, or nil if no value is associated with key.
31 32 */
... ... @@ -33,7 +34,7 @@
33 34  
34 35 /**
35 36 Sets the value of the specified key in the cache (0 cost).
36   -
  37 +
37 38 @param object The object to be stored in the cache. If nil, it calls `removeObjectForKey:`.
38 39 @param key The key with which to associate the value. If nil, this method has no effect.
39 40 @discussion Unlike an NSMutableDictionary object, a cache does not copy the key
... ... @@ -44,7 +45,7 @@
44 45 /**
45 46 Sets the value of the specified key in the cache, and associates the key-value
46 47 pair with the specified cost.
47   -
  48 +
48 49 @param object The object to store in the cache. If nil, it calls `removeObjectForKey`.
49 50 @param key The key with which to associate the value. If nil, this method has no effect.
50 51 @param cost The cost with which to associate the key-value pair.
... ... @@ -55,7 +56,7 @@
55 56  
56 57 /**
57 58 Removes the value of the specified key in the cache.
58   -
  59 +
59 60 @param key The key identifying the value to be removed. If nil, this method has no effect.
60 61 */
61 62 - (void)removeObjectForKey:(nonnull id)key;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.m
... ... @@ -30,6 +30,7 @@ static void * SDMemoryCacheContext = &amp;SDMemoryCacheContext;
30 30 #if SD_UIKIT
31 31 [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
32 32 #endif
  33 + self.delegate = nil;
33 34 }
34 35  
35 36 - (instancetype)init {
... ... @@ -54,14 +55,14 @@ static void * SDMemoryCacheContext = &amp;SDMemoryCacheContext;
54 55 SDImageCacheConfig *config = self.config;
55 56 self.totalCostLimit = config.maxMemoryCost;
56 57 self.countLimit = config.maxMemoryCount;
57   -
  58 +
58 59 [config addObserver:self forKeyPath:NSStringFromSelector(@selector(maxMemoryCost)) options:0 context:SDMemoryCacheContext];
59 60 [config addObserver:self forKeyPath:NSStringFromSelector(@selector(maxMemoryCount)) options:0 context:SDMemoryCacheContext];
60   -
  61 +
61 62 #if SD_UIKIT
62 63 self.weakCache = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0];
63 64 self.weakCacheLock = dispatch_semaphore_create(1);
64   -
  65 +
65 66 [[NSNotificationCenter defaultCenter] addObserver:self
66 67 selector:@selector(didReceiveMemoryWarning:)
67 68 name:UIApplicationDidReceiveMemoryWarningNotification
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h
... ... @@ -17,6 +17,10 @@ typedef NSData * _Nullable(^SDWebImageCacheSerializerBlock)(UIImage * _Nonnull i
17 17 */
18 18 @protocol SDWebImageCacheSerializer <NSObject>
19 19  
  20 +/// Provide the image data associated to the image and store to disk cache
  21 +/// @param image The loaded image
  22 +/// @param data The original loaded image data
  23 +/// @param imageURL The image URL
20 24 - (nullable NSData *)cacheDataWithImage:(nonnull UIImage *)image originalData:(nullable NSData *)data imageURL:(nullable NSURL *)imageURL;
21 25  
22 26 @end
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.h
... ... @@ -28,7 +28,7 @@ FOUNDATION_EXPORT CGFloat SDImageScaleFactorForKey(NSString * _Nullable key);
28 28 /**
29 29 Scale the image with the scale factor for the specify key. If no need to scale, return the original image.
30 30 This works for `UIImage`(UIKit) or `NSImage`(AppKit). And this function also preserve the associated value in `UIImage+Metadata.h`.
31   - @note This is actually a convenience function, which firstlly call `SDImageScaleFactorForKey` and then call `SDScaledImageForScaleFactor`, kept for backward compatibility.
  31 + @note This is actually a convenience function, which firstly call `SDImageScaleFactorForKey` and then call `SDScaledImageForScaleFactor`, kept for backward compatibility.
32 32  
33 33 @param key The image cache key
34 34 @param image The image
... ... @@ -122,9 +122,12 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
122 122 SDWebImageAvoidAutoSetImage = 1 << 10,
123 123  
124 124 /**
125   - * By default, images are decoded respecting their original size. On iOS, this flag will scale down the
126   - * images to a size compatible with the constrained memory of devices.
127   - * This flag take no effect if `SDWebImageAvoidDecodeImage` is set. And it will be ignored if `SDWebImageProgressiveLoad` is set.
  125 + * By default, images are decoded respecting their original size.
  126 + * This flag will scale down the images to a size compatible with the constrained memory of devices.
  127 + * To control the limit memory bytes, check `SDImageCoderHelper.defaultScaleDownLimitBytes` (Defaults to 60MB on iOS)
  128 + * This will actually translate to use context option `.imageThumbnailPixelSize` from v5.5.0 (Defaults to (3966, 3966) on iOS). Previously does not.
  129 + * This flags effect the progressive and animated images as well from v5.5.0. Previously does not.
  130 + * @note If you need detail controls, it's better to use context option `imageThumbnailPixelSize` and `imagePreserveAspectRatio` instead.
128 131 */
129 132 SDWebImageScaleDownLargeImages = 1 << 11,
130 133  
... ... @@ -168,7 +171,7 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
168 171 SDWebImageAvoidDecodeImage = 1 << 18,
169 172  
170 173 /**
171   - * By default, we decode the animated image. This flag can force decode the first frame only and produece the static image.
  174 + * By default, we decode the animated image. This flag can force decode the first frame only and produce the static image.
172 175 */
173 176 SDWebImageDecodeFirstFrameOnly = 1 << 19,
174 177  
... ... @@ -184,6 +187,20 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {
184 187 * Note this options is not compatible with `SDWebImageDecodeFirstFrameOnly`, which always produce a UIImage/NSImage.
185 188 */
186 189 SDWebImageMatchAnimatedImageClass = 1 << 21,
  190 +
  191 + /**
  192 + * By default, when we load the image from network, the image will be written to the cache (memory and disk, controlled by your `storeCacheType` context option)
  193 + * This maybe an asynchronously operation and the final `SDInternalCompletionBlock` callback does not guarantee the disk cache written is finished and may cause logic error. (For example, you modify the disk data just in completion block, however, the disk cache is not ready)
  194 + * If you need to process with the disk cache in the completion block, you should use this option to ensure the disk cache already been written when callback.
  195 + * Note if you use this when using the custom cache serializer, or using the transformer, we will also wait until the output image data written is finished.
  196 + */
  197 + SDWebImageWaitStoreCache = 1 << 22,
  198 +
  199 + /**
  200 + * We usually don't apply transform on vector images, because vector images supports dynamically changing to any size, rasterize to a fixed size will loss details. To modify vector images, you can process the vector data at runtime (such as modifying PDF tag / SVG element).
  201 + * Use this flag to transform them anyway.
  202 + */
  203 + SDWebImageTransformVectorImage = 1 << 23,
187 204 };
188 205  
189 206  
... ... @@ -196,11 +213,31 @@ FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextSetIma
196 213  
197 214 /**
198 215 A SDWebImageManager instance to control the image download and cache process using in UIImageView+WebCache category and likes. If not provided, use the shared manager (SDWebImageManager *)
  216 + @deprecated Deprecated in the future. This context options can be replaced by other context option control like `.imageCache`, `.imageLoader`, `.imageTransformer` (See below), which already matches all the properties in SDWebImageManager.
199 217 */
200   -FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextCustomManager;
  218 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextCustomManager API_DEPRECATED("Use individual context option like .imageCache, .imageLoader and .imageTransformer instead", macos(10.10, API_TO_BE_DEPRECATED), ios(8.0, API_TO_BE_DEPRECATED), tvos(9.0, API_TO_BE_DEPRECATED), watchos(2.0, API_TO_BE_DEPRECATED));
201 219  
202 220 /**
203   - A id<SDImageTransformer> instance which conforms `SDImageTransformer` protocol. It's used for image transform after the image load finished and store the transformed image to cache. If you provide one, it will ignore the `transformer` in manager and use provided one instead. (id<SDImageTransformer>)
  221 + A id<SDImageCache> instance which conforms to `SDImageCache` protocol. It's used to override the image manager's cache during the image loading pipeline.
  222 + In other word, if you just want to specify a custom cache during image loading, you don't need to re-create a dummy SDWebImageManager instance with the cache. If not provided, use the image manager's cache (id<SDImageCache>)
  223 + */
  224 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImageCache;
  225 +
  226 +/**
  227 + A id<SDImageLoader> instance which conforms to `SDImageLoader` protocol. It's used to override the image manager's loader during the image loading pipeline.
  228 + In other word, if you just want to specify a custom loader during image loading, you don't need to re-create a dummy SDWebImageManager instance with the loader. If not provided, use the image manager's cache (id<SDImageLoader>)
  229 +*/
  230 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImageLoader;
  231 +
  232 +/**
  233 + A id<SDImageCoder> instance which conforms to `SDImageCoder` protocol. It's used to override the default image coder for image decoding(including progressive) and encoding during the image loading process.
  234 + If you use this context option, we will not always use `SDImageCodersManager.shared` to loop through all registered coders and find the suitable one. Instead, we will arbitrarily use the exact provided coder without extra checking (We may not call `canDecodeFromData:`).
  235 + @note This is only useful for cases which you can ensure the loading url matches your coder, or you find it's too hard to write a common coder which can used for generic usage. This will bind the loading url with the coder logic, which is not always a good design, but possible. (id<SDImageCache>)
  236 +*/
  237 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImageCoder;
  238 +
  239 +/**
  240 + A id<SDImageTransformer> instance which conforms `SDImageTransformer` protocol. It's used for image transform after the image load finished and store the transformed image to cache. If you provide one, it will ignore the `transformer` in manager and use provided one instead. If you pass NSNull, the transformer feature will be disabled. (id<SDImageTransformer>)
204 241 */
205 242 FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImageTransformer;
206 243  
... ... @@ -210,6 +247,25 @@ FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImageT
210 247 FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImageScaleFactor;
211 248  
212 249 /**
  250 + A Boolean value indicating whether to keep the original aspect ratio when generating thumbnail images (or bitmap images from vector format).
  251 + Defaults to YES. (NSNumber)
  252 + */
  253 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImagePreserveAspectRatio;
  254 +
  255 +/**
  256 + A CGSize raw value indicating whether or not to generate the thumbnail images (or bitmap images from vector format). When this value is provided, the decoder will generate a thumbnail image which pixel size is smaller than or equal to (depends the `.imagePreserveAspectRatio`) the value size.
  257 + @note When you pass `.preserveAspectRatio == NO`, the thumbnail image is stretched to match each dimension. When `.preserveAspectRatio == YES`, the thumbnail image's width is limited to pixel size's width, the thumbnail image's height is limited to pixel size's height. For common cases, you can just pass a square size to limit both.
  258 + Defaults to CGSizeZero, which means no thumbnail generation at all. (NSValue)
  259 + */
  260 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImageThumbnailPixelSize;
  261 +
  262 +/**
  263 + A SDImageCacheType raw value which specify the source of cache to query. Specify `SDImageCacheTypeDisk` to query from disk cache only; `SDImageCacheTypeMemory` to query from memory only. And `SDImageCacheTypeAll` to query from both memory cache and disk cache. Specify `SDImageCacheTypeNone` is invalid and totally ignore the cache query.
  264 + If not provide or the value is invalid, we will use `SDImageCacheTypeAll`. (NSNumber)
  265 + */
  266 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextQueryCacheType;
  267 +
  268 +/**
213 269 A SDImageCacheType raw value which specify the store cache type when the image has just been downloaded and will be stored to the cache. Specify `SDImageCacheTypeNone` to disable cache storage; `SDImageCacheTypeDisk` to store in disk cache only; `SDImageCacheTypeMemory` to store in memory only. And `SDImageCacheTypeAll` to store in both memory cache and disk cache.
214 270 If you use image transformer feature, this actually apply for the transformed image, but not the original image itself. Use `SDWebImageContextOriginalStoreCacheType` if you want to control the original image's store cache type at the same time.
215 271 If not provide or the value is invalid, we will use `SDImageCacheTypeAll`. (NSNumber)
... ... @@ -217,8 +273,16 @@ FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextImageS
217 273 FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextStoreCacheType;
218 274  
219 275 /**
  276 + The same behavior like `SDWebImageContextQueryCacheType`, but control the query cache type for the original image when you use image transformer feature. This allows the detail control of cache query for these two images. For example, if you want to query the transformed image from both memory/disk cache, query the original image from disk cache only, use `[.queryCacheType : .all, .originalQueryCacheType : .disk]`
  277 + If not provide or the value is invalid, we will use `SDImageCacheTypeNone`, which does not query the original image from cache. (NSNumber)
  278 + @note Which means, if you set this value to not be `.none`, we will query the original image from cache, then do transform with transformer, instead of actual downloading, which can save bandwidth usage.
  279 + */
  280 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextOriginalQueryCacheType;
  281 +
  282 +/**
220 283 The same behavior like `SDWebImageContextStoreCacheType`, but control the store cache type for the original image when you use image transformer feature. This allows the detail control of cache storage for these two images. For example, if you want to store the transformed image into both memory/disk cache, store the original image into disk cache only, use `[.storeCacheType : .all, .originalStoreCacheType : .disk]`
221 284 If not provide or the value is invalid, we will use `SDImageCacheTypeNone`, which does not store the original image into cache. (NSNumber)
  285 + @note This only store the original image, if you want to use the original image without downloading in next query, specify `SDWebImageContextOriginalQueryCacheType` as well.
222 286 */
223 287 FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextOriginalStoreCacheType;
224 288  
... ... @@ -234,6 +298,16 @@ FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextAnimat
234 298 FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextDownloadRequestModifier;
235 299  
236 300 /**
  301 + A id<SDWebImageDownloaderResponseModifier> instance to modify the image download response. It's used for downloader to modify the original response from URL and options. If you provide one, it will ignore the `responseModifier` in downloader and use provided one instead. (id<SDWebImageDownloaderResponseModifier>)
  302 + */
  303 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextDownloadResponseModifier;
  304 +
  305 +/**
  306 + A id<SDWebImageContextDownloadDecryptor> instance to decrypt the image download data. This can be used for image data decryption, such as Base64 encoded image. If you provide one, it will ignore the `decryptor` in downloader and use provided one instead. (id<SDWebImageContextDownloadDecryptor>)
  307 + */
  308 +FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextDownloadDecryptor;
  309 +
  310 +/**
237 311 A id<SDWebImageCacheKeyFilter> instance to convert an URL into a cache key. It's used when manager need cache key to use image cache. If you provide one, it will ignore the `cacheKeyFilter` in manager and use provided one instead. (id<SDWebImageCacheKeyFilter>)
238 312 */
239 313 FOUNDATION_EXPORT SDWebImageContextOption _Nonnull const SDWebImageContextCacheKeyFilter;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.m
... ... @@ -9,6 +9,7 @@
9 9 #import "SDWebImageDefine.h"
10 10 #import "UIImage+Metadata.h"
11 11 #import "NSImage+Compatibility.h"
  12 +#import "SDAssociatedObject.h"
12 13  
13 14 #pragma mark - Image scale
14 15  
... ... @@ -110,8 +111,7 @@ inline UIImage * _Nullable SDScaledImageForScaleFactor(CGFloat scale, UIImage *
110 111 scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:kCGImagePropertyOrientationUp];
111 112 #endif
112 113 }
113   - scaledImage.sd_isIncremental = image.sd_isIncremental;
114   - scaledImage.sd_imageFormat = image.sd_imageFormat;
  114 + SDImageCopyAssociatedObject(image, scaledImage);
115 115  
116 116 return scaledImage;
117 117 }
... ... @@ -120,11 +120,20 @@ inline UIImage * _Nullable SDScaledImageForScaleFactor(CGFloat scale, UIImage *
120 120  
121 121 SDWebImageContextOption const SDWebImageContextSetImageOperationKey = @"setImageOperationKey";
122 122 SDWebImageContextOption const SDWebImageContextCustomManager = @"customManager";
  123 +SDWebImageContextOption const SDWebImageContextImageCache = @"imageCache";
  124 +SDWebImageContextOption const SDWebImageContextImageLoader = @"imageLoader";
  125 +SDWebImageContextOption const SDWebImageContextImageCoder = @"imageCoder";
123 126 SDWebImageContextOption const SDWebImageContextImageTransformer = @"imageTransformer";
124 127 SDWebImageContextOption const SDWebImageContextImageScaleFactor = @"imageScaleFactor";
  128 +SDWebImageContextOption const SDWebImageContextImagePreserveAspectRatio = @"imagePreserveAspectRatio";
  129 +SDWebImageContextOption const SDWebImageContextImageThumbnailPixelSize = @"imageThumbnailPixelSize";
  130 +SDWebImageContextOption const SDWebImageContextQueryCacheType = @"queryCacheType";
125 131 SDWebImageContextOption const SDWebImageContextStoreCacheType = @"storeCacheType";
  132 +SDWebImageContextOption const SDWebImageContextOriginalQueryCacheType = @"originalQueryCacheType";
126 133 SDWebImageContextOption const SDWebImageContextOriginalStoreCacheType = @"originalStoreCacheType";
127 134 SDWebImageContextOption const SDWebImageContextAnimatedImageClass = @"animatedImageClass";
128 135 SDWebImageContextOption const SDWebImageContextDownloadRequestModifier = @"downloadRequestModifier";
  136 +SDWebImageContextOption const SDWebImageContextDownloadResponseModifier = @"downloadResponseModifier";
  137 +SDWebImageContextOption const SDWebImageContextDownloadDecryptor = @"downloadDecryptor";
129 138 SDWebImageContextOption const SDWebImageContextCacheKeyFilter = @"cacheKeyFilter";
130 139 SDWebImageContextOption const SDWebImageContextCacheSerializer = @"cacheSerializer";
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h
... ... @@ -12,6 +12,8 @@
12 12 #import "SDWebImageOperation.h"
13 13 #import "SDWebImageDownloaderConfig.h"
14 14 #import "SDWebImageDownloaderRequestModifier.h"
  15 +#import "SDWebImageDownloaderResponseModifier.h"
  16 +#import "SDWebImageDownloaderDecryptor.h"
15 17 #import "SDImageLoader.h"
16 18  
17 19 /// Downloader options
... ... @@ -76,7 +78,7 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) {
76 78 SDWebImageDownloaderAvoidDecodeImage = 1 << 9,
77 79  
78 80 /**
79   - * By default, we decode the animated image. This flag can force decode the first frame only and produece the static image.
  81 + * By default, we decode the animated image. This flag can force decode the first frame only and produce the static image.
80 82 */
81 83 SDWebImageDownloaderDecodeFirstFrameOnly = 1 << 10,
82 84  
... ... @@ -126,6 +128,11 @@ typedef SDImageLoaderCompletedBlock SDWebImageDownloaderCompletedBlock;
126 128 */
127 129 @property (nonatomic, strong, nullable, readonly) NSURLResponse *response;
128 130  
  131 +/**
  132 + The download's metrics. This will be nil if download operation does not support metrics.
  133 + */
  134 +@property (nonatomic, strong, nullable, readonly) NSURLSessionTaskMetrics *metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
  135 +
129 136 @end
130 137  
131 138  
... ... @@ -142,13 +149,30 @@ typedef SDImageLoaderCompletedBlock SDWebImageDownloaderCompletedBlock;
142 149  
143 150 /**
144 151 * Set the request modifier to modify the original download request before image load.
145   - * This request modifier method will be called for each downloading image request. Return the original request means no modication. Return nil will cancel the download request.
  152 + * This request modifier method will be called for each downloading image request. Return the original request means no modification. Return nil will cancel the download request.
146 153 * Defaults to nil, means does not modify the original download request.
147 154 * @note If you want to modify single request, consider using `SDWebImageContextDownloadRequestModifier` context option.
148 155 */
149 156 @property (nonatomic, strong, nullable) id<SDWebImageDownloaderRequestModifier> requestModifier;
150 157  
151 158 /**
  159 + * Set the response modifier to modify the original download response during image load.
  160 + * This request modifier method will be called for each downloading image response. Return the original response means no modification. Return nil will mark current download as cancelled.
  161 + * Defaults to nil, means does not modify the original download response.
  162 + * @note If you want to modify single response, consider using `SDWebImageContextDownloadResponseModifier` context option.
  163 + */
  164 +@property (nonatomic, strong, nullable) id<SDWebImageDownloaderResponseModifier> responseModifier;
  165 +
  166 +/**
  167 + * Set the decryptor to decrypt the original download data before image decoding. This can be used for encrypted image data, like Base64.
  168 + * This decryptor method will be called for each downloading image data. Return the original data means no modification. Return nil will mark this download failed.
  169 + * Defaults to nil, means does not modify the original download data.
  170 + * @note When using decryptor, progressive decoding will be disabled, to avoid data corrupt issue.
  171 + * @note If you want to decrypt single download data, consider using `SDWebImageContextDownloadDecryptor` context option.
  172 + */
  173 +@property (nonatomic, strong, nullable) id<SDWebImageDownloaderDecryptor> decryptor;
  174 +
  175 +/**
152 176 * The configuration in use by the internal NSURLSession. If you want to provide a custom sessionConfiguration, use `SDWebImageDownloaderConfig.sessionConfiguration` and create a new downloader instance.
153 177 @note This is immutable according to NSURLSession's documentation. Mutating this object directly has no effect.
154 178 */
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m
... ... @@ -24,6 +24,7 @@ static void * SDWebImageDownloaderContext = &amp;SDWebImageDownloaderContext;
24 24 @property (nonatomic, strong, nullable, readwrite) NSURL *url;
25 25 @property (nonatomic, strong, nullable, readwrite) NSURLRequest *request;
26 26 @property (nonatomic, strong, nullable, readwrite) NSURLResponse *response;
  27 +@property (nonatomic, strong, nullable, readwrite) NSURLSessionTaskMetrics *metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
27 28 @property (nonatomic, weak, nullable, readwrite) id downloadOperationCancelToken;
28 29 @property (nonatomic, weak, nullable) NSOperation<SDWebImageDownloaderOperation> *downloadOperation;
29 30 @property (nonatomic, assign, getter=isCancelled) BOOL cancelled;
... ... @@ -226,10 +227,11 @@ static void * SDWebImageDownloaderContext = &amp;SDWebImageDownloaderContext;
226 227 SD_UNLOCK(self.operationsLock);
227 228 };
228 229 self.URLOperations[url] = operation;
  230 + // Add the handlers before submitting to operation queue, avoid the race condition that operation finished before setting handlers.
  231 + downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock];
229 232 // Add operation to operation queue only after all configuration done according to Apple's doc.
230 233 // `addOperation:` does not synchronously execute the `operation.completionBlock` so this will not cause deadlock.
231 234 [self.downloadQueue addOperation:operation];
232   - downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock];
233 235 } else {
234 236 // When we reuse the download operation to attach more callbacks, there may be thread safe issue because the getter of callbacks may in another queue (decoding queue or delegate queue)
235 237 // So we lock the operation here, and in `SDWebImageDownloaderOperation`, we use `@synchonzied (self)`, to ensure the thread safe between these two classes.
... ... @@ -272,6 +274,16 @@ static void * SDWebImageDownloaderContext = &amp;SDWebImageDownloaderContext;
272 274 SD_LOCK(self.HTTPHeadersLock);
273 275 mutableRequest.allHTTPHeaderFields = self.HTTPHeaders;
274 276 SD_UNLOCK(self.HTTPHeadersLock);
  277 +
  278 + // Context Option
  279 + SDWebImageMutableContext *mutableContext;
  280 + if (context) {
  281 + mutableContext = [context mutableCopy];
  282 + } else {
  283 + mutableContext = [NSMutableDictionary dictionary];
  284 + }
  285 +
  286 + // Request Modifier
275 287 id<SDWebImageDownloaderRequestModifier> requestModifier;
276 288 if ([context valueForKey:SDWebImageContextDownloadRequestModifier]) {
277 289 requestModifier = [context valueForKey:SDWebImageContextDownloadRequestModifier];
... ... @@ -291,6 +303,30 @@ static void * SDWebImageDownloaderContext = &amp;SDWebImageDownloaderContext;
291 303 } else {
292 304 request = [mutableRequest copy];
293 305 }
  306 + // Response Modifier
  307 + id<SDWebImageDownloaderResponseModifier> responseModifier;
  308 + if ([context valueForKey:SDWebImageContextDownloadResponseModifier]) {
  309 + responseModifier = [context valueForKey:SDWebImageContextDownloadResponseModifier];
  310 + } else {
  311 + responseModifier = self.responseModifier;
  312 + }
  313 + if (responseModifier) {
  314 + mutableContext[SDWebImageContextDownloadResponseModifier] = responseModifier;
  315 + }
  316 + // Decryptor
  317 + id<SDWebImageDownloaderDecryptor> decryptor;
  318 + if ([context valueForKey:SDWebImageContextDownloadDecryptor]) {
  319 + decryptor = [context valueForKey:SDWebImageContextDownloadDecryptor];
  320 + } else {
  321 + decryptor = self.decryptor;
  322 + }
  323 + if (decryptor) {
  324 + mutableContext[SDWebImageContextDownloadDecryptor] = decryptor;
  325 + }
  326 +
  327 + context = [mutableContext copy];
  328 +
  329 + // Operation Class
294 330 Class operationClass = self.config.operationClass;
295 331 if (operationClass && [operationClass isSubclassOfClass:[NSOperation class]] && [operationClass conformsToProtocol:@protocol(SDWebImageDownloaderOperation)]) {
296 332 // Custom operation class
... ... @@ -369,7 +405,12 @@ static void * SDWebImageDownloaderContext = &amp;SDWebImageDownloaderContext;
369 405 NSOperation<SDWebImageDownloaderOperation> *returnOperation = nil;
370 406 for (NSOperation<SDWebImageDownloaderOperation> *operation in self.downloadQueue.operations) {
371 407 if ([operation respondsToSelector:@selector(dataTask)]) {
372   - if (operation.dataTask.taskIdentifier == task.taskIdentifier) {
  408 + // So we lock the operation here, and in `SDWebImageDownloaderOperation`, we use `@synchonzied (self)`, to ensure the thread safe between these two classes.
  409 + NSURLSessionTask *operationTask;
  410 + @synchronized (operation) {
  411 + operationTask = operation.dataTask;
  412 + }
  413 + if (operationTask.taskIdentifier == task.taskIdentifier) {
373 414 returnOperation = operation;
374 415 break;
375 416 }
... ... @@ -458,30 +499,52 @@ didReceiveResponse:(NSURLResponse *)response
458 499 }
459 500 }
460 501  
  502 +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)) {
  503 +
  504 + // Identify the operation that runs this task and pass it the delegate method
  505 + NSOperation<SDWebImageDownloaderOperation> *dataOperation = [self operationWithTask:task];
  506 + if ([dataOperation respondsToSelector:@selector(URLSession:task:didFinishCollectingMetrics:)]) {
  507 + [dataOperation URLSession:session task:task didFinishCollectingMetrics:metrics];
  508 + }
  509 +}
  510 +
461 511 @end
462 512  
463 513 @implementation SDWebImageDownloadToken
464 514  
465 515 - (void)dealloc {
466 516 [[NSNotificationCenter defaultCenter] removeObserver:self name:SDWebImageDownloadReceiveResponseNotification object:nil];
  517 + [[NSNotificationCenter defaultCenter] removeObserver:self name:SDWebImageDownloadStopNotification object:nil];
467 518 }
468 519  
469 520 - (instancetype)initWithDownloadOperation:(NSOperation<SDWebImageDownloaderOperation> *)downloadOperation {
470 521 self = [super init];
471 522 if (self) {
472 523 _downloadOperation = downloadOperation;
473   - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadReceiveResponse:) name:SDWebImageDownloadReceiveResponseNotification object:downloadOperation];
  524 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadDidReceiveResponse:) name:SDWebImageDownloadReceiveResponseNotification object:downloadOperation];
  525 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(downloadDidStop:) name:SDWebImageDownloadStopNotification object:downloadOperation];
474 526 }
475 527 return self;
476 528 }
477 529  
478   -- (void)downloadReceiveResponse:(NSNotification *)notification {
  530 +- (void)downloadDidReceiveResponse:(NSNotification *)notification {
479 531 NSOperation<SDWebImageDownloaderOperation> *downloadOperation = notification.object;
480 532 if (downloadOperation && downloadOperation == self.downloadOperation) {
481 533 self.response = downloadOperation.response;
482 534 }
483 535 }
484 536  
  537 +- (void)downloadDidStop:(NSNotification *)notification {
  538 + NSOperation<SDWebImageDownloaderOperation> *downloadOperation = notification.object;
  539 + if (downloadOperation && downloadOperation == self.downloadOperation) {
  540 + if ([downloadOperation respondsToSelector:@selector(metrics)]) {
  541 + if (@available(iOS 10.0, tvOS 10.0, macOS 10.12, watchOS 3.0, *)) {
  542 + self.metrics = downloadOperation.metrics;
  543 + }
  544 + }
  545 + }
  546 +}
  547 +
485 548 - (void)cancel {
486 549 @synchronized (self) {
487 550 if (self.isCancelled) {
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h
... ... @@ -91,7 +91,7 @@ typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) {
91 91  
92 92 /**
93 93 * Set password using for HTTP Basic authentication.
94   - * Defautls to nil.
  94 + * Defaults to nil.
95 95 */
96 96 @property (nonatomic, copy, nullable) NSString *password;
97 97  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.h
... ... @@ -36,6 +36,7 @@
36 36  
37 37 @optional
38 38 @property (strong, nonatomic, readonly, nullable) NSURLSessionTask *dataTask;
  39 +@property (strong, nonatomic, readonly, nullable) NSURLSessionTaskMetrics *metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
39 40 @property (strong, nonatomic, nullable) NSURLCredential *credential;
40 41 @property (assign, nonatomic) double minimumProgressInterval;
41 42  
... ... @@ -63,6 +64,12 @@
63 64 @property (strong, nonatomic, readonly, nullable) NSURLSessionTask *dataTask;
64 65  
65 66 /**
  67 + * The collected metrics from `-URLSession:task:didFinishCollectingMetrics:`.
  68 + * This can be used to collect the network metrics like download duration, DNS lookup duration, SSL handshake duration, etc. See Apple's documentation: https://developer.apple.com/documentation/foundation/urlsessiontaskmetrics
  69 + */
  70 +@property (strong, nonatomic, readonly, nullable) NSURLSessionTaskMetrics *metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
  71 +
  72 +/**
66 73 * The credential used for authentication challenges in `-URLSession:task:didReceiveChallenge:completionHandler:`.
67 74 *
68 75 * This will be overridden by any shared credentials that exist for the username or password of the request URL, if present.
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m
... ... @@ -9,6 +9,8 @@
9 9 #import "SDWebImageDownloaderOperation.h"
10 10 #import "SDWebImageError.h"
11 11 #import "SDInternalMacros.h"
  12 +#import "SDWebImageDownloaderResponseModifier.h"
  13 +#import "SDWebImageDownloaderDecryptor.h"
12 14  
13 15 // iOS 8 Foundation.framework extern these symbol but the define is in CFNetwork.framework. We just fix this without import CFNetwork.framework
14 16 #if ((__IPHONE_OS_VERSION_MIN_REQUIRED && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_9_0) || (__MAC_OS_X_VERSION_MIN_REQUIRED && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_11))
... ... @@ -39,6 +41,9 @@ typedef NSMutableDictionary&lt;NSString *, id&gt; SDCallbacksDictionary;
39 41 @property (strong, nonatomic, nullable) NSError *responseError;
40 42 @property (assign, nonatomic) double previousProgress; // previous progress percent
41 43  
  44 +@property (strong, nonatomic, nullable) id<SDWebImageDownloaderResponseModifier> responseModifier; // modify original URLResponse
  45 +@property (strong, nonatomic, nullable) id<SDWebImageDownloaderDecryptor> decryptor; // decrypt image data
  46 +
42 47 // This is weak because it is injected by whoever manages this session. If this gets nil-ed out, we won't be able to run
43 48 // the task associated with this operation
44 49 @property (weak, nonatomic, nullable) NSURLSession *unownedSession;
... ... @@ -47,7 +52,9 @@ typedef NSMutableDictionary&lt;NSString *, id&gt; SDCallbacksDictionary;
47 52  
48 53 @property (strong, nonatomic, readwrite, nullable) NSURLSessionTask *dataTask;
49 54  
50   -@property (strong, nonatomic, nonnull) dispatch_queue_t coderQueue; // the queue to do image decoding
  55 +@property (strong, nonatomic, readwrite, nullable) NSURLSessionTaskMetrics *metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
  56 +
  57 +@property (strong, nonatomic, nonnull) NSOperationQueue *coderQueue; // the serial operation queue to do image decoding
51 58 #if SD_UIKIT
52 59 @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId;
53 60 #endif
... ... @@ -76,11 +83,14 @@ typedef NSMutableDictionary&lt;NSString *, id&gt; SDCallbacksDictionary;
76 83 _options = options;
77 84 _context = [context copy];
78 85 _callbackBlocks = [NSMutableArray new];
  86 + _responseModifier = context[SDWebImageContextDownloadResponseModifier];
  87 + _decryptor = context[SDWebImageContextDownloadDecryptor];
79 88 _executing = NO;
80 89 _finished = NO;
81 90 _expectedSize = 0;
82 91 _unownedSession = session;
83   - _coderQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderOperationCoderQueue", DISPATCH_QUEUE_SERIAL);
  92 + _coderQueue = [NSOperationQueue new];
  93 + _coderQueue.maxConcurrentOperationCount = 1;
84 94 #if SD_UIKIT
85 95 _backgroundTaskId = UIBackgroundTaskInvalid;
86 96 #endif
... ... @@ -131,7 +141,7 @@ typedef NSMutableDictionary&lt;NSString *, id&gt; SDCallbacksDictionary;
131 141 SDWebImageDownloaderCompletedBlock completedBlock = [token valueForKey:kCompletedCallbackKey];
132 142 dispatch_main_async_safe(^{
133 143 if (completedBlock) {
134   - completedBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:nil], YES);
  144 + completedBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during sending the request"}], YES);
135 145 }
136 146 });
137 147 }
... ... @@ -143,7 +153,7 @@ typedef NSMutableDictionary&lt;NSString *, id&gt; SDCallbacksDictionary;
143 153 if (self.isCancelled) {
144 154 self.finished = YES;
145 155 // Operation cancelled by user before sending the request
146   - [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:nil]];
  156 + [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user before sending the request"}]];
147 157 [self reset];
148 158 return;
149 159 }
... ... @@ -198,8 +208,13 @@ typedef NSMutableDictionary&lt;NSString *, id&gt; SDCallbacksDictionary;
198 208 if (self.dataTask) {
199 209 if (self.options & SDWebImageDownloaderHighPriority) {
200 210 self.dataTask.priority = NSURLSessionTaskPriorityHigh;
  211 + self.coderQueue.qualityOfService = NSQualityOfServiceUserInteractive;
201 212 } else if (self.options & SDWebImageDownloaderLowPriority) {
202 213 self.dataTask.priority = NSURLSessionTaskPriorityLow;
  214 + self.coderQueue.qualityOfService = NSQualityOfServiceBackground;
  215 + } else {
  216 + self.dataTask.priority = NSURLSessionTaskPriorityDefault;
  217 + self.coderQueue.qualityOfService = NSQualityOfServiceDefault;
203 218 }
204 219 [self.dataTask resume];
205 220 for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) {
... ... @@ -236,9 +251,10 @@ typedef NSMutableDictionary&lt;NSString *, id&gt; SDCallbacksDictionary;
236 251 // maintain the isFinished and isExecuting flags.
237 252 if (self.isExecuting) self.executing = NO;
238 253 if (!self.isFinished) self.finished = YES;
  254 + } else {
  255 + // Operation cancelled by user during sending the request
  256 + [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during sending the request"}]];
239 257 }
240   - // Operation cancelled by user before sending the request
241   - [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:nil]];
242 258  
243 259 [self reset];
244 260 }
... ... @@ -293,20 +309,34 @@ typedef NSMutableDictionary&lt;NSString *, id&gt; SDCallbacksDictionary;
293 309 didReceiveResponse:(NSURLResponse *)response
294 310 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
295 311 NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow;
  312 +
  313 + // Check response modifier, if return nil, will marked as cancelled.
  314 + BOOL valid = YES;
  315 + if (self.responseModifier && response) {
  316 + response = [self.responseModifier modifiedResponseWithResponse:response];
  317 + if (!response) {
  318 + valid = NO;
  319 + self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorInvalidDownloadResponse userInfo:@{NSLocalizedDescriptionKey : @"Download marked as failed because response is nil"}];
  320 + }
  321 + }
  322 +
296 323 NSInteger expected = (NSInteger)response.expectedContentLength;
297 324 expected = expected > 0 ? expected : 0;
298 325 self.expectedSize = expected;
299 326 self.response = response;
  327 +
300 328 NSInteger statusCode = [response respondsToSelector:@selector(statusCode)] ? ((NSHTTPURLResponse *)response).statusCode : 200;
301   - BOOL valid = statusCode >= 200 && statusCode < 400;
302   - if (!valid) {
303   - self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorInvalidDownloadStatusCode userInfo:@{SDWebImageErrorDownloadStatusCodeKey : @(statusCode)}];
  329 + // Status code should between [200,400)
  330 + BOOL statusCodeValid = statusCode >= 200 && statusCode < 400;
  331 + if (!statusCodeValid) {
  332 + valid = NO;
  333 + self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorInvalidDownloadStatusCode userInfo:@{NSLocalizedDescriptionKey : @"Download marked as failed because response status code is not in 200-400", SDWebImageErrorDownloadStatusCodeKey : @(statusCode)}];
304 334 }
305 335 //'304 Not Modified' is an exceptional one
306 336 //URLSession current behavior will return 200 status code when the server respond 304 and URLCache hit. But this is not a standard behavior and we just add a check
307 337 if (statusCode == 304 && !self.cachedData) {
308 338 valid = NO;
309   - self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCacheNotModified userInfo:nil];
  339 + self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCacheNotModified userInfo:@{NSLocalizedDescriptionKey : @"Download response status code is 304 not modified and ignored"}];
310 340 }
311 341  
312 342 if (valid) {
... ... @@ -353,22 +383,25 @@ didReceiveResponse:(NSURLResponse *)response
353 383 return;
354 384 }
355 385 self.previousProgress = currentProgress;
356   -
357   - if (self.options & SDWebImageDownloaderProgressiveLoad) {
  386 +
  387 + // Using data decryptor will disable the progressive decoding, since there are no support for progressive decrypt
  388 + BOOL supportProgressive = (self.options & SDWebImageDownloaderProgressiveLoad) && !self.decryptor;
  389 + if (supportProgressive) {
358 390 // Get the image data
359 391 NSData *imageData = [self.imageData copy];
360 392  
361   - // progressive decode the image in coder queue
362   - dispatch_async(self.coderQueue, ^{
363   - @autoreleasepool {
  393 + // keep maximum one progressive decode process during download
  394 + if (self.coderQueue.operationCount == 0) {
  395 + // NSOperation have autoreleasepool, don't need to create extra one
  396 + [self.coderQueue addOperationWithBlock:^{
364 397 UIImage *image = SDImageLoaderDecodeProgressiveImageData(imageData, self.request.URL, finished, self, [[self class] imageOptionsFromDownloaderOptions:self.options], self.context);
365 398 if (image) {
366 399 // We do not keep the progressive decoding image even when `finished`=YES. Because they are for view rendering but not take full function from downloader options. And some coders implementation may not keep consistent between progressive decoding and normal decoding.
367 400  
368 401 [self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO];
369 402 }
370   - }
371   - });
  403 + }];
  404 + }
372 405 }
373 406  
374 407 for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) {
... ... @@ -421,29 +454,33 @@ didReceiveResponse:(NSURLResponse *)response
421 454 if ([self callbacksForKey:kCompletedCallbackKey].count > 0) {
422 455 NSData *imageData = [self.imageData copy];
423 456 self.imageData = nil;
  457 + // data decryptor
  458 + if (imageData && self.decryptor) {
  459 + imageData = [self.decryptor decryptedDataWithData:imageData response:self.response];
  460 + }
424 461 if (imageData) {
425 462 /** if you specified to only use cached data via `SDWebImageDownloaderIgnoreCachedResponse`,
426 463 * then we should check if the cached data is equal to image data
427 464 */
428 465 if (self.options & SDWebImageDownloaderIgnoreCachedResponse && [self.cachedData isEqualToData:imageData]) {
429   - self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCacheNotModified userInfo:nil];
  466 + self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCacheNotModified userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image is not modified and ignored"}];
430 467 // call completion block with not modified error
431 468 [self callCompletionBlocksWithError:self.responseError];
432 469 [self done];
433 470 } else {
434   - // decode the image in coder queue
435   - dispatch_async(self.coderQueue, ^{
436   - @autoreleasepool {
437   - UIImage *image = SDImageLoaderDecodeImageData(imageData, self.request.URL, [[self class] imageOptionsFromDownloaderOptions:self.options], self.context);
438   - CGSize imageSize = image.size;
439   - if (imageSize.width == 0 || imageSize.height == 0) {
440   - [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}]];
441   - } else {
442   - [self callCompletionBlocksWithImage:image imageData:imageData error:nil finished:YES];
443   - }
444   - [self done];
  471 + // decode the image in coder queue, cancel all previous decoding process
  472 + [self.coderQueue cancelAllOperations];
  473 + [self.coderQueue addOperationWithBlock:^{
  474 + UIImage *image = SDImageLoaderDecodeImageData(imageData, self.request.URL, [[self class] imageOptionsFromDownloaderOptions:self.options], self.context);
  475 + CGSize imageSize = image.size;
  476 + if (imageSize.width == 0 || imageSize.height == 0) {
  477 + NSString *description = image == nil ? @"Downloaded image decode failed" : @"Downloaded image has 0 pixels";
  478 + [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : description}]];
  479 + } else {
  480 + [self callCompletionBlocksWithImage:image imageData:imageData error:nil finished:YES];
445 481 }
446   - });
  482 + [self done];
  483 + }];
447 484 }
448 485 } else {
449 486 [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}]];
... ... @@ -485,6 +522,10 @@ didReceiveResponse:(NSURLResponse *)response
485 522 }
486 523 }
487 524  
  525 +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)) {
  526 + self.metrics = metrics;
  527 +}
  528 +
488 529 #pragma mark Helper methods
489 530 + (SDWebImageOptions)imageOptionsFromDownloaderOptions:(SDWebImageDownloaderOptions)downloadOptions {
490 531 SDWebImageOptions options = 0;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h
... ... @@ -17,6 +17,9 @@ typedef NSURLRequest * _Nullable (^SDWebImageDownloaderRequestModifierBlock)(NSU
17 17 */
18 18 @protocol SDWebImageDownloaderRequestModifier <NSObject>
19 19  
  20 +/// Modify the original URL request and return a new one instead. You can modify the HTTP header, cachePolicy, etc for this URL.
  21 +/// @param request The original URL request for image loading
  22 +/// @note If return nil, the URL request will be cancelled.
20 23 - (nullable NSURLRequest *)modifiedRequestWithRequest:(nonnull NSURLRequest *)request;
21 24  
22 25 @end
... ... @@ -26,7 +29,41 @@ typedef NSURLRequest * _Nullable (^SDWebImageDownloaderRequestModifierBlock)(NSU
26 29 */
27 30 @interface SDWebImageDownloaderRequestModifier : NSObject <SDWebImageDownloaderRequestModifier>
28 31  
  32 +/// Create the request modifier with block
  33 +/// @param block A block to control modifier logic
29 34 - (nonnull instancetype)initWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
  35 +
  36 +/// Create the request modifier with block
  37 +/// @param block A block to control modifier logic
30 38 + (nonnull instancetype)requestModifierWithBlock:(nonnull SDWebImageDownloaderRequestModifierBlock)block;
31 39  
32 40 @end
  41 +
  42 +/**
  43 +A convenient request modifier to provide the HTTP request including HTTP Method, Headers and Body.
  44 +*/
  45 +@interface SDWebImageDownloaderRequestModifier (Conveniences)
  46 +
  47 +/// Create the request modifier with HTTP Method.
  48 +/// @param method HTTP Method, nil means to GET.
  49 +/// @note This is for convenience, if you need code to control the logic, use block API instead.
  50 +- (nonnull instancetype)initWithMethod:(nullable NSString *)method;
  51 +
  52 +/// Create the request modifier with HTTP Headers.
  53 +/// @param headers HTTP Headers. Case insensitive according to HTTP/1.1(HTTP/2) standard. The headers will override the same fields from original request.
  54 +/// @note This is for convenience, if you need code to control the logic, use block API instead.
  55 +- (nonnull instancetype)initWithHeaders:(nullable NSDictionary<NSString *, NSString *> *)headers;
  56 +
  57 +/// Create the request modifier with HTTP Body.
  58 +/// @param body HTTP Body.
  59 +/// @note This is for convenience, if you need code to control the logic, use block API instead.
  60 +- (nonnull instancetype)initWithBody:(nullable NSData *)body;
  61 +
  62 +/// Create the request modifier with HTTP Method, Headers and Body.
  63 +/// @param method HTTP Method, nil means to GET.
  64 +/// @param headers HTTP Headers. Case insensitive according to HTTP/1.1(HTTP/2) standard. The headers will override the same fields from original request.
  65 +/// @param body HTTP Body.
  66 +/// @note This is for convenience, if you need code to control the logic, use block API instead.
  67 +- (nonnull instancetype)initWithMethod:(nullable NSString *)method headers:(nullable NSDictionary<NSString *, NSString *> *)headers body:(nullable NSData *)body;
  68 +
  69 +@end
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m
... ... @@ -37,3 +37,35 @@
37 37 }
38 38  
39 39 @end
  40 +
  41 +@implementation SDWebImageDownloaderRequestModifier (Conveniences)
  42 +
  43 +- (instancetype)initWithMethod:(NSString *)method {
  44 + return [self initWithMethod:method headers:nil body:nil];
  45 +}
  46 +
  47 +- (instancetype)initWithHeaders:(NSDictionary<NSString *,NSString *> *)headers {
  48 + return [self initWithMethod:nil headers:headers body:nil];
  49 +}
  50 +
  51 +- (instancetype)initWithBody:(NSData *)body {
  52 + return [self initWithMethod:nil headers:nil body:body];
  53 +}
  54 +
  55 +- (instancetype)initWithMethod:(NSString *)method headers:(NSDictionary<NSString *,NSString *> *)headers body:(NSData *)body {
  56 + method = method ? [method copy] : @"GET";
  57 + headers = [headers copy];
  58 + body = [body copy];
  59 + return [self initWithBlock:^NSURLRequest * _Nullable(NSURLRequest * _Nonnull request) {
  60 + NSMutableURLRequest *mutableRequest = [request mutableCopy];
  61 + mutableRequest.HTTPMethod = method;
  62 + mutableRequest.HTTPBody = body;
  63 + for (NSString *header in headers) {
  64 + NSString *value = headers[header];
  65 + [mutableRequest setValue:value forHTTPHeaderField:header];
  66 + }
  67 + return [mutableRequest copy];
  68 + }];
  69 +}
  70 +
  71 +@end
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h
... ... @@ -19,7 +19,9 @@ typedef NS_ERROR_ENUM(SDWebImageErrorDomain, SDWebImageError) {
19 19 SDWebImageErrorInvalidURL = 1000, // The URL is invalid, such as nil URL or corrupted URL
20 20 SDWebImageErrorBadImageData = 1001, // The image data can not be decoded to image, or the image data is empty
21 21 SDWebImageErrorCacheNotModified = 1002, // The remote location specify that the cached image is not modified, such as the HTTP response 304 code. It's useful for `SDWebImageRefreshCached`
  22 + SDWebImageErrorBlackListed = 1003, // The URL is blacklisted because of unrecoverable failure marked by downloader (such as 404), you can use `.retryFailed` option to avoid this
22 23 SDWebImageErrorInvalidDownloadOperation = 2000, // The image download operation is invalid, such as nil operation or unexpected error occur when operation initialized
23 24 SDWebImageErrorInvalidDownloadStatusCode = 2001, // The image download response a invalid status code. You can check the status code in error's userInfo under `SDWebImageErrorDownloadStatusCodeKey`
24 25 SDWebImageErrorCancelled = 2002, // The image loading operation is cancelled before finished, during either async disk cache query, or waiting before actual network request. For actual network request error, check `NSURLErrorDomain` error domain and code.
  26 + SDWebImageErrorInvalidDownloadResponse = 2003, // When using response modifier, the modified download response is nil and marked as failed.
25 27 };
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.h
... ... @@ -87,7 +87,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager];
87 87 [manager loadImageWithURL:imageURL
88 88 options:0
89 89 progress:nil
90   - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
  90 + completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
91 91 if (image) {
92 92 // do something with image
93 93 }
... ... @@ -98,7 +98,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager];
98 98 @interface SDWebImageManager : NSObject
99 99  
100 100 /**
101   - * The delegate for manager. Defatuls to nil.
  101 + * The delegate for manager. Defaults to nil.
102 102 */
103 103 @property (weak, nonatomic, nullable) id <SDWebImageManagerDelegate> delegate;
104 104  
... ... @@ -136,8 +136,8 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager];
136 136  
137 137 /**
138 138 * The cache serializer is used to convert the decoded image, the source downloaded data, to the actual data used for storing to the disk cache. If you return nil, means to generate the data from the image instance, see `SDImageCache`.
139   - * For example, if you are using WebP images and facing the slow decoding time issue when later retriving from disk cache again. You can try to encode the decoded image to JPEG/PNG format to disk cache instead of source downloaded data.
140   - * @note The `image` arg is nonnull, but when you also provide a image transformer and the image is transformed, the `data` arg may be nil, take attention to this case.
  139 + * For example, if you are using WebP images and facing the slow decoding time issue when later retrieving from disk cache again. You can try to encode the decoded image to JPEG/PNG format to disk cache instead of source downloaded data.
  140 + * @note The `image` arg is nonnull, but when you also provide an image transformer and the image is transformed, the `data` arg may be nil, take attention to this case.
141 141 * @note This method is called from a global queue in order to not to block the main thread.
142 142 * @code
143 143 SDWebImageManager.sharedManager.cacheSerializer = [SDWebImageCacheSerializer cacheSerializerWithBlock:^NSData * _Nullable(UIImage * _Nonnull image, NSData * _Nullable data, NSURL * _Nullable imageURL) {
... ... @@ -225,7 +225,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager];
225 225 * The forth parameter is an `SDImageCacheType` enum indicating if the image was retrieved from the local cache
226 226 * or from the memory cache or from the network.
227 227 *
228   - * The fith parameter is set to NO when the SDWebImageProgressiveLoad option is used and the image is
  228 + * The fifth parameter is set to NO when the SDWebImageProgressiveLoad option is used and the image is
229 229 * downloading. This block is thus called repeatedly with a partial image. When image is fully downloaded, the
230 230 * block is called a last time with the full image and the last parameter set to YES.
231 231 *
... ... @@ -262,8 +262,26 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager];
262 262 - (void)cancelAll;
263 263  
264 264 /**
265   - * Return the cache key for a given URL
  265 + * Remove the specify URL from failed black list.
  266 + * @param url The failed URL.
  267 + */
  268 +- (void)removeFailedURL:(nonnull NSURL *)url;
  269 +
  270 +/**
  271 + * Remove all the URL from failed black list.
  272 + */
  273 +- (void)removeAllFailedURLs;
  274 +
  275 +/**
  276 + * Return the cache key for a given URL, does not considerate transformer or thumbnail.
  277 + * @note This method does not have context option, only use the url and manager level cacheKeyFilter to generate the cache key.
266 278 */
267 279 - (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url;
268 280  
  281 +/**
  282 + * Return the cache key for a given URL and context option.
  283 + * @note The context option like `.thumbnailPixelSize` and `.imageTransformer` will effect the generated cache key, using this if you have those context associated.
  284 +*/
  285 +- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url context:(nullable SDWebImageContext *)context;
  286 +
269 287 @end
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.m
... ... @@ -10,6 +10,7 @@
10 10 #import "SDImageCache.h"
11 11 #import "SDWebImageDownloader.h"
12 12 #import "UIImage+Metadata.h"
  13 +#import "SDAssociatedObject.h"
13 14 #import "SDWebImageError.h"
14 15 #import "SDInternalMacros.h"
15 16  
... ... @@ -94,19 +95,69 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
94 95 }
95 96  
96 97 - (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url {
97   - return [self cacheKeyForURL:url cacheKeyFilter:self.cacheKeyFilter];
  98 + if (!url) {
  99 + return @"";
  100 + }
  101 +
  102 + NSString *key;
  103 + // Cache Key Filter
  104 + id<SDWebImageCacheKeyFilter> cacheKeyFilter = self.cacheKeyFilter;
  105 + if (cacheKeyFilter) {
  106 + key = [cacheKeyFilter cacheKeyForURL:url];
  107 + } else {
  108 + key = url.absoluteString;
  109 + }
  110 +
  111 + return key;
98 112 }
99 113  
100   -- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url cacheKeyFilter:(id<SDWebImageCacheKeyFilter>)cacheKeyFilter {
  114 +- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url context:(nullable SDWebImageContext *)context {
101 115 if (!url) {
102 116 return @"";
103 117 }
104   -
  118 +
  119 + NSString *key;
  120 + // Cache Key Filter
  121 + id<SDWebImageCacheKeyFilter> cacheKeyFilter = self.cacheKeyFilter;
  122 + if (context[SDWebImageContextCacheKeyFilter]) {
  123 + cacheKeyFilter = context[SDWebImageContextCacheKeyFilter];
  124 + }
105 125 if (cacheKeyFilter) {
106   - return [cacheKeyFilter cacheKeyForURL:url];
  126 + key = [cacheKeyFilter cacheKeyForURL:url];
107 127 } else {
108   - return url.absoluteString;
  128 + key = url.absoluteString;
109 129 }
  130 +
  131 + // Thumbnail Key Appending
  132 + NSValue *thumbnailSizeValue = context[SDWebImageContextImageThumbnailPixelSize];
  133 + if (thumbnailSizeValue != nil) {
  134 + CGSize thumbnailSize = CGSizeZero;
  135 +#if SD_MAC
  136 + thumbnailSize = thumbnailSizeValue.sizeValue;
  137 +#else
  138 + thumbnailSize = thumbnailSizeValue.CGSizeValue;
  139 +#endif
  140 + BOOL preserveAspectRatio = YES;
  141 + NSNumber *preserveAspectRatioValue = context[SDWebImageContextImagePreserveAspectRatio];
  142 + if (preserveAspectRatioValue != nil) {
  143 + preserveAspectRatio = preserveAspectRatioValue.boolValue;
  144 + }
  145 + key = SDThumbnailedKeyForKey(key, thumbnailSize, preserveAspectRatio);
  146 + }
  147 +
  148 + // Transformer Key Appending
  149 + id<SDImageTransformer> transformer = self.transformer;
  150 + if (context[SDWebImageContextImageTransformer]) {
  151 + transformer = context[SDWebImageContextImageTransformer];
  152 + if (![transformer conformsToProtocol:@protocol(SDImageTransformer)]) {
  153 + transformer = nil;
  154 + }
  155 + }
  156 + if (transformer) {
  157 + key = SDTransformedKeyForKey(key, transformer.transformerKey);
  158 + }
  159 +
  160 + return key;
110 161 }
111 162  
112 163 - (SDWebImageCombinedOperation *)loadImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDImageLoaderProgressBlock)progressBlock completed:(SDInternalCompletionBlock)completedBlock {
... ... @@ -143,7 +194,9 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
143 194 }
144 195  
145 196 if (url.absoluteString.length == 0 || (!(options & SDWebImageRetryFailed) && isFailedUrl)) {
146   - [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorInvalidURL userInfo:@{NSLocalizedDescriptionKey : @"Image url is nil"}] url:url];
  197 + NSString *description = isFailedUrl ? @"Image url is blacklisted" : @"Image url is nil";
  198 + NSInteger code = isFailedUrl ? SDWebImageErrorBlackListed : SDWebImageErrorInvalidURL;
  199 + [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:SDWebImageErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey : description}] url:url];
147 200 return operation;
148 201 }
149 202  
... ... @@ -175,29 +228,62 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
175 228 return isRunning;
176 229 }
177 230  
  231 +- (void)removeFailedURL:(NSURL *)url {
  232 + if (!url) {
  233 + return;
  234 + }
  235 + SD_LOCK(self.failedURLsLock);
  236 + [self.failedURLs removeObject:url];
  237 + SD_UNLOCK(self.failedURLsLock);
  238 +}
  239 +
  240 +- (void)removeAllFailedURLs {
  241 + SD_LOCK(self.failedURLsLock);
  242 + [self.failedURLs removeAllObjects];
  243 + SD_UNLOCK(self.failedURLsLock);
  244 +}
  245 +
178 246 #pragma mark - Private
179 247  
180   -// Query cache process
  248 +// Query normal cache process
181 249 - (void)callCacheProcessForOperation:(nonnull SDWebImageCombinedOperation *)operation
182 250 url:(nonnull NSURL *)url
183 251 options:(SDWebImageOptions)options
184 252 context:(nullable SDWebImageContext *)context
185 253 progress:(nullable SDImageLoaderProgressBlock)progressBlock
186 254 completed:(nullable SDInternalCompletionBlock)completedBlock {
  255 + // Grab the image cache to use
  256 + id<SDImageCache> imageCache;
  257 + if ([context[SDWebImageContextImageCache] conformsToProtocol:@protocol(SDImageCache)]) {
  258 + imageCache = context[SDWebImageContextImageCache];
  259 + } else {
  260 + imageCache = self.imageCache;
  261 + }
  262 +
  263 + // Get the query cache type
  264 + SDImageCacheType queryCacheType = SDImageCacheTypeAll;
  265 + if (context[SDWebImageContextQueryCacheType]) {
  266 + queryCacheType = [context[SDWebImageContextQueryCacheType] integerValue];
  267 + }
  268 +
187 269 // Check whether we should query cache
188 270 BOOL shouldQueryCache = !SD_OPTIONS_CONTAINS(options, SDWebImageFromLoaderOnly);
189 271 if (shouldQueryCache) {
190   - id<SDWebImageCacheKeyFilter> cacheKeyFilter = context[SDWebImageContextCacheKeyFilter];
191   - NSString *key = [self cacheKeyForURL:url cacheKeyFilter:cacheKeyFilter];
  272 + NSString *key = [self cacheKeyForURL:url context:context];
192 273 @weakify(operation);
193   - operation.cacheOperation = [self.imageCache queryImageForKey:key options:options context:context completion:^(UIImage * _Nullable cachedImage, NSData * _Nullable cachedData, SDImageCacheType cacheType) {
  274 + operation.cacheOperation = [imageCache queryImageForKey:key options:options context:context cacheType:queryCacheType completion:^(UIImage * _Nullable cachedImage, NSData * _Nullable cachedData, SDImageCacheType cacheType) {
194 275 @strongify(operation);
195 276 if (!operation || operation.isCancelled) {
196 277 // Image combined operation cancelled by user
197   - [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:nil] url:url];
  278 + [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during querying the cache"}] url:url];
198 279 [self safelyRemoveOperationFromRunning:operation];
199 280 return;
  281 + } else if (context[SDWebImageContextImageTransformer] && !cachedImage) {
  282 + // Have a chance to query original cache instead of downloading
  283 + [self callOriginalCacheProcessForOperation:operation url:url options:options context:context progress:progressBlock completed:completedBlock];
  284 + return;
200 285 }
  286 +
201 287 // Continue download process
202 288 [self callDownloadProcessForOperation:operation url:url options:options context:context cachedImage:cachedImage cachedData:cachedData cacheType:cacheType progress:progressBlock completed:completedBlock];
203 289 }];
... ... @@ -207,6 +293,69 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
207 293 }
208 294 }
209 295  
  296 +// Query original cache process
  297 +- (void)callOriginalCacheProcessForOperation:(nonnull SDWebImageCombinedOperation *)operation
  298 + url:(nonnull NSURL *)url
  299 + options:(SDWebImageOptions)options
  300 + context:(nullable SDWebImageContext *)context
  301 + progress:(nullable SDImageLoaderProgressBlock)progressBlock
  302 + completed:(nullable SDInternalCompletionBlock)completedBlock {
  303 + // Grab the image cache to use
  304 + id<SDImageCache> imageCache;
  305 + if ([context[SDWebImageContextImageCache] conformsToProtocol:@protocol(SDImageCache)]) {
  306 + imageCache = context[SDWebImageContextImageCache];
  307 + } else {
  308 + imageCache = self.imageCache;
  309 + }
  310 +
  311 + // Get the original query cache type
  312 + SDImageCacheType originalQueryCacheType = SDImageCacheTypeNone;
  313 + if (context[SDWebImageContextOriginalQueryCacheType]) {
  314 + originalQueryCacheType = [context[SDWebImageContextOriginalQueryCacheType] integerValue];
  315 + }
  316 +
  317 + // Check whether we should query original cache
  318 + BOOL shouldQueryOriginalCache = (originalQueryCacheType != SDImageCacheTypeNone);
  319 + if (shouldQueryOriginalCache) {
  320 + // Change originContext to mutable
  321 + SDWebImageMutableContext * __block originContext;
  322 + if (context) {
  323 + originContext = [context mutableCopy];
  324 + } else {
  325 + originContext = [NSMutableDictionary dictionary];
  326 + }
  327 +
  328 + // Disable transformer for cache key generation
  329 + id<SDImageTransformer> transformer = originContext[SDWebImageContextImageTransformer];
  330 + originContext[SDWebImageContextImageTransformer] = [NSNull null];
  331 +
  332 + NSString *key = [self cacheKeyForURL:url context:originContext];
  333 + @weakify(operation);
  334 + operation.cacheOperation = [imageCache queryImageForKey:key options:options context:context cacheType:originalQueryCacheType completion:^(UIImage * _Nullable cachedImage, NSData * _Nullable cachedData, SDImageCacheType cacheType) {
  335 + @strongify(operation);
  336 + if (!operation || operation.isCancelled) {
  337 + // Image combined operation cancelled by user
  338 + [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during querying the cache"}] url:url];
  339 + [self safelyRemoveOperationFromRunning:operation];
  340 + return;
  341 + }
  342 +
  343 + // Add original transformer
  344 + if (transformer) {
  345 + originContext[SDWebImageContextImageTransformer] = transformer;
  346 + }
  347 +
  348 + // Use the store cache process instead of downloading, and ignore .refreshCached option for now
  349 + [self callStoreCacheProcessForOperation:operation url:url options:options context:context downloadedImage:cachedImage downloadedData:cachedData finished:YES progress:progressBlock completed:completedBlock];
  350 +
  351 + [self safelyRemoveOperationFromRunning:operation];
  352 + }];
  353 + } else {
  354 + // Continue download process
  355 + [self callDownloadProcessForOperation:operation url:url options:options context:context cachedImage:nil cachedData:nil cacheType:originalQueryCacheType progress:progressBlock completed:completedBlock];
  356 + }
  357 +}
  358 +
210 359 // Download process
211 360 - (void)callDownloadProcessForOperation:(nonnull SDWebImageCombinedOperation *)operation
212 361 url:(nonnull NSURL *)url
... ... @@ -217,11 +366,19 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
217 366 cacheType:(SDImageCacheType)cacheType
218 367 progress:(nullable SDImageLoaderProgressBlock)progressBlock
219 368 completed:(nullable SDInternalCompletionBlock)completedBlock {
  369 + // Grab the image loader to use
  370 + id<SDImageLoader> imageLoader;
  371 + if ([context[SDWebImageContextImageLoader] conformsToProtocol:@protocol(SDImageLoader)]) {
  372 + imageLoader = context[SDWebImageContextImageLoader];
  373 + } else {
  374 + imageLoader = self.imageLoader;
  375 + }
  376 +
220 377 // Check whether we should download image from network
221 378 BOOL shouldDownload = !SD_OPTIONS_CONTAINS(options, SDWebImageFromCacheOnly);
222 379 shouldDownload &= (!cachedImage || options & SDWebImageRefreshCached);
223 380 shouldDownload &= (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url]);
224   - shouldDownload &= [self.imageLoader canRequestImageForURL:url];
  381 + shouldDownload &= [imageLoader canRequestImageForURL:url];
225 382 if (shouldDownload) {
226 383 if (cachedImage && options & SDWebImageRefreshCached) {
227 384 // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image
... ... @@ -239,11 +396,11 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
239 396 }
240 397  
241 398 @weakify(operation);
242   - operation.loaderOperation = [self.imageLoader requestImageWithURL:url options:options context:context progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) {
  399 + operation.loaderOperation = [imageLoader requestImageWithURL:url options:options context:context progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) {
243 400 @strongify(operation);
244 401 if (!operation || operation.isCancelled) {
245 402 // Image combined operation cancelled by user
246   - [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:nil] url:url];
  403 + [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during sending the request"}] url:url];
247 404 } else if (cachedImage && options & SDWebImageRefreshCached && [error.domain isEqualToString:SDWebImageErrorDomain] && error.code == SDWebImageErrorCacheNotModified) {
248 405 // Image refresh hit the NSURLCache cache, do not call the completion block
249 406 } else if ([error.domain isEqualToString:SDWebImageErrorDomain] && error.code == SDWebImageErrorCancelled) {
... ... @@ -251,7 +408,7 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
251 408 [self callCompletionBlockForOperation:operation completion:completedBlock error:error url:url];
252 409 } else if (error) {
253 410 [self callCompletionBlockForOperation:operation completion:completedBlock error:error url:url];
254   - BOOL shouldBlockFailedURL = [self shouldBlockFailedURLWithURL:url error:error];
  411 + BOOL shouldBlockFailedURL = [self shouldBlockFailedURLWithURL:url error:error options:options context:context];
255 412  
256 413 if (shouldBlockFailedURL) {
257 414 SD_LOCK(self.failedURLsLock);
... ... @@ -264,7 +421,7 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
264 421 [self.failedURLs removeObject:url];
265 422 SD_UNLOCK(self.failedURLsLock);
266 423 }
267   -
  424 + // Continue store cache process
268 425 [self callStoreCacheProcessForOperation:operation url:url options:options context:context downloadedImage:downloadedImage downloadedData:downloadedData finished:finished progress:progressBlock completed:completedBlock];
269 426 }
270 427  
... ... @@ -302,12 +459,20 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
302 459 if (context[SDWebImageContextOriginalStoreCacheType]) {
303 460 originalStoreCacheType = [context[SDWebImageContextOriginalStoreCacheType] integerValue];
304 461 }
305   - id<SDWebImageCacheKeyFilter> cacheKeyFilter = context[SDWebImageContextCacheKeyFilter];
306   - NSString *key = [self cacheKeyForURL:url cacheKeyFilter:cacheKeyFilter];
  462 + // origin cache key
  463 + SDWebImageMutableContext *originContext = [context mutableCopy];
  464 + // disable transformer for cache key generation
  465 + originContext[SDWebImageContextImageTransformer] = [NSNull null];
  466 + NSString *key = [self cacheKeyForURL:url context:originContext];
307 467 id<SDImageTransformer> transformer = context[SDWebImageContextImageTransformer];
  468 + if (![transformer conformsToProtocol:@protocol(SDImageTransformer)]) {
  469 + transformer = nil;
  470 + }
308 471 id<SDWebImageCacheSerializer> cacheSerializer = context[SDWebImageContextCacheSerializer];
309 472  
310   - BOOL shouldTransformImage = downloadedImage && (!downloadedImage.sd_isAnimated || (options & SDWebImageTransformAnimatedImage)) && transformer;
  473 + BOOL shouldTransformImage = downloadedImage && transformer;
  474 + shouldTransformImage = shouldTransformImage && (!downloadedImage.sd_isAnimated || (options & SDWebImageTransformAnimatedImage));
  475 + shouldTransformImage = shouldTransformImage && (!downloadedImage.sd_isVector || (options & SDWebImageTransformVectorImage));
311 476 BOOL shouldCacheOriginal = downloadedImage && finished;
312 477  
313 478 // if available, store original image to cache
... ... @@ -318,37 +483,74 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
318 483 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
319 484 @autoreleasepool {
320 485 NSData *cacheData = [cacheSerializer cacheDataWithImage:downloadedImage originalData:downloadedData imageURL:url];
321   - [self.imageCache storeImage:downloadedImage imageData:cacheData forKey:key cacheType:targetStoreCacheType completion:nil];
  486 + [self storeImage:downloadedImage imageData:cacheData forKey:key cacheType:targetStoreCacheType options:options context:context completion:^{
  487 + // Continue transform process
  488 + [self callTransformProcessForOperation:operation url:url options:options context:context originalImage:downloadedImage originalData:downloadedData finished:finished progress:progressBlock completed:completedBlock];
  489 + }];
322 490 }
323 491 });
324 492 } else {
325   - [self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key cacheType:targetStoreCacheType completion:nil];
  493 + [self storeImage:downloadedImage imageData:downloadedData forKey:key cacheType:targetStoreCacheType options:options context:context completion:^{
  494 + // Continue transform process
  495 + [self callTransformProcessForOperation:operation url:url options:options context:context originalImage:downloadedImage originalData:downloadedData finished:finished progress:progressBlock completed:completedBlock];
  496 + }];
326 497 }
  498 + } else {
  499 + // Continue transform process
  500 + [self callTransformProcessForOperation:operation url:url options:options context:context originalImage:downloadedImage originalData:downloadedData finished:finished progress:progressBlock completed:completedBlock];
327 501 }
  502 +}
  503 +
  504 +// Transform process
  505 +- (void)callTransformProcessForOperation:(nonnull SDWebImageCombinedOperation *)operation
  506 + url:(nonnull NSURL *)url
  507 + options:(SDWebImageOptions)options
  508 + context:(SDWebImageContext *)context
  509 + originalImage:(nullable UIImage *)originalImage
  510 + originalData:(nullable NSData *)originalData
  511 + finished:(BOOL)finished
  512 + progress:(nullable SDImageLoaderProgressBlock)progressBlock
  513 + completed:(nullable SDInternalCompletionBlock)completedBlock {
  514 + // the target image store cache type
  515 + SDImageCacheType storeCacheType = SDImageCacheTypeAll;
  516 + if (context[SDWebImageContextStoreCacheType]) {
  517 + storeCacheType = [context[SDWebImageContextStoreCacheType] integerValue];
  518 + }
  519 + // transformed cache key
  520 + NSString *key = [self cacheKeyForURL:url context:context];
  521 + id<SDImageTransformer> transformer = context[SDWebImageContextImageTransformer];
  522 + if (![transformer conformsToProtocol:@protocol(SDImageTransformer)]) {
  523 + transformer = nil;
  524 + }
  525 + id<SDWebImageCacheSerializer> cacheSerializer = context[SDWebImageContextCacheSerializer];
  526 +
  527 + BOOL shouldTransformImage = originalImage && transformer;
  528 + shouldTransformImage = shouldTransformImage && (!originalImage.sd_isAnimated || (options & SDWebImageTransformAnimatedImage));
  529 + shouldTransformImage = shouldTransformImage && (!originalImage.sd_isVector || (options & SDWebImageTransformVectorImage));
328 530 // if available, store transformed image to cache
329 531 if (shouldTransformImage) {
330 532 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
331 533 @autoreleasepool {
332   - UIImage *transformedImage = [transformer transformedImageWithImage:downloadedImage forKey:key];
  534 + UIImage *transformedImage = [transformer transformedImageWithImage:originalImage forKey:key];
333 535 if (transformedImage && finished) {
334   - NSString *transformerKey = [transformer transformerKey];
335   - NSString *cacheKey = SDTransformedKeyForKey(key, transformerKey);
336   - BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage];
  536 + BOOL imageWasTransformed = ![transformedImage isEqual:originalImage];
337 537 NSData *cacheData;
338 538 // pass nil if the image was transformed, so we can recalculate the data from the image
339 539 if (cacheSerializer && (storeCacheType == SDImageCacheTypeDisk || storeCacheType == SDImageCacheTypeAll)) {
340   - cacheData = [cacheSerializer cacheDataWithImage:transformedImage originalData:(imageWasTransformed ? nil : downloadedData) imageURL:url];
  540 + cacheData = [cacheSerializer cacheDataWithImage:transformedImage originalData:(imageWasTransformed ? nil : originalData) imageURL:url];
341 541 } else {
342   - cacheData = (imageWasTransformed ? nil : downloadedData);
  542 + cacheData = (imageWasTransformed ? nil : originalData);
343 543 }
344   - [self.imageCache storeImage:transformedImage imageData:cacheData forKey:cacheKey cacheType:storeCacheType completion:nil];
  544 + [self storeImage:transformedImage imageData:cacheData forKey:key cacheType:storeCacheType options:options context:context completion:^{
  545 + [self callCompletionBlockForOperation:operation completion:completedBlock image:transformedImage data:originalData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url];
  546 + }];
  547 + } else {
  548 + [self callCompletionBlockForOperation:operation completion:completedBlock image:transformedImage data:originalData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url];
345 549 }
346   -
347   - [self callCompletionBlockForOperation:operation completion:completedBlock image:transformedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url];
348 550 }
349 551 });
350 552 } else {
351   - [self callCompletionBlockForOperation:operation completion:completedBlock image:downloadedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url];
  553 + [self callCompletionBlockForOperation:operation completion:completedBlock image:originalImage data:originalData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url];
352 554 }
353 555 }
354 556  
... ... @@ -363,6 +565,35 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
363 565 SD_UNLOCK(self.runningOperationsLock);
364 566 }
365 567  
  568 +- (void)storeImage:(nullable UIImage *)image
  569 + imageData:(nullable NSData *)data
  570 + forKey:(nullable NSString *)key
  571 + cacheType:(SDImageCacheType)cacheType
  572 + options:(SDWebImageOptions)options
  573 + context:(nullable SDWebImageContext *)context
  574 + completion:(nullable SDWebImageNoParamsBlock)completion {
  575 + id<SDImageCache> imageCache;
  576 + if ([context[SDWebImageContextImageCache] conformsToProtocol:@protocol(SDImageCache)]) {
  577 + imageCache = context[SDWebImageContextImageCache];
  578 + } else {
  579 + imageCache = self.imageCache;
  580 + }
  581 + BOOL waitStoreCache = SD_OPTIONS_CONTAINS(options, SDWebImageWaitStoreCache);
  582 + // Check whether we should wait the store cache finished. If not, callback immediately
  583 + [imageCache storeImage:image imageData:data forKey:key cacheType:cacheType completion:^{
  584 + if (waitStoreCache) {
  585 + if (completion) {
  586 + completion();
  587 + }
  588 + }
  589 + }];
  590 + if (!waitStoreCache) {
  591 + if (completion) {
  592 + completion();
  593 + }
  594 + }
  595 +}
  596 +
366 597 - (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)operation
367 598 completion:(nullable SDInternalCompletionBlock)completionBlock
368 599 error:(nullable NSError *)error
... ... @@ -386,13 +617,21 @@ static id&lt;SDImageLoader&gt; _defaultImageLoader;
386 617 }
387 618  
388 619 - (BOOL)shouldBlockFailedURLWithURL:(nonnull NSURL *)url
389   - error:(nonnull NSError *)error {
  620 + error:(nonnull NSError *)error
  621 + options:(SDWebImageOptions)options
  622 + context:(nullable SDWebImageContext *)context {
  623 + id<SDImageLoader> imageLoader;
  624 + if ([context[SDWebImageContextImageLoader] conformsToProtocol:@protocol(SDImageLoader)]) {
  625 + imageLoader = context[SDWebImageContextImageLoader];
  626 + } else {
  627 + imageLoader = self.imageLoader;
  628 + }
390 629 // Check whether we should block failed url
391 630 BOOL shouldBlockFailedURL;
392 631 if ([self.delegate respondsToSelector:@selector(imageManager:shouldBlockFailedURL:withError:)]) {
393 632 shouldBlockFailedURL = [self.delegate imageManager:self shouldBlockFailedURL:url withError:error];
394 633 } else {
395   - shouldBlockFailedURL = [self.imageLoader shouldBlockFailedURLWithURL:url error:error];
  634 + shouldBlockFailedURL = [imageLoader shouldBlockFailedURLWithURL:url error:error];
396 635 }
397 636  
398 637 return shouldBlockFailedURL;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.h
... ... @@ -92,7 +92,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls,
92 92 @property (strong, nonatomic, nonnull) dispatch_queue_t delegateQueue;
93 93  
94 94 /**
95   - * The delegate for the prefetcher. Defatuls to nil.
  95 + * The delegate for the prefetcher. Defaults to nil.
96 96 */
97 97 @property (weak, nonatomic, nullable) id <SDWebImagePrefetcherDelegate> delegate;
98 98  
... ... @@ -108,7 +108,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls,
108 108  
109 109 /**
110 110 * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching. It based on the image manager so the image may from the cache and network according to the `options` property.
111   - * Prefetching is seperate to each other, which means the progressBlock and completionBlock you provide is bind to the prefetching for the list of urls.
  111 + * Prefetching is separate to each other, which means the progressBlock and completionBlock you provide is bind to the prefetching for the list of urls.
112 112 * Attention that call this will not cancel previous fetched urls. You should keep the token return by this to cancel or cancel all the prefetch.
113 113 *
114 114 * @param urls list of URLs to prefetch
... ... @@ -118,7 +118,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls,
118 118  
119 119 /**
120 120 * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching. It based on the image manager so the image may from the cache and network according to the `options` property.
121   - * Prefetching is seperate to each other, which means the progressBlock and completionBlock you provide is bind to the prefetching for the list of urls.
  121 + * Prefetching is separate to each other, which means the progressBlock and completionBlock you provide is bind to the prefetching for the list of urls.
122 122 * Attention that call this will not cancel previous fetched urls. You should keep the token return by this to cancel or cancel all the prefetch.
123 123 *
124 124 * @param urls list of URLs to prefetch
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.m
... ... @@ -20,6 +20,10 @@
20 20 atomic_flag _isAllFinished;
21 21  
22 22 unsigned long _totalCount;
  23 +
  24 + // Used to ensure NSPointerArray thread safe
  25 + dispatch_semaphore_t _prefetchOperationsLock;
  26 + dispatch_semaphore_t _loadOperationsLock;
23 27 }
24 28  
25 29 @property (nonatomic, copy, readwrite) NSArray<NSURL *> *urls;
... ... @@ -106,7 +110,6 @@
106 110 }
107 111  
108 112 - (void)startPrefetchWithToken:(SDWebImagePrefetchToken * _Nonnull)token {
109   - NSPointerArray *operations = token.loadOperations;
110 113 for (NSURL *url in token.urls) {
111 114 @autoreleasepool {
112 115 @weakify(self);
... ... @@ -142,13 +145,13 @@
142 145 [asyncOperation complete];
143 146 }];
144 147 NSAssert(operation != nil, @"Operation should not be nil, [SDWebImageManager loadImageWithURL:options:context:progress:completed:] break prefetch logic");
145   - @synchronized (token) {
146   - [operations addPointer:(__bridge void *)operation];
147   - }
  148 + SD_LOCK(token->_loadOperationsLock);
  149 + [token.loadOperations addPointer:(__bridge void *)operation];
  150 + SD_UNLOCK(token->_loadOperationsLock);
148 151 }];
149   - @synchronized (token) {
150   - [token.prefetchOperations addPointer:(__bridge void *)prefetchOperation];
151   - }
  152 + SD_LOCK(token->_prefetchOperationsLock);
  153 + [token.prefetchOperations addPointer:(__bridge void *)prefetchOperation];
  154 + SD_UNLOCK(token->_prefetchOperationsLock);
152 155 [self.prefetchQueue addOperation:prefetchOperation];
153 156 }
154 157 }
... ... @@ -262,24 +265,38 @@
262 265  
263 266 @implementation SDWebImagePrefetchToken
264 267  
  268 +- (instancetype)init {
  269 + self = [super init];
  270 + if (self) {
  271 + _prefetchOperationsLock = dispatch_semaphore_create(1);
  272 + _loadOperationsLock = dispatch_semaphore_create(1);
  273 + }
  274 + return self;
  275 +}
  276 +
265 277 - (void)cancel {
266   - @synchronized (self) {
267   - [self.prefetchOperations compact];
268   - for (id operation in self.prefetchOperations) {
269   - if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]) {
270   - [operation cancel];
271   - }
  278 + SD_LOCK(_prefetchOperationsLock);
  279 + [self.prefetchOperations compact];
  280 + for (id operation in self.prefetchOperations) {
  281 + id<SDWebImageOperation> strongOperation = operation;
  282 + if (strongOperation) {
  283 + [strongOperation cancel];
272 284 }
273   - self.prefetchOperations.count = 0;
274   -
275   - [self.loadOperations compact];
276   - for (id operation in self.loadOperations) {
277   - if ([operation conformsToProtocol:@protocol(SDWebImageOperation)]) {
278   - [operation cancel];
279   - }
  285 + }
  286 + self.prefetchOperations.count = 0;
  287 + SD_UNLOCK(_prefetchOperationsLock);
  288 +
  289 + SD_LOCK(_loadOperationsLock);
  290 + [self.loadOperations compact];
  291 + for (id operation in self.loadOperations) {
  292 + id<SDWebImageOperation> strongOperation = operation;
  293 + if (strongOperation) {
  294 + [strongOperation cancel];
280 295 }
281   - self.loadOperations.count = 0;
282 296 }
  297 + self.loadOperations.count = 0;
  298 + SD_UNLOCK(_loadOperationsLock);
  299 +
283 300 self.completionBlock = nil;
284 301 self.progressBlock = nil;
285 302 [self.prefetcher removeRunningToken:self];
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.h
... ... @@ -15,7 +15,21 @@
15 15 typedef UIViewAnimationOptions SDWebImageAnimationOptions;
16 16 #else
17 17 typedef NS_OPTIONS(NSUInteger, SDWebImageAnimationOptions) {
18   - SDWebImageAnimationOptionAllowsImplicitAnimation = 1 << 0, // specify `allowsImplicitAnimation` for the `NSAnimationContext`
  18 + SDWebImageAnimationOptionAllowsImplicitAnimation = 1 << 0, // specify `allowsImplicitAnimation` for the `NSAnimationContext`
  19 +
  20 + SDWebImageAnimationOptionCurveEaseInOut = 0 << 16, // default
  21 + SDWebImageAnimationOptionCurveEaseIn = 1 << 16,
  22 + SDWebImageAnimationOptionCurveEaseOut = 2 << 16,
  23 + SDWebImageAnimationOptionCurveLinear = 3 << 16,
  24 +
  25 + SDWebImageAnimationOptionTransitionNone = 0 << 20, // default
  26 + SDWebImageAnimationOptionTransitionFlipFromLeft = 1 << 20,
  27 + SDWebImageAnimationOptionTransitionFlipFromRight = 2 << 20,
  28 + SDWebImageAnimationOptionTransitionCurlUp = 3 << 20,
  29 + SDWebImageAnimationOptionTransitionCurlDown = 4 << 20,
  30 + SDWebImageAnimationOptionTransitionCrossDissolve = 5 << 20,
  31 + SDWebImageAnimationOptionTransitionFlipFromTop = 6 << 20,
  32 + SDWebImageAnimationOptionTransitionFlipFromBottom = 7 << 20,
19 33 };
20 34 #endif
21 35  
... ... @@ -32,7 +46,7 @@ typedef void (^SDWebImageTransitionCompletionBlock)(BOOL finished);
32 46 @interface SDWebImageTransition : NSObject
33 47  
34 48 /**
35   - By default, we set the image to the view at the beginning of the animtions. You can disable this and provide custom set image process
  49 + By default, we set the image to the view at the beginning of the animations. You can disable this and provide custom set image process
36 50 */
37 51 @property (nonatomic, assign) BOOL avoidAutoSetImage;
38 52 /**
... ... @@ -42,7 +56,7 @@ typedef void (^SDWebImageTransitionCompletionBlock)(BOOL finished);
42 56 /**
43 57 The timing function used for all animations within this transition animation (macOS).
44 58 */
45   -@property (nonatomic, strong, nullable) CAMediaTimingFunction *timingFunction API_UNAVAILABLE(ios, tvos, watchos);
  59 +@property (nonatomic, strong, nullable) CAMediaTimingFunction *timingFunction API_UNAVAILABLE(ios, tvos, watchos) API_DEPRECATED("Use SDWebImageAnimationOptions instead, or grab NSAnimationContext.currentContext and modify the timingFunction", macos(10.10, 10.10));
46 60 /**
47 61 A mask of options indicating how you want to perform the animations.
48 62 */
... ... @@ -69,7 +83,7 @@ typedef void (^SDWebImageTransitionCompletionBlock)(BOOL finished);
69 83 */
70 84 @interface SDWebImageTransition (Conveniences)
71 85  
72   -/// Fade transition.
  86 +/// Fade-in transition.
73 87 @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *fadeTransition;
74 88 /// Flip from left transition.
75 89 @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *flipFromLeftTransition;
... ... @@ -84,6 +98,34 @@ typedef void (^SDWebImageTransitionCompletionBlock)(BOOL finished);
84 98 /// Curl down transition.
85 99 @property (nonatomic, class, nonnull, readonly) SDWebImageTransition *curlDownTransition;
86 100  
  101 +/// Fade-in transition with duration.
  102 +/// @param duration transition duration, use ease-in-out
  103 ++ (nonnull instancetype)fadeTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(fade(duration:));
  104 +
  105 +/// Flip from left transition with duration.
  106 +/// @param duration transition duration, use ease-in-out
  107 ++ (nonnull instancetype)flipFromLeftTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(flipFromLeft(duration:));
  108 +
  109 +/// Flip from right transition with duration.
  110 +/// @param duration transition duration, use ease-in-out
  111 ++ (nonnull instancetype)flipFromRightTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(flipFromRight(duration:));
  112 +
  113 +/// Flip from top transition with duration.
  114 +/// @param duration transition duration, use ease-in-out
  115 ++ (nonnull instancetype)flipFromTopTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(flipFromTop(duration:));
  116 +
  117 +/// Flip from bottom transition with duration.
  118 +/// @param duration transition duration, use ease-in-out
  119 ++ (nonnull instancetype)flipFromBottomTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(flipFromBottom(duration:));
  120 +
  121 +/// Curl up transition with duration.
  122 +/// @param duration transition duration, use ease-in-out
  123 ++ (nonnull instancetype)curlUpTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(curlUp(duration:));
  124 +
  125 +/// Curl down transition with duration.
  126 +/// @param duration transition duration, use ease-in-out
  127 ++ (nonnull instancetype)curlDownTransitionWithDuration:(NSTimeInterval)duration NS_SWIFT_NAME(curlDown(duration:));
  128 +
87 129 @end
88 130  
89 131 #endif
... ...
Example/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.m
... ... @@ -11,7 +11,62 @@
11 11 #if SD_UIKIT || SD_MAC
12 12  
13 13 #if SD_MAC
14   -#import <QuartzCore/QuartzCore.h>
  14 +#import "SDWebImageTransitionInternal.h"
  15 +#import "SDInternalMacros.h"
  16 +
  17 +CAMediaTimingFunction * SDTimingFunctionFromAnimationOptions(SDWebImageAnimationOptions options) {
  18 + if (SD_OPTIONS_CONTAINS(SDWebImageAnimationOptionCurveLinear, options)) {
  19 + return [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
  20 + } else if (SD_OPTIONS_CONTAINS(SDWebImageAnimationOptionCurveEaseIn, options)) {
  21 + return [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
  22 + } else if (SD_OPTIONS_CONTAINS(SDWebImageAnimationOptionCurveEaseOut, options)) {
  23 + return [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
  24 + } else if (SD_OPTIONS_CONTAINS(SDWebImageAnimationOptionCurveEaseInOut, options)) {
  25 + return [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
  26 + } else {
  27 + return [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
  28 + }
  29 +}
  30 +
  31 +CATransition * SDTransitionFromAnimationOptions(SDWebImageAnimationOptions options) {
  32 + if (SD_OPTIONS_CONTAINS(options, SDWebImageAnimationOptionTransitionCrossDissolve)) {
  33 + CATransition *trans = [CATransition animation];
  34 + trans.type = kCATransitionFade;
  35 + return trans;
  36 + } else if (SD_OPTIONS_CONTAINS(options, SDWebImageAnimationOptionTransitionFlipFromLeft)) {
  37 + CATransition *trans = [CATransition animation];
  38 + trans.type = kCATransitionPush;
  39 + trans.subtype = kCATransitionFromLeft;
  40 + return trans;
  41 + } else if (SD_OPTIONS_CONTAINS(options, SDWebImageAnimationOptionTransitionFlipFromRight)) {
  42 + CATransition *trans = [CATransition animation];
  43 + trans.type = kCATransitionPush;
  44 + trans.subtype = kCATransitionFromRight;
  45 + return trans;
  46 + } else if (SD_OPTIONS_CONTAINS(options, SDWebImageAnimationOptionTransitionFlipFromTop)) {
  47 + CATransition *trans = [CATransition animation];
  48 + trans.type = kCATransitionPush;
  49 + trans.subtype = kCATransitionFromTop;
  50 + return trans;
  51 + } else if (SD_OPTIONS_CONTAINS(options, SDWebImageAnimationOptionTransitionFlipFromBottom)) {
  52 + CATransition *trans = [CATransition animation];
  53 + trans.type = kCATransitionPush;
  54 + trans.subtype = kCATransitionFromBottom;
  55 + return trans;
  56 + } else if (SD_OPTIONS_CONTAINS(options, SDWebImageAnimationOptionTransitionCurlUp)) {
  57 + CATransition *trans = [CATransition animation];
  58 + trans.type = kCATransitionReveal;
  59 + trans.subtype = kCATransitionFromTop;
  60 + return trans;
  61 + } else if (SD_OPTIONS_CONTAINS(options, SDWebImageAnimationOptionTransitionCurlDown)) {
  62 + CATransition *trans = [CATransition animation];
  63 + trans.type = kCATransitionReveal;
  64 + trans.subtype = kCATransitionFromBottom;
  65 + return trans;
  66 + } else {
  67 + return nil;
  68 + }
  69 +}
15 70 #endif
16 71  
17 72 @implementation SDWebImageTransition
... ... @@ -29,106 +84,101 @@
29 84 @implementation SDWebImageTransition (Conveniences)
30 85  
31 86 + (SDWebImageTransition *)fadeTransition {
  87 + return [self fadeTransitionWithDuration:0.5];
  88 +}
  89 +
  90 ++ (SDWebImageTransition *)fadeTransitionWithDuration:(NSTimeInterval)duration {
32 91 SDWebImageTransition *transition = [SDWebImageTransition new];
33 92 #if SD_UIKIT
34 93 transition.animationOptions = UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAllowUserInteraction;
35 94 #else
36   - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) {
37   - CATransition *trans = [CATransition animation];
38   - trans.type = kCATransitionFade;
39   - [view.layer addAnimation:trans forKey:kCATransition];
40   - };
  95 + transition.animationOptions = SDWebImageAnimationOptionTransitionCrossDissolve;
41 96 #endif
42 97 return transition;
43 98 }
44 99  
45 100 + (SDWebImageTransition *)flipFromLeftTransition {
  101 + return [self flipFromLeftTransitionWithDuration:0.5];
  102 +}
  103 +
  104 ++ (SDWebImageTransition *)flipFromLeftTransitionWithDuration:(NSTimeInterval)duration {
46 105 SDWebImageTransition *transition = [SDWebImageTransition new];
47 106 #if SD_UIKIT
48 107 transition.animationOptions = UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionAllowUserInteraction;
49 108 #else
50   - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) {
51   - CATransition *trans = [CATransition animation];
52   - trans.type = kCATransitionPush;
53   - trans.subtype = kCATransitionFromLeft;
54   - [view.layer addAnimation:trans forKey:kCATransition];
55   - };
  109 + transition.animationOptions = SDWebImageAnimationOptionTransitionFlipFromLeft;
56 110 #endif
57 111 return transition;
58 112 }
59 113  
60 114 + (SDWebImageTransition *)flipFromRightTransition {
  115 + return [self flipFromRightTransitionWithDuration:0.5];
  116 +}
  117 +
  118 ++ (SDWebImageTransition *)flipFromRightTransitionWithDuration:(NSTimeInterval)duration {
61 119 SDWebImageTransition *transition = [SDWebImageTransition new];
62 120 #if SD_UIKIT
63 121 transition.animationOptions = UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionAllowUserInteraction;
64 122 #else
65   - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) {
66   - CATransition *trans = [CATransition animation];
67   - trans.type = kCATransitionPush;
68   - trans.subtype = kCATransitionFromRight;
69   - [view.layer addAnimation:trans forKey:kCATransition];
70   - };
  123 + transition.animationOptions = SDWebImageAnimationOptionTransitionFlipFromRight;
71 124 #endif
72 125 return transition;
73 126 }
74 127  
75 128 + (SDWebImageTransition *)flipFromTopTransition {
  129 + return [self flipFromTopTransitionWithDuration:0.5];
  130 +}
  131 +
  132 ++ (SDWebImageTransition *)flipFromTopTransitionWithDuration:(NSTimeInterval)duration {
76 133 SDWebImageTransition *transition = [SDWebImageTransition new];
77 134 #if SD_UIKIT
78 135 transition.animationOptions = UIViewAnimationOptionTransitionFlipFromTop | UIViewAnimationOptionAllowUserInteraction;
79 136 #else
80   - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) {
81   - CATransition *trans = [CATransition animation];
82   - trans.type = kCATransitionPush;
83   - trans.subtype = kCATransitionFromTop;
84   - [view.layer addAnimation:trans forKey:kCATransition];
85   - };
  137 + transition.animationOptions = SDWebImageAnimationOptionTransitionFlipFromTop;
86 138 #endif
87 139 return transition;
88 140 }
89 141  
90 142 + (SDWebImageTransition *)flipFromBottomTransition {
  143 + return [self flipFromBottomTransitionWithDuration:0.5];
  144 +}
  145 +
  146 ++ (SDWebImageTransition *)flipFromBottomTransitionWithDuration:(NSTimeInterval)duration {
91 147 SDWebImageTransition *transition = [SDWebImageTransition new];
92 148 #if SD_UIKIT
93 149 transition.animationOptions = UIViewAnimationOptionTransitionFlipFromBottom | UIViewAnimationOptionAllowUserInteraction;
94 150 #else
95   - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) {
96   - CATransition *trans = [CATransition animation];
97   - trans.type = kCATransitionPush;
98   - trans.subtype = kCATransitionFromBottom;
99   - [view.layer addAnimation:trans forKey:kCATransition];
100   - };
  151 + transition.animationOptions = SDWebImageAnimationOptionTransitionFlipFromBottom;
101 152 #endif
102 153 return transition;
103 154 }
104 155  
105 156 + (SDWebImageTransition *)curlUpTransition {
  157 + return [self curlUpTransitionWithDuration:0.5];
  158 +}
  159 +
  160 ++ (SDWebImageTransition *)curlUpTransitionWithDuration:(NSTimeInterval)duration {
106 161 SDWebImageTransition *transition = [SDWebImageTransition new];
107 162 #if SD_UIKIT
108 163 transition.animationOptions = UIViewAnimationOptionTransitionCurlUp | UIViewAnimationOptionAllowUserInteraction;
109 164 #else
110   - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) {
111   - CATransition *trans = [CATransition animation];
112   - trans.type = kCATransitionReveal;
113   - trans.subtype = kCATransitionFromTop;
114   - [view.layer addAnimation:trans forKey:kCATransition];
115   - };
  165 + transition.animationOptions = SDWebImageAnimationOptionTransitionCurlUp;
116 166 #endif
117 167 return transition;
118 168 }
119 169  
120 170 + (SDWebImageTransition *)curlDownTransition {
  171 + return [self curlDownTransitionWithDuration:0.5];
  172 +}
  173 +
  174 ++ (SDWebImageTransition *)curlDownTransitionWithDuration:(NSTimeInterval)duration {
121 175 SDWebImageTransition *transition = [SDWebImageTransition new];
122 176 #if SD_UIKIT
123 177 transition.animationOptions = UIViewAnimationOptionTransitionCurlDown | UIViewAnimationOptionAllowUserInteraction;
124 178 #else
125   - transition.animations = ^(__kindof NSView * _Nonnull view, NSImage * _Nullable image) {
126   - CATransition *trans = [CATransition animation];
127   - trans.type = kCATransitionReveal;
128   - trans.subtype = kCATransitionFromBottom;
129   - [view.layer addAnimation:trans forKey:kCATransition];
130   - };
  179 + transition.animationOptions = SDWebImageAnimationOptionTransitionCurlDown;
131 180 #endif
  181 + transition.duration = duration;
132 182 return transition;
133 183 }
134 184  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.h
... ... @@ -10,7 +10,7 @@
10 10 #import "SDWebImageCompat.h"
11 11  
12 12 /**
13   - This category is just use as a convenience method. For more detail control, use methods in `UIImage+MultiFormat.h` or directlly use `SDImageCoder`.
  13 + This category is just use as a convenience method. For more detail control, use methods in `UIImage+MultiFormat.h` or directly use `SDImageCoder`.
14 14 */
15 15 @interface UIImage (GIF)
16 16  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.h
... ... @@ -17,7 +17,7 @@
17 17 The memory cache cost for specify image used by image cache. The cost function is the bytes size held in memory.
18 18 If you set some associated object to `UIImage`, you can set the custom value to indicate the memory cost.
19 19  
20   - For `UIImage`, this method return the single frame bytes size when `image.images` is nil for static image. Retuen full frame bytes size when `image.images` is not nil for animated image.
  20 + For `UIImage`, this method return the single frame bytes size when `image.images` is nil for static image. Return full frame bytes size when `image.images` is not nil for animated image.
21 21 For `NSImage`, this method return the single frame bytes size because `NSImage` does not store all frames in memory.
22 22 @note Note that because of the limitations of category this property can get out of sync if you create another instance with CGImage or other methods.
23 23 @note For custom animated class conforms to `SDAnimatedImage`, you can override this getter method in your subclass to return a more proper value instead, which representing the current frame's total bytes.
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.h
... ... @@ -28,13 +28,21 @@
28 28  
29 29 /**
30 30 * UIKit:
31   - * Check the `images` array property
  31 + * Check the `images` array property.
32 32 * AppKit:
33 33 * NSImage currently only support animated via GIF imageRep unlike UIImage. It will check the imageRep's frame count.
34 34 */
35 35 @property (nonatomic, assign, readonly) BOOL sd_isAnimated;
36 36  
37 37 /**
  38 + * UIKit:
  39 + * Check the `isSymbolImage` property. Also check the system PDF(iOS 11+) && SVG(iOS 13+) support.
  40 + * AppKit:
  41 + * NSImage supports PDF && SVG && EPS imageRep, check the imageRep class.
  42 + */
  43 +@property (nonatomic, assign, readonly) BOOL sd_isVector;
  44 +
  45 +/**
38 46 * The image format represent the original compressed image data format.
39 47 * If you don't manually specify a format, this information is retrieve from CGImage using `CGImageGetUTType`, which may return nil for non-CG based image. At this time it will return `SDImageFormatUndefined` as default value.
40 48 * @note Note that because of the limitations of categories this property can get out of sync if you create another instance with CGImage or other methods.
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.m
... ... @@ -8,6 +8,7 @@
8 8  
9 9 #import "UIImage+Metadata.h"
10 10 #import "NSImage+Compatibility.h"
  11 +#import "SDInternalMacros.h"
11 12 #import "objc/runtime.h"
12 13  
13 14 @implementation UIImage (Metadata)
... ... @@ -32,6 +33,32 @@
32 33 return (self.images != nil);
33 34 }
34 35  
  36 +#pragma clang diagnostic push
  37 +#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  38 +- (BOOL)sd_isVector {
  39 + if (@available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)) {
  40 + // Xcode 11 supports symbol image, keep Xcode 10 compatible currently
  41 + SEL SymbolSelector = NSSelectorFromString(@"isSymbolImage");
  42 + if ([self respondsToSelector:SymbolSelector] && [self performSelector:SymbolSelector]) {
  43 + return YES;
  44 + }
  45 + // SVG
  46 + SEL SVGSelector = SD_SEL_SPI(CGSVGDocument);
  47 + if ([self respondsToSelector:SVGSelector] && [self performSelector:SVGSelector]) {
  48 + return YES;
  49 + }
  50 + }
  51 + if (@available(iOS 11.0, tvOS 11.0, watchOS 4.0, *)) {
  52 + // PDF
  53 + SEL PDFSelector = SD_SEL_SPI(CGPDFPage);
  54 + if ([self respondsToSelector:PDFSelector] && [self performSelector:PDFSelector]) {
  55 + return YES;
  56 + }
  57 + }
  58 + return NO;
  59 +}
  60 +#pragma clang diagnostic pop
  61 +
35 62 #else
36 63  
37 64 - (NSUInteger)sd_imageLoopCount {
... ... @@ -61,7 +88,7 @@
61 88 }
62 89  
63 90 - (BOOL)sd_isAnimated {
64   - BOOL isGIF = NO;
  91 + BOOL isAnimated = NO;
65 92 NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
66 93 NSImageRep *imageRep = [self bestRepresentationForRect:imageRect context:nil hints:nil];
67 94 NSBitmapImageRep *bitmapImageRep;
... ... @@ -70,9 +97,24 @@
70 97 }
71 98 if (bitmapImageRep) {
72 99 NSUInteger frameCount = [[bitmapImageRep valueForProperty:NSImageFrameCount] unsignedIntegerValue];
73   - isGIF = frameCount > 1 ? YES : NO;
  100 + isAnimated = frameCount > 1 ? YES : NO;
  101 + }
  102 + return isAnimated;
  103 +}
  104 +
  105 +- (BOOL)sd_isVector {
  106 + NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height);
  107 + NSImageRep *imageRep = [self bestRepresentationForRect:imageRect context:nil hints:nil];
  108 + if ([imageRep isKindOfClass:[NSPDFImageRep class]]) {
  109 + return YES;
  110 + }
  111 + if ([imageRep isKindOfClass:[NSEPSImageRep class]]) {
  112 + return YES;
  113 + }
  114 + if ([NSStringFromClass(imageRep.class) hasSuffix:@"NSSVGImageRep"]) {
  115 + return YES;
74 116 }
75   - return isGIF;
  117 + return NO;
76 118 }
77 119  
78 120 #endif
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.h
... ... @@ -45,6 +45,7 @@
45 45 /**
46 46 Encode the current image to the data, the image format is unspecified
47 47  
  48 + @note If the receiver is `SDAnimatedImage`, this will return the animated image data if available. No more extra encoding process.
48 49 @return The encoded data. If can't encode, return nil
49 50 */
50 51 - (nullable NSData *)sd_imageData;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h
... ... @@ -27,7 +27,7 @@ typedef NS_OPTIONS(NSUInteger, SDRectCorner) {
27 27 #endif
28 28  
29 29 /**
30   - Provide some commen method for `UIImage`.
  30 + Provide some common method for `UIImage`.
31 31 Image process is based on Core Graphics and vImage.
32 32 */
33 33 @interface UIImage (Transform)
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m
... ... @@ -9,7 +9,8 @@
9 9 #import "UIImage+Transform.h"
10 10 #import "NSImage+Compatibility.h"
11 11 #import "SDImageGraphics.h"
12   -#import "NSBezierPath+RoundedCorners.h"
  12 +#import "SDGraphicsImageRenderer.h"
  13 +#import "NSBezierPath+SDRoundedCorners.h"
13 14 #import <Accelerate/Accelerate.h>
14 15 #if SD_UIKIT || SD_MAC
15 16 #import <CoreImage/CoreImage.h>
... ... @@ -163,13 +164,29 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
163 164 return [UIColor colorWithRed:r green:g blue:b alpha:a];
164 165 }
165 166  
  167 +#if SD_UIKIT || SD_MAC
  168 +// Create-Rule, caller should call CGImageRelease
  169 +static inline CGImageRef _Nullable SDCreateCGImageFromCIImage(CIImage * _Nonnull ciImage) {
  170 + CGImageRef imageRef = NULL;
  171 + if (@available(iOS 10, macOS 10.12, tvOS 10, *)) {
  172 + imageRef = ciImage.CGImage;
  173 + }
  174 + if (!imageRef) {
  175 + CIContext *context = [CIContext context];
  176 + imageRef = [context createCGImage:ciImage fromRect:ciImage.extent];
  177 + } else {
  178 + CGImageRetain(imageRef);
  179 + }
  180 + return imageRef;
  181 +}
  182 +#endif
  183 +
166 184 @implementation UIImage (Transform)
167 185  
168   -- (void)sd_drawInRect:(CGRect)rect withScaleMode:(SDImageScaleMode)scaleMode clipsToBounds:(BOOL)clips {
  186 +- (void)sd_drawInRect:(CGRect)rect context:(CGContextRef)context scaleMode:(SDImageScaleMode)scaleMode clipsToBounds:(BOOL)clips {
169 187 CGRect drawRect = SDCGRectFitWithScaleMode(rect, self.size, scaleMode);
170 188 if (drawRect.size.width == 0 || drawRect.size.height == 0) return;
171 189 if (clips) {
172   - CGContextRef context = SDGraphicsGetCurrentContext();
173 190 if (context) {
174 191 CGContextSaveGState(context);
175 192 CGContextAddRect(context, rect);
... ... @@ -184,161 +201,214 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
184 201  
185 202 - (nullable UIImage *)sd_resizedImageWithSize:(CGSize)size scaleMode:(SDImageScaleMode)scaleMode {
186 203 if (size.width <= 0 || size.height <= 0) return nil;
187   - SDGraphicsBeginImageContextWithOptions(size, NO, self.scale);
188   - [self sd_drawInRect:CGRectMake(0, 0, size.width, size.height) withScaleMode:scaleMode clipsToBounds:NO];
189   - UIImage *image = SDGraphicsGetImageFromCurrentImageContext();
190   - SDGraphicsEndImageContext();
  204 + SDGraphicsImageRendererFormat *format = [[SDGraphicsImageRendererFormat alloc] init];
  205 + format.scale = self.scale;
  206 + SDGraphicsImageRenderer *renderer = [[SDGraphicsImageRenderer alloc] initWithSize:size format:format];
  207 + UIImage *image = [renderer imageWithActions:^(CGContextRef _Nonnull context) {
  208 + [self sd_drawInRect:CGRectMake(0, 0, size.width, size.height) context:context scaleMode:scaleMode clipsToBounds:NO];
  209 + }];
191 210 return image;
192 211 }
193 212  
194 213 - (nullable UIImage *)sd_croppedImageWithRect:(CGRect)rect {
195   - if (!self.CGImage) return nil;
196 214 rect.origin.x *= self.scale;
197 215 rect.origin.y *= self.scale;
198 216 rect.size.width *= self.scale;
199 217 rect.size.height *= self.scale;
200 218 if (rect.size.width <= 0 || rect.size.height <= 0) return nil;
201   - CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, rect);
  219 +
  220 +#if SD_UIKIT || SD_MAC
  221 + // CIImage shortcut
  222 + if (self.CIImage) {
  223 + CGRect croppingRect = CGRectMake(rect.origin.x, self.size.height - CGRectGetMaxY(rect), rect.size.width, rect.size.height);
  224 + CIImage *ciImage = [self.CIImage imageByCroppingToRect:croppingRect];
  225 +#if SD_UIKIT
  226 + UIImage *image = [UIImage imageWithCIImage:ciImage scale:self.scale orientation:self.imageOrientation];
  227 +#else
  228 + UIImage *image = [[UIImage alloc] initWithCIImage:ciImage scale:self.scale orientation:kCGImagePropertyOrientationUp];
  229 +#endif
  230 + return image;
  231 + }
  232 +#endif
  233 +
  234 + CGImageRef imageRef = self.CGImage;
202 235 if (!imageRef) {
203 236 return nil;
204 237 }
  238 +
  239 + CGImageRef croppedImageRef = CGImageCreateWithImageInRect(imageRef, rect);
  240 + if (!croppedImageRef) {
  241 + return nil;
  242 + }
205 243 #if SD_UIKIT || SD_WATCH
206   - UIImage *image = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation];
  244 + UIImage *image = [UIImage imageWithCGImage:croppedImageRef scale:self.scale orientation:self.imageOrientation];
207 245 #else
208   - UIImage *image = [[UIImage alloc] initWithCGImage:imageRef scale:self.scale orientation:kCGImagePropertyOrientationUp];
  246 + UIImage *image = [[UIImage alloc] initWithCGImage:croppedImageRef scale:self.scale orientation:kCGImagePropertyOrientationUp];
209 247 #endif
210   - CGImageRelease(imageRef);
  248 + CGImageRelease(croppedImageRef);
211 249 return image;
212 250 }
213 251  
214 252 - (nullable UIImage *)sd_roundedCornerImageWithRadius:(CGFloat)cornerRadius corners:(SDRectCorner)corners borderWidth:(CGFloat)borderWidth borderColor:(nullable UIColor *)borderColor {
215   - if (!self.CGImage) return nil;
216   - SDGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
217   - CGContextRef context = SDGraphicsGetCurrentContext();
218   - CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
219   -
220   - CGFloat minSize = MIN(self.size.width, self.size.height);
221   - if (borderWidth < minSize / 2) {
  253 + SDGraphicsImageRendererFormat *format = [[SDGraphicsImageRendererFormat alloc] init];
  254 + format.scale = self.scale;
  255 + SDGraphicsImageRenderer *renderer = [[SDGraphicsImageRenderer alloc] initWithSize:self.size format:format];
  256 + UIImage *image = [renderer imageWithActions:^(CGContextRef _Nonnull context) {
  257 + CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
  258 +
  259 + CGFloat minSize = MIN(self.size.width, self.size.height);
  260 + if (borderWidth < minSize / 2) {
222 261 #if SD_UIKIT || SD_WATCH
223   - UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(rect, borderWidth, borderWidth) byRoundingCorners:corners cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
  262 + UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(rect, borderWidth, borderWidth) byRoundingCorners:corners cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
224 263 #else
225   - NSBezierPath *path = [NSBezierPath sd_bezierPathWithRoundedRect:CGRectInset(rect, borderWidth, borderWidth) byRoundingCorners:corners cornerRadius:cornerRadius];
  264 + NSBezierPath *path = [NSBezierPath sd_bezierPathWithRoundedRect:CGRectInset(rect, borderWidth, borderWidth) byRoundingCorners:corners cornerRadius:cornerRadius];
226 265 #endif
227   - [path closePath];
  266 + [path closePath];
  267 +
  268 + CGContextSaveGState(context);
  269 + [path addClip];
  270 + [self drawInRect:rect];
  271 + CGContextRestoreGState(context);
  272 + }
228 273  
229   - CGContextSaveGState(context);
230   - [path addClip];
231   - [self drawInRect:rect];
232   - CGContextRestoreGState(context);
233   - }
234   -
235   - if (borderColor && borderWidth < minSize / 2 && borderWidth > 0) {
236   - CGFloat strokeInset = (floor(borderWidth * self.scale) + 0.5) / self.scale;
237   - CGRect strokeRect = CGRectInset(rect, strokeInset, strokeInset);
238   - CGFloat strokeRadius = cornerRadius > self.scale / 2 ? cornerRadius - self.scale / 2 : 0;
  274 + if (borderColor && borderWidth < minSize / 2 && borderWidth > 0) {
  275 + CGFloat strokeInset = (floor(borderWidth * self.scale) + 0.5) / self.scale;
  276 + CGRect strokeRect = CGRectInset(rect, strokeInset, strokeInset);
  277 + CGFloat strokeRadius = cornerRadius > self.scale / 2 ? cornerRadius - self.scale / 2 : 0;
239 278 #if SD_UIKIT || SD_WATCH
240   - UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:strokeRect byRoundingCorners:corners cornerRadii:CGSizeMake(strokeRadius, strokeRadius)];
  279 + UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:strokeRect byRoundingCorners:corners cornerRadii:CGSizeMake(strokeRadius, strokeRadius)];
241 280 #else
242   - NSBezierPath *path = [NSBezierPath sd_bezierPathWithRoundedRect:strokeRect byRoundingCorners:corners cornerRadius:strokeRadius];
  281 + NSBezierPath *path = [NSBezierPath sd_bezierPathWithRoundedRect:strokeRect byRoundingCorners:corners cornerRadius:strokeRadius];
243 282 #endif
244   - [path closePath];
245   -
246   - path.lineWidth = borderWidth;
247   - [borderColor setStroke];
248   - [path stroke];
249   - }
250   -
251   - UIImage *image = SDGraphicsGetImageFromCurrentImageContext();
252   - SDGraphicsEndImageContext();
  283 + [path closePath];
  284 +
  285 + path.lineWidth = borderWidth;
  286 + [borderColor setStroke];
  287 + [path stroke];
  288 + }
  289 + }];
253 290 return image;
254 291 }
255 292  
256 293 - (nullable UIImage *)sd_rotatedImageWithAngle:(CGFloat)angle fitSize:(BOOL)fitSize {
257   - if (!self.CGImage) return nil;
258   - size_t width = (size_t)CGImageGetWidth(self.CGImage);
259   - size_t height = (size_t)CGImageGetHeight(self.CGImage);
260   - CGRect newRect = CGRectApplyAffineTransform(CGRectMake(0., 0., width, height),
  294 + size_t width = self.size.width;
  295 + size_t height = self.size.height;
  296 + CGRect newRect = CGRectApplyAffineTransform(CGRectMake(0, 0, width, height),
261 297 fitSize ? CGAffineTransformMakeRotation(angle) : CGAffineTransformIdentity);
  298 +
  299 +#if SD_UIKIT || SD_MAC
  300 + // CIImage shortcut
  301 + if (self.CIImage) {
  302 + CIImage *ciImage = self.CIImage;
  303 + if (fitSize) {
  304 + CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
  305 + ciImage = [ciImage imageByApplyingTransform:transform];
  306 + } else {
  307 + CIFilter *filter = [CIFilter filterWithName:@"CIStraightenFilter"];
  308 + [filter setValue:ciImage forKey:kCIInputImageKey];
  309 + [filter setValue:@(angle) forKey:kCIInputAngleKey];
  310 + ciImage = filter.outputImage;
  311 + }
  312 +#if SD_UIKIT || SD_WATCH
  313 + UIImage *image = [UIImage imageWithCIImage:ciImage scale:self.scale orientation:self.imageOrientation];
  314 +#else
  315 + UIImage *image = [[UIImage alloc] initWithCIImage:ciImage scale:self.scale orientation:kCGImagePropertyOrientationUp];
  316 +#endif
  317 + return image;
  318 + }
  319 +#endif
262 320  
263   - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
264   - CGContextRef context = CGBitmapContextCreate(NULL,
265   - (size_t)newRect.size.width,
266   - (size_t)newRect.size.height,
267   - 8,
268   - (size_t)newRect.size.width * 4,
269   - colorSpace,
270   - kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
271   - CGColorSpaceRelease(colorSpace);
272   - if (!context) return nil;
273   -
274   - CGContextSetShouldAntialias(context, true);
275   - CGContextSetAllowsAntialiasing(context, true);
276   - CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
277   -
278   - CGContextTranslateCTM(context, +(newRect.size.width * 0.5), +(newRect.size.height * 0.5));
279   - CGContextRotateCTM(context, angle);
280   -
281   - CGContextDrawImage(context, CGRectMake(-(width * 0.5), -(height * 0.5), width, height), self.CGImage);
282   - CGImageRef imgRef = CGBitmapContextCreateImage(context);
  321 + SDGraphicsImageRendererFormat *format = [[SDGraphicsImageRendererFormat alloc] init];
  322 + format.scale = self.scale;
  323 + SDGraphicsImageRenderer *renderer = [[SDGraphicsImageRenderer alloc] initWithSize:newRect.size format:format];
  324 + UIImage *image = [renderer imageWithActions:^(CGContextRef _Nonnull context) {
  325 + CGContextSetShouldAntialias(context, true);
  326 + CGContextSetAllowsAntialiasing(context, true);
  327 + CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
  328 + CGContextTranslateCTM(context, +(newRect.size.width * 0.5), +(newRect.size.height * 0.5));
283 329 #if SD_UIKIT || SD_WATCH
284   - UIImage *img = [UIImage imageWithCGImage:imgRef scale:self.scale orientation:self.imageOrientation];
  330 + // Use UIKit coordinate system counterclockwise (⟲)
  331 + CGContextRotateCTM(context, -angle);
285 332 #else
286   - UIImage *img = [[UIImage alloc] initWithCGImage:imgRef scale:self.scale orientation:kCGImagePropertyOrientationUp];
  333 + CGContextRotateCTM(context, angle);
287 334 #endif
288   - CGImageRelease(imgRef);
289   - CGContextRelease(context);
290   - return img;
  335 +
  336 + [self drawInRect:CGRectMake(-(width * 0.5), -(height * 0.5), width, height)];
  337 + }];
  338 + return image;
291 339 }
292 340  
293 341 - (nullable UIImage *)sd_flippedImageWithHorizontal:(BOOL)horizontal vertical:(BOOL)vertical {
294   - if (!self.CGImage) return nil;
295   - size_t width = (size_t)CGImageGetWidth(self.CGImage);
296   - size_t height = (size_t)CGImageGetHeight(self.CGImage);
297   - size_t bytesPerRow = width * 4;
298   - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
299   - CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedFirst);
300   - CGColorSpaceRelease(colorSpace);
301   - if (!context) return nil;
302   -
303   - CGContextDrawImage(context, CGRectMake(0, 0, width, height), self.CGImage);
304   - UInt8 *data = (UInt8 *)CGBitmapContextGetData(context);
305   - if (!data) {
306   - CGContextRelease(context);
307   - return nil;
308   - }
309   - vImage_Buffer src = { data, height, width, bytesPerRow };
310   - vImage_Buffer dest = { data, height, width, bytesPerRow };
311   - if (vertical) {
312   - vImageVerticalReflect_ARGB8888(&src, &dest, kvImageBackgroundColorFill);
313   - }
314   - if (horizontal) {
315   - vImageHorizontalReflect_ARGB8888(&src, &dest, kvImageBackgroundColorFill);
316   - }
317   - CGImageRef imgRef = CGBitmapContextCreateImage(context);
318   - CGContextRelease(context);
319   -#if SD_UIKIT || SD_WATCH
320   - UIImage *img = [UIImage imageWithCGImage:imgRef scale:self.scale orientation:self.imageOrientation];
  342 + size_t width = self.size.width;
  343 + size_t height = self.size.height;
  344 +
  345 +#if SD_UIKIT || SD_MAC
  346 + // CIImage shortcut
  347 + if (self.CIImage) {
  348 + CGAffineTransform transform = CGAffineTransformIdentity;
  349 + // Use UIKit coordinate system
  350 + if (horizontal) {
  351 + CGAffineTransform flipHorizontal = CGAffineTransformMake(-1, 0, 0, 1, width, 0);
  352 + transform = CGAffineTransformConcat(transform, flipHorizontal);
  353 + }
  354 + if (vertical) {
  355 + CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, height);
  356 + transform = CGAffineTransformConcat(transform, flipVertical);
  357 + }
  358 + CIImage *ciImage = [self.CIImage imageByApplyingTransform:transform];
  359 +#if SD_UIKIT
  360 + UIImage *image = [UIImage imageWithCIImage:ciImage scale:self.scale orientation:self.imageOrientation];
321 361 #else
322   - UIImage *img = [[UIImage alloc] initWithCGImage:imgRef scale:self.scale orientation:kCGImagePropertyOrientationUp];
  362 + UIImage *image = [[UIImage alloc] initWithCIImage:ciImage scale:self.scale orientation:kCGImagePropertyOrientationUp];
  363 +#endif
  364 + return image;
  365 + }
323 366 #endif
324   - CGImageRelease(imgRef);
325   - return img;
  367 +
  368 + SDGraphicsImageRendererFormat *format = [[SDGraphicsImageRendererFormat alloc] init];
  369 + format.scale = self.scale;
  370 + SDGraphicsImageRenderer *renderer = [[SDGraphicsImageRenderer alloc] initWithSize:self.size format:format];
  371 + UIImage *image = [renderer imageWithActions:^(CGContextRef _Nonnull context) {
  372 + // Use UIKit coordinate system
  373 + if (horizontal) {
  374 + CGAffineTransform flipHorizontal = CGAffineTransformMake(-1, 0, 0, 1, width, 0);
  375 + CGContextConcatCTM(context, flipHorizontal);
  376 + }
  377 + if (vertical) {
  378 + CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, height);
  379 + CGContextConcatCTM(context, flipVertical);
  380 + }
  381 + [self drawInRect:CGRectMake(0, 0, width, height)];
  382 + }];
  383 + return image;
326 384 }
327 385  
328 386 #pragma mark - Image Blending
329 387  
330 388 - (nullable UIImage *)sd_tintedImageWithColor:(nonnull UIColor *)tintColor {
331   - if (!self.CGImage) return nil;
332   - if (!tintColor.CGColor) return nil;
333   -
334 389 BOOL hasTint = CGColorGetAlpha(tintColor.CGColor) > __FLT_EPSILON__;
335 390 if (!hasTint) {
336   -#if SD_UIKIT || SD_WATCH
337   - return [UIImage imageWithCGImage:self.CGImage scale:self.scale orientation:self.imageOrientation];
  391 + return self;
  392 + }
  393 +
  394 +#if SD_UIKIT || SD_MAC
  395 + // CIImage shortcut
  396 + if (self.CIImage) {
  397 + CIImage *ciImage = self.CIImage;
  398 + CIImage *colorImage = [CIImage imageWithColor:[[CIColor alloc] initWithColor:tintColor]];
  399 + colorImage = [colorImage imageByCroppingToRect:ciImage.extent];
  400 + CIFilter *filter = [CIFilter filterWithName:@"CISourceAtopCompositing"];
  401 + [filter setValue:colorImage forKey:kCIInputImageKey];
  402 + [filter setValue:ciImage forKey:kCIInputBackgroundImageKey];
  403 + ciImage = filter.outputImage;
  404 +#if SD_UIKIT
  405 + UIImage *image = [UIImage imageWithCIImage:ciImage scale:self.scale orientation:self.imageOrientation];
338 406 #else
339   - return [[UIImage alloc] initWithCGImage:self.CGImage scale:self.scale orientation:kCGImagePropertyOrientationUp];
  407 + UIImage *image = [[UIImage alloc] initWithCIImage:ciImage scale:self.scale orientation:kCGImagePropertyOrientationUp];
340 408 #endif
  409 + return image;
341 410 }
  411 +#endif
342 412  
343 413 CGSize size = self.size;
344 414 CGRect rect = { CGPointZero, size };
... ... @@ -347,23 +417,30 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
347 417 // blend mode, see https://en.wikipedia.org/wiki/Alpha_compositing
348 418 CGBlendMode blendMode = kCGBlendModeSourceAtop;
349 419  
350   - SDGraphicsBeginImageContextWithOptions(size, NO, scale);
351   - CGContextRef context = SDGraphicsGetCurrentContext();
352   - [self drawInRect:rect];
353   - CGContextSetBlendMode(context, blendMode);
354   - CGContextSetFillColorWithColor(context, tintColor.CGColor);
355   - CGContextFillRect(context, rect);
356   - UIImage *image = SDGraphicsGetImageFromCurrentImageContext();
357   - SDGraphicsEndImageContext();
358   -
  420 + SDGraphicsImageRendererFormat *format = [[SDGraphicsImageRendererFormat alloc] init];
  421 + format.scale = scale;
  422 + SDGraphicsImageRenderer *renderer = [[SDGraphicsImageRenderer alloc] initWithSize:size format:format];
  423 + UIImage *image = [renderer imageWithActions:^(CGContextRef _Nonnull context) {
  424 + [self drawInRect:rect];
  425 + CGContextSetBlendMode(context, blendMode);
  426 + CGContextSetFillColorWithColor(context, tintColor.CGColor);
  427 + CGContextFillRect(context, rect);
  428 + }];
359 429 return image;
360 430 }
361 431  
362 432 - (nullable UIColor *)sd_colorAtPoint:(CGPoint)point {
363   - if (!self) {
364   - return nil;
  433 + CGImageRef imageRef = NULL;
  434 + // CIImage compatible
  435 +#if SD_UIKIT || SD_MAC
  436 + if (self.CIImage) {
  437 + imageRef = SDCreateCGImageFromCIImage(self.CIImage);
  438 + }
  439 +#endif
  440 + if (!imageRef) {
  441 + imageRef = self.CGImage;
  442 + CGImageRetain(imageRef);
365 443 }
366   - CGImageRef imageRef = self.CGImage;
367 444 if (!imageRef) {
368 445 return nil;
369 446 }
... ... @@ -372,42 +449,53 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
372 449 CGFloat width = CGImageGetWidth(imageRef);
373 450 CGFloat height = CGImageGetHeight(imageRef);
374 451 if (point.x < 0 || point.y < 0 || point.x >= width || point.y >= height) {
  452 + CGImageRelease(imageRef);
375 453 return nil;
376 454 }
377 455  
378 456 // Get pixels
379 457 CGDataProviderRef provider = CGImageGetDataProvider(imageRef);
380 458 if (!provider) {
  459 + CGImageRelease(imageRef);
381 460 return nil;
382 461 }
383 462 CFDataRef data = CGDataProviderCopyData(provider);
384 463 if (!data) {
  464 + CGImageRelease(imageRef);
385 465 return nil;
386 466 }
387 467  
388 468 // Get pixel at point
389 469 size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);
390 470 size_t components = CGImageGetBitsPerPixel(imageRef) / CGImageGetBitsPerComponent(imageRef);
  471 + CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
391 472  
392 473 CFRange range = CFRangeMake(bytesPerRow * point.y + components * point.x, 4);
393 474 if (CFDataGetLength(data) < range.location + range.length) {
394 475 CFRelease(data);
  476 + CGImageRelease(imageRef);
395 477 return nil;
396 478 }
397 479 Pixel_8888 pixel = {0};
398 480 CFDataGetBytes(data, range, pixel);
399 481 CFRelease(data);
400   -
  482 + CGImageRelease(imageRef);
401 483 // Convert to color
402   - CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
403 484 return SDGetColorFromPixel(pixel, bitmapInfo);
404 485 }
405 486  
406 487 - (nullable NSArray<UIColor *> *)sd_colorsWithRect:(CGRect)rect {
407   - if (!self) {
408   - return nil;
  488 + CGImageRef imageRef = NULL;
  489 + // CIImage compatible
  490 +#if SD_UIKIT || SD_MAC
  491 + if (self.CIImage) {
  492 + imageRef = SDCreateCGImageFromCIImage(self.CIImage);
  493 + }
  494 +#endif
  495 + if (!imageRef) {
  496 + imageRef = self.CGImage;
  497 + CGImageRetain(imageRef);
409 498 }
410   - CGImageRef imageRef = self.CGImage;
411 499 if (!imageRef) {
412 500 return nil;
413 501 }
... ... @@ -416,16 +504,19 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
416 504 CGFloat width = CGImageGetWidth(imageRef);
417 505 CGFloat height = CGImageGetHeight(imageRef);
418 506 if (CGRectGetWidth(rect) <= 0 || CGRectGetHeight(rect) <= 0 || CGRectGetMinX(rect) < 0 || CGRectGetMinY(rect) < 0 || CGRectGetMaxX(rect) > width || CGRectGetMaxY(rect) > height) {
  507 + CGImageRelease(imageRef);
419 508 return nil;
420 509 }
421 510  
422 511 // Get pixels
423 512 CGDataProviderRef provider = CGImageGetDataProvider(imageRef);
424 513 if (!provider) {
  514 + CGImageRelease(imageRef);
425 515 return nil;
426 516 }
427 517 CFDataRef data = CGDataProviderCopyData(provider);
428 518 if (!data) {
  519 + CGImageRelease(imageRef);
429 520 return nil;
430 521 }
431 522  
... ... @@ -437,6 +528,7 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
437 528 size_t end = bytesPerRow * (CGRectGetMaxY(rect) - 1) + components * CGRectGetMaxX(rect);
438 529 if (CFDataGetLength(data) < (CFIndex)end) {
439 530 CFRelease(data);
  531 + CGImageRelease(imageRef);
440 532 return nil;
441 533 }
442 534  
... ... @@ -460,29 +552,53 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
460 552 [colors addObject:color];
461 553 }
462 554 CFRelease(data);
  555 + CGImageRelease(imageRef);
463 556  
464 557 return [colors copy];
465 558 }
466 559  
467 560 #pragma mark - Image Effect
468 561  
469   -// We use vImage to do box convolve for performance and support for watchOS. However, you can just use `CIFilter.CIBoxBlur`. For other blur effect, use any filter in `CICategoryBlur`
  562 +// We use vImage to do box convolve for performance and support for watchOS. However, you can just use `CIFilter.CIGaussianBlur`. For other blur effect, use any filter in `CICategoryBlur`
470 563 - (nullable UIImage *)sd_blurredImageWithRadius:(CGFloat)blurRadius {
471 564 if (self.size.width < 1 || self.size.height < 1) {
472 565 return nil;
473 566 }
474   - if (!self.CGImage) {
475   - return nil;
476   - }
477   -
478 567 BOOL hasBlur = blurRadius > __FLT_EPSILON__;
479 568 if (!hasBlur) {
480 569 return self;
481 570 }
482 571  
483 572 CGFloat scale = self.scale;
  573 + CGFloat inputRadius = blurRadius * scale;
  574 +#if SD_UIKIT || SD_MAC
  575 + if (self.CIImage) {
  576 + CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
  577 + [filter setValue:self.CIImage forKey:kCIInputImageKey];
  578 + [filter setValue:@(inputRadius) forKey:kCIInputRadiusKey];
  579 + CIImage *ciImage = filter.outputImage;
  580 + ciImage = [ciImage imageByCroppingToRect:CGRectMake(0, 0, self.size.width, self.size.height)];
  581 +#if SD_UIKIT
  582 + UIImage *image = [UIImage imageWithCIImage:ciImage scale:self.scale orientation:self.imageOrientation];
  583 +#else
  584 + UIImage *image = [[UIImage alloc] initWithCIImage:ciImage scale:self.scale orientation:kCGImagePropertyOrientationUp];
  585 +#endif
  586 + return image;
  587 + }
  588 +#endif
  589 +
484 590 CGImageRef imageRef = self.CGImage;
485 591  
  592 + //convert to BGRA if it isn't
  593 + if (CGImageGetBitsPerPixel(imageRef) != 32 ||
  594 + CGImageGetBitsPerComponent(imageRef) != 8 ||
  595 + !((CGImageGetBitmapInfo(imageRef) & kCGBitmapAlphaInfoMask))) {
  596 + SDGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
  597 + [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];
  598 + imageRef = SDGraphicsGetImageFromCurrentImageContext().CGImage;
  599 + SDGraphicsEndImageContext();
  600 + }
  601 +
486 602 vImage_Buffer effect = {}, scratch = {};
487 603 vImage_Buffer *input = NULL, *output = NULL;
488 604  
... ... @@ -490,14 +606,14 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
490 606 .bitsPerComponent = 8,
491 607 .bitsPerPixel = 32,
492 608 .colorSpace = NULL,
493   - .bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, //requests a BGRA buffer.
  609 + .bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host, //requests a BGRA buffer.
494 610 .version = 0,
495 611 .decode = NULL,
496 612 .renderingIntent = kCGRenderingIntentDefault
497 613 };
498 614  
499 615 vImage_Error err;
500   - err = vImageBuffer_InitWithCGImage(&effect, &format, NULL, imageRef, kvImagePrintDiagnosticsToConsole);
  616 + err = vImageBuffer_InitWithCGImage(&effect, &format, NULL, imageRef, kvImageNoFlags);
501 617 if (err != kvImageNoError) {
502 618 NSLog(@"UIImage+Transform error: vImageBuffer_InitWithCGImage returned error code %zi for inputImage: %@", err, self);
503 619 return nil;
... ... @@ -524,9 +640,8 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
524 640 //
525 641 // ... if d is odd, use three box-blurs of size 'd', centered on the output pixel.
526 642 //
527   - CGFloat inputRadius = blurRadius * scale;
528 643 if (inputRadius - 2.0 < __FLT_EPSILON__) inputRadius = 2.0;
529   - uint32_t radius = floor((inputRadius * 3.0 * sqrt(2 * M_PI) / 4 + 0.5) / 2);
  644 + uint32_t radius = floor(inputRadius * 3.0 * sqrt(2 * M_PI) / 4 + 0.5);
530 645 radius |= 1; // force radius to be odd so that the three box-blur methodology works.
531 646 int iterations;
532 647 if (blurRadius * scale < 0.5) iterations = 1;
... ... @@ -562,12 +677,19 @@ static inline UIColor * SDGetColorFromPixel(Pixel_8888 pixel, CGBitmapInfo bitma
562 677  
563 678 #if SD_UIKIT || SD_MAC
564 679 - (nullable UIImage *)sd_filteredImageWithFilter:(nonnull CIFilter *)filter {
565   - if (!self.CGImage) return nil;
566   -
567   - CIContext *context = [CIContext context];
568   - CIImage *inputImage = [CIImage imageWithCGImage:self.CGImage];
  680 + CIImage *inputImage;
  681 + if (self.CIImage) {
  682 + inputImage = self.CIImage;
  683 + } else {
  684 + CGImageRef imageRef = self.CGImage;
  685 + if (!imageRef) {
  686 + return nil;
  687 + }
  688 + inputImage = [CIImage imageWithCGImage:imageRef];
  689 + }
569 690 if (!inputImage) return nil;
570 691  
  692 + CIContext *context = [CIContext context];
571 693 [filter setValue:inputImage forKey:kCIInputImageKey];
572 694 CIImage *outputImage = filter.outputImage;
573 695 if (!outputImage) return nil;
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.h
... ... @@ -32,10 +32,18 @@ typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable ima
32 32 @property (nonatomic, strong, readonly, nullable) NSURL *sd_imageURL;
33 33  
34 34 /**
  35 + * Get the current image operation key. Operation key is used to identify the different queries for one view instance (like UIButton).
  36 + * See more about this in `SDWebImageContextSetImageOperationKey`.
  37 + * If you cancel current image load, the key will be set to nil.
  38 + * @note You can use method `UIView+WebCacheOperation` to investigate different queries' operation.
  39 + */
  40 +@property (nonatomic, strong, readonly, nullable) NSString *sd_latestOperationKey;
  41 +
  42 +/**
35 43 * The current image loading progress associated to the view. The unit count is the received size and excepted size of download.
36 44 * The `totalUnitCount` and `completedUnitCount` will be reset to 0 after a new image loading start (change from current queue). And they will be set to `SDWebImageProgressUnitCountUnknown` if the progressBlock not been called but the image loading success to mark the progress finished (change from main queue).
37   - * @note You can use Key-Value Observing on the progress, but you should take care that the change to progress is from a background queue during download(the same as progressBlock). If you want to using KVO and update the UI, make sure to dispatch on the main queue. And it's recommand to use some KVO libs like KVOController because it's more safe and easy to use.
38   - * @note The getter will create a progress instance if the value is nil. But by default, we don't create one. If you need to use Key-Value Observing, you must trigger the getter or set a custom progresss instance before the loading start. The default value is nil.
  45 + * @note You can use Key-Value Observing on the progress, but you should take care that the change to progress is from a background queue during download(the same as progressBlock). If you want to using KVO and update the UI, make sure to dispatch on the main queue. And it's recommend to use some KVO libs like KVOController because it's more safe and easy to use.
  46 + * @note The getter will create a progress instance if the value is nil. But by default, we don't create one. If you need to use Key-Value Observing, you must trigger the getter or set a custom progress instance before the loading start. The default value is nil.
39 47 * @note Note that because of the limitations of categories this property can get out of sync if you update the progress directly.
40 48 */
41 49 @property (nonatomic, strong, null_resettable) NSProgress *sd_imageProgress;
... ... @@ -59,7 +67,7 @@ typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable ima
59 67 * The forth parameter is an `SDImageCacheType` enum indicating if the image was retrieved from the local cache
60 68 * or from the memory cache or from the network.
61 69 *
62   - * The fith parameter normally is always YES. However, if you provide SDWebImageAvoidAutoSetImage with SDWebImageProgressiveLoad options to enable progressive downloading and set the image yourself. This block is thus called repeatedly with a partial image. When image is fully downloaded, the
  70 + * The fifth parameter normally is always YES. However, if you provide SDWebImageAvoidAutoSetImage with SDWebImageProgressiveLoad options to enable progressive downloading and set the image yourself. This block is thus called repeatedly with a partial image. When image is fully downloaded, the
63 71 * block is called a last time with the full image and the last parameter set to YES.
64 72 *
65 73 * The last parameter is the original image URL
... ... @@ -83,7 +91,7 @@ typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable ima
83 91  
84 92 /**
85 93 The image transition when image load finished. See `SDWebImageTransition`.
86   - If you specify nil, do not do transition. Defautls to nil.
  94 + If you specify nil, do not do transition. Defaults to nil.
87 95 */
88 96 @property (nonatomic, strong, nullable) SDWebImageTransition *sd_imageTransition;
89 97  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.m
... ... @@ -11,6 +11,7 @@
11 11 #import "UIView+WebCacheOperation.h"
12 12 #import "SDWebImageError.h"
13 13 #import "SDInternalMacros.h"
  14 +#import "SDWebImageTransitionInternal.h"
14 15  
15 16 const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
16 17  
... ... @@ -52,10 +53,19 @@ const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
52 53 setImageBlock:(nullable SDSetImageBlock)setImageBlock
53 54 progress:(nullable SDImageLoaderProgressBlock)progressBlock
54 55 completed:(nullable SDInternalCompletionBlock)completedBlock {
55   - context = [context copy]; // copy to avoid mutable object
  56 + if (context) {
  57 + // copy to avoid mutable object
  58 + context = [context copy];
  59 + } else {
  60 + context = [NSDictionary dictionary];
  61 + }
56 62 NSString *validOperationKey = context[SDWebImageContextSetImageOperationKey];
57 63 if (!validOperationKey) {
  64 + // pass through the operation key to downstream, which can used for tracing operation or image view class
58 65 validOperationKey = NSStringFromClass([self class]);
  66 + SDWebImageMutableContext *mutableContext = [context mutableCopy];
  67 + mutableContext[SDWebImageContextSetImageOperationKey] = validOperationKey;
  68 + context = [mutableContext copy];
59 69 }
60 70 self.sd_latestOperationKey = validOperationKey;
61 71 [self sd_cancelImageLoadOperationWithKey:validOperationKey];
... ... @@ -80,10 +90,14 @@ const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
80 90 [self sd_startImageIndicator];
81 91 id<SDWebImageIndicator> imageIndicator = self.sd_imageIndicator;
82 92 #endif
83   -
84 93 SDWebImageManager *manager = context[SDWebImageContextCustomManager];
85 94 if (!manager) {
86 95 manager = [SDWebImageManager sharedManager];
  96 + } else {
  97 + // remove this manager to avoid retain cycle (manger -> loader -> operation -> context -> manager)
  98 + SDWebImageMutableContext *mutableContext = [context mutableCopy];
  99 + mutableContext[SDWebImageContextCustomManager] = nil;
  100 + context = [mutableContext copy];
87 101 }
88 102  
89 103 SDImageLoaderProgressBlock combinedProgressBlock = ^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
... ... @@ -189,6 +203,7 @@ const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
189 203  
190 204 - (void)sd_cancelCurrentImageLoad {
191 205 [self sd_cancelImageLoadOperationWithKey:self.sd_latestOperationKey];
  206 + self.sd_latestOperationKey = nil;
192 207 }
193 208  
194 209 - (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBlock cacheType:(SDImageCacheType)cacheType imageURL:(NSURL *)imageURL {
... ... @@ -237,22 +252,38 @@ const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
237 252 if (transition) {
238 253 #if SD_UIKIT
239 254 [UIView transitionWithView:view duration:0 options:0 animations:^{
  255 + if (!view.sd_latestOperationKey) {
  256 + return;
  257 + }
240 258 // 0 duration to let UIKit render placeholder and prepares block
241 259 if (transition.prepares) {
242 260 transition.prepares(view, image, imageData, cacheType, imageURL);
243 261 }
244 262 } completion:^(BOOL finished) {
245 263 [UIView transitionWithView:view duration:transition.duration options:transition.animationOptions animations:^{
  264 + if (!view.sd_latestOperationKey) {
  265 + return;
  266 + }
246 267 if (finalSetImageBlock && !transition.avoidAutoSetImage) {
247 268 finalSetImageBlock(image, imageData, cacheType, imageURL);
248 269 }
249 270 if (transition.animations) {
250 271 transition.animations(view, image);
251 272 }
252   - } completion:transition.completion];
  273 + } completion:^(BOOL finished) {
  274 + if (!view.sd_latestOperationKey) {
  275 + return;
  276 + }
  277 + if (transition.completion) {
  278 + transition.completion(finished);
  279 + }
  280 + }];
253 281 }];
254 282 #elif SD_MAC
255 283 [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull prepareContext) {
  284 + if (!view.sd_latestOperationKey) {
  285 + return;
  286 + }
256 287 // 0 duration to let AppKit render placeholder and prepares block
257 288 prepareContext.duration = 0;
258 289 if (transition.prepares) {
... ... @@ -260,16 +291,33 @@ const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
260 291 }
261 292 } completionHandler:^{
262 293 [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) {
  294 + if (!view.sd_latestOperationKey) {
  295 + return;
  296 + }
263 297 context.duration = transition.duration;
264   - context.timingFunction = transition.timingFunction;
  298 +#pragma clang diagnostic push
  299 +#pragma clang diagnostic ignored "-Wdeprecated-declarations"
  300 + CAMediaTimingFunction *timingFunction = transition.timingFunction;
  301 +#pragma clang diagnostic pop
  302 + if (!timingFunction) {
  303 + timingFunction = SDTimingFunctionFromAnimationOptions(transition.animationOptions);
  304 + }
  305 + context.timingFunction = timingFunction;
265 306 context.allowsImplicitAnimation = SD_OPTIONS_CONTAINS(transition.animationOptions, SDWebImageAnimationOptionAllowsImplicitAnimation);
266 307 if (finalSetImageBlock && !transition.avoidAutoSetImage) {
267 308 finalSetImageBlock(image, imageData, cacheType, imageURL);
268 309 }
  310 + CATransition *trans = SDTransitionFromAnimationOptions(transition.animationOptions);
  311 + if (trans) {
  312 + [view.layer addAnimation:trans forKey:kCATransition];
  313 + }
269 314 if (transition.animations) {
270 315 transition.animations(view, image);
271 316 }
272 317 } completionHandler:^{
  318 + if (!view.sd_latestOperationKey) {
  319 + return;
  320 + }
273 321 if (transition.completion) {
274 322 transition.completion(YES);
275 323 }
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.h
... ... @@ -11,7 +11,7 @@
11 11  
12 12 /**
13 13 These methods are used to support canceling for UIView image loading, it's designed to be used internal but not external.
14   - All the stored operations are weak, so it will be dalloced after image loading finished. If you need to store operations, use your own class to keep a strong reference for them.
  14 + All the stored operations are weak, so it will be dealloced after image loading finished. If you need to store operations, use your own class to keep a strong reference for them.
15 15 */
16 16 @interface UIView (WebCacheOperation)
17 17  
... ...
Example/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.m
... ... @@ -12,7 +12,7 @@
12 12 static char loadOperationKey;
13 13  
14 14 // key is strong, value is weak because operation instance is retained by SDWebImageManager's runningOperations property
15   -// we should use lock to keep thread-safe because these method may not be acessed from main queue
  15 +// we should use lock to keep thread-safe because these method may not be accessed from main queue
16 16 typedef NSMapTable<NSString *, id<SDWebImageOperation>> SDOperationsDictionary;
17 17  
18 18 @implementation UIView (WebCacheOperation)
... ...
Example/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+RoundedCorners.h deleted 100644 → 0
1   -/*
2   - * This file is part of the SDWebImage package.
3   - * (c) Olivier Poitrey <rs@dailymotion.com>
4   - *
5   - * For the full copyright and license information, please view the LICENSE
6   - * file that was distributed with this source code.
7   - */
8   -
9   -#import "SDWebImageCompat.h"
10   -
11   -#if SD_MAC
12   -
13   -#import "UIImage+Transform.h"
14   -
15   -@interface NSBezierPath (RoundedCorners)
16   -
17   -/**
18   - Convenience way to create a bezier path with the specify rounding corners on macOS. Same as the one on `UIBezierPath`.
19   - */
20   -+ (nonnull instancetype)sd_bezierPathWithRoundedRect:(NSRect)rect byRoundingCorners:(SDRectCorner)corners cornerRadius:(CGFloat)cornerRadius;
21   -
22   -@end
23   -
24   -#endif
Example/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+RoundedCorners.m deleted 100644 → 0
1   -/*
2   - * This file is part of the SDWebImage package.
3   - * (c) Olivier Poitrey <rs@dailymotion.com>
4   - *
5   - * For the full copyright and license information, please view the LICENSE
6   - * file that was distributed with this source code.
7   - */
8   -
9   -#import "NSBezierPath+RoundedCorners.h"
10   -
11   -#if SD_MAC
12   -
13   -@implementation NSBezierPath (RoundedCorners)
14   -
15   -+ (instancetype)sd_bezierPathWithRoundedRect:(NSRect)rect byRoundingCorners:(SDRectCorner)corners cornerRadius:(CGFloat)cornerRadius {
16   - NSBezierPath *path = [NSBezierPath bezierPath];
17   -
18   - CGFloat maxCorner = MIN(NSWidth(rect), NSHeight(rect)) / 2;
19   -
20   - CGFloat topLeftRadius = MIN(maxCorner, (corners & SDRectCornerTopLeft) ? cornerRadius : 0);
21   - CGFloat topRightRadius = MIN(maxCorner, (corners & SDRectCornerTopRight) ? cornerRadius : 0);
22   - CGFloat bottomLeftRadius = MIN(maxCorner, (corners & SDRectCornerBottomLeft) ? cornerRadius : 0);
23   - CGFloat bottomRightRadius = MIN(maxCorner, (corners & SDRectCornerBottomRight) ? cornerRadius : 0);
24   -
25   - NSPoint topLeft = NSMakePoint(NSMinX(rect), NSMaxY(rect));
26   - NSPoint topRight = NSMakePoint(NSMaxX(rect), NSMaxY(rect));
27   - NSPoint bottomLeft = NSMakePoint(NSMinX(rect), NSMinY(rect));
28   - NSPoint bottomRight = NSMakePoint(NSMaxX(rect), NSMinY(rect));
29   -
30   - [path moveToPoint:NSMakePoint(NSMidX(rect), NSMaxY(rect))];
31   - [path appendBezierPathWithArcFromPoint:topLeft toPoint:bottomLeft radius:topLeftRadius];
32   - [path appendBezierPathWithArcFromPoint:bottomLeft toPoint:bottomRight radius:bottomLeftRadius];
33   - [path appendBezierPathWithArcFromPoint:bottomRight toPoint:topRight radius:bottomRightRadius];
34   - [path appendBezierPathWithArcFromPoint:topRight toPoint:topLeft radius:topRightRadius];
35   - [path closePath];
36   -
37   - return path;
38   -}
39   -
40   -@end
41   -
42   -#endif
Example/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.h
... ... @@ -11,6 +11,7 @@
11 11 @class SDAsyncBlockOperation;
12 12 typedef void (^SDAsyncBlock)(SDAsyncBlockOperation * __nonnull asyncOperation);
13 13  
  14 +/// A async block operation, success after you call `completer` (not like `NSBlockOperation` which is for sync block, success on return)
14 15 @interface SDAsyncBlockOperation : NSOperation
15 16  
16 17 - (nonnull instancetype)initWithBlock:(nonnull SDAsyncBlock)block;
... ...
Example/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m
... ... @@ -35,33 +35,58 @@
35 35 }
36 36  
37 37 - (void)start {
38   - if (self.isCancelled) {
39   - return;
40   - }
41   -
42   - [self willChangeValueForKey:@"isExecuting"];
43   - self.executing = YES;
44   - [self didChangeValueForKey:@"isExecuting"];
45   -
46   - if (self.executionBlock) {
47   - self.executionBlock(self);
48   - } else {
49   - [self complete];
  38 + @synchronized (self) {
  39 + if (self.isCancelled) {
  40 + self.finished = YES;
  41 + return;
  42 + }
  43 +
  44 + self.finished = NO;
  45 + self.executing = YES;
  46 +
  47 + if (self.executionBlock) {
  48 + self.executionBlock(self);
  49 + } else {
  50 + self.executing = NO;
  51 + self.finished = YES;
  52 + }
50 53 }
51 54 }
52 55  
53 56 - (void)cancel {
54   - [super cancel];
55   - [self complete];
  57 + @synchronized (self) {
  58 + [super cancel];
  59 + if (self.isExecuting) {
  60 + self.executing = NO;
  61 + self.finished = YES;
  62 + }
  63 + }
56 64 }
57 65  
  66 +
58 67 - (void)complete {
59   - [self willChangeValueForKey:@"isExecuting"];
  68 + @synchronized (self) {
  69 + if (self.isExecuting) {
  70 + self.finished = YES;
  71 + self.executing = NO;
  72 + }
  73 + }
  74 + }
  75 +
  76 +- (void)setFinished:(BOOL)finished {
60 77 [self willChangeValueForKey:@"isFinished"];
61   - self.executing = NO;
62   - self.finished = YES;
63   - [self didChangeValueForKey:@"isExecuting"];
  78 + _finished = finished;
64 79 [self didChangeValueForKey:@"isFinished"];
65 80 }
66 81  
  82 +- (void)setExecuting:(BOOL)executing {
  83 + [self willChangeValueForKey:@"isExecuting"];
  84 + _executing = executing;
  85 + [self didChangeValueForKey:@"isExecuting"];
  86 +}
  87 +
  88 +- (BOOL)isConcurrent {
  89 + return YES;
  90 +}
  91 +
67 92 @end
... ...
Example/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.h
... ... @@ -9,8 +9,8 @@
9 9 #import <Foundation/Foundation.h>
10 10 #import "SDWebImageCompat.h"
11 11  
12   -// Apple parse the Asset Catalog compiled file(`Assets.car`) by CoreUI.framework, however it's a private framework and there are no other ways to directly get the data. So we just process the normal bundle files :)
13   -
  12 +/// A Image-Asset manager to work like UIKit/AppKit's image cache behavior
  13 +/// Apple parse the Asset Catalog compiled file(`Assets.car`) by CoreUI.framework, however it's a private framework and there are no other ways to directly get the data. So we just process the normal bundle files :)
14 14 @interface SDImageAssetManager : NSObject
15 15  
16 16 @property (nonatomic, strong, nonnull) NSMapTable<NSString *, UIImage *> *imageTable;
... ...
Example/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.h
... ... @@ -9,7 +9,7 @@
9 9 #import <Foundation/Foundation.h>
10 10 #import "SDWebImageCompat.h"
11 11  
12   -// This is used for operation management, but not for operation queue execute
  12 +/// This is used for operation management, but not for operation queue execute
13 13 @interface SDImageCachesManagerOperation : NSOperation
14 14  
15 15 @property (nonatomic, assign, readonly) NSUInteger pendingCount;
... ...
Example/Pods/SDWebImage/SDWebImage/Private/SDImageIOAnimatedCoderInternal.h
... ... @@ -13,5 +13,6 @@
13 13  
14 14 + (NSTimeInterval)frameDurationAtIndex:(NSUInteger)index source:(nonnull CGImageSourceRef)source;
15 15 + (NSUInteger)imageLoopCountWithSource:(nonnull CGImageSourceRef)source;
  16 ++ (nullable UIImage *)createFrameAtIndex:(NSUInteger)index source:(nonnull CGImageSourceRef)source scale:(CGFloat)scale preserveAspectRatio:(BOOL)preserveAspectRatio thumbnailSize:(CGSize)thumbnailSize options:(nullable NSDictionary *)options;
16 17  
17 18 @end
... ...
Example/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.h
... ... @@ -21,6 +21,18 @@
21 21 #define SD_OPTIONS_CONTAINS(options, value) (((options) & (value)) == (value))
22 22 #endif
23 23  
  24 +#ifndef SD_CSTRING
  25 +#define SD_CSTRING(str) #str
  26 +#endif
  27 +
  28 +#ifndef SD_NSSTRING
  29 +#define SD_NSSTRING(str) @(SD_CSTRING(str))
  30 +#endif
  31 +
  32 +#ifndef SD_SEL_SPI
  33 +#define SD_SEL_SPI(name) NSSelectorFromString([NSString stringWithFormat:@"_%@", SD_NSSTRING(name)])
  34 +#endif
  35 +
24 36 #ifndef weakify
25 37 #define weakify(...) \
26 38 sd_keywordify \
... ...
Example/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.h
... ... @@ -9,6 +9,7 @@
9 9 #import <Foundation/Foundation.h>
10 10 #import "SDWebImageCompat.h"
11 11  
  12 +/// A weak proxy which forward all the message to the target
12 13 @interface SDWeakProxy : NSProxy
13 14  
14 15 @property (nonatomic, weak, readonly, nullable) id target;
... ...
Example/Pods/SDWebImage/SDWebImage/Private/UIColor+HexString.h deleted 100644 → 0
1   -/*
2   - * This file is part of the SDWebImage package.
3   - * (c) Olivier Poitrey <rs@dailymotion.com>
4   - *
5   - * For the full copyright and license information, please view the LICENSE
6   - * file that was distributed with this source code.
7   - */
8   -
9   -#import "SDWebImageCompat.h"
10   -
11   -@interface UIColor (HexString)
12   -
13   -/**
14   - Convenience way to get hex string from color. The output should always be 32-bit RGBA hex string like `#00000000`.
15   - */
16   -@property (nonatomic, copy, readonly, nonnull) NSString *sd_hexString;
17   -
18   -@end
Example/Pods/SDWebImage/SDWebImage/Private/UIColor+HexString.m deleted 100644 → 0
1   -/*
2   - * This file is part of the SDWebImage package.
3   - * (c) Olivier Poitrey <rs@dailymotion.com>
4   - *
5   - * For the full copyright and license information, please view the LICENSE
6   - * file that was distributed with this source code.
7   - */
8   -
9   -#import "UIColor+HexString.h"
10   -
11   -@implementation UIColor (HexString)
12   -
13   -- (NSString *)sd_hexString {
14   - CGFloat red, green, blue, alpha;
15   -#if SD_UIKIT
16   - if (![self getRed:&red green:&green blue:&blue alpha:&alpha]) {
17   - [self getWhite:&red alpha:&alpha];
18   - green = red;
19   - blue = red;
20   - }
21   -#else
22   - @try {
23   - [self getRed:&red green:&green blue:&blue alpha:&alpha];
24   - }
25   - @catch (NSException *exception) {
26   - [self getWhite:&red alpha:&alpha];
27   - green = red;
28   - blue = red;
29   - }
30   -#endif
31   -
32   - red = roundf(red * 255.f);
33   - green = roundf(green * 255.f);
34   - blue = roundf(blue * 255.f);
35   - alpha = roundf(alpha * 255.f);
36   -
37   - uint hex = ((uint)alpha << 24) | ((uint)red << 16) | ((uint)green << 8) | ((uint)blue);
38   -
39   - return [NSString stringWithFormat:@"#%08x", hex];
40   -}
41   -
42   -@end
Example/Pods/SDWebImage/WebImage/SDWebImage.h
... ... @@ -9,17 +9,13 @@
9 9  
10 10 #import <SDWebImage/SDWebImageCompat.h>
11 11  
12   -#if SD_UIKIT
13   -#import <UIKit/UIKit.h>
14   -#endif
15   -
16   -//! Project version number for WebImage.
17   -FOUNDATION_EXPORT double WebImageVersionNumber;
  12 +//! Project version number for SDWebImage.
  13 +FOUNDATION_EXPORT double SDWebImageVersionNumber;
18 14  
19   -//! Project version string for WebImage.
20   -FOUNDATION_EXPORT const unsigned char WebImageVersionString[];
  15 +//! Project version string for SDWebImage.
  16 +FOUNDATION_EXPORT const unsigned char SDWebImageVersionString[];
21 17  
22   -// In this header, you should import all the public headers of your framework using statements like #import <WebImage/PublicHeader.h>
  18 +// In this header, you should import all the public headers of your framework using statements like #import <SDWebImage/PublicHeader.h>
23 19  
24 20 #import <SDWebImage/SDWebImageManager.h>
25 21 #import <SDWebImage/SDWebImageCacheKeyFilter.h>
... ... @@ -36,6 +32,8 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[];
36 32 #import <SDWebImage/SDWebImageDownloaderConfig.h>
37 33 #import <SDWebImage/SDWebImageDownloaderOperation.h>
38 34 #import <SDWebImage/SDWebImageDownloaderRequestModifier.h>
  35 +#import <SDWebImage/SDWebImageDownloaderResponseModifier.h>
  36 +#import <SDWebImage/SDWebImageDownloaderDecryptor.h>
39 37 #import <SDWebImage/SDImageLoader.h>
40 38 #import <SDWebImage/SDImageLoadersManager.h>
41 39 #import <SDWebImage/UIButton+WebCache.h>
... ... @@ -44,6 +42,7 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[];
44 42 #import <SDWebImage/UIImage+Metadata.h>
45 43 #import <SDWebImage/UIImage+MultiFormat.h>
46 44 #import <SDWebImage/UIImage+MemoryCacheCost.h>
  45 +#import <SDWebImage/UIImage+ExtendedCacheData.h>
47 46 #import <SDWebImage/SDWebImageOperation.h>
48 47 #import <SDWebImage/SDWebImageDownloader.h>
49 48 #import <SDWebImage/SDWebImageTransition.h>
... ... @@ -53,6 +52,7 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[];
53 52 #import <SDWebImage/SDAnimatedImage.h>
54 53 #import <SDWebImage/SDAnimatedImageView.h>
55 54 #import <SDWebImage/SDAnimatedImageView+WebCache.h>
  55 +#import <SDWebImage/SDAnimatedImagePlayer.h>
56 56 #import <SDWebImage/SDImageCodersManager.h>
57 57 #import <SDWebImage/SDImageCoder.h>
58 58 #import <SDWebImage/SDImageAPNGCoder.h>
... ... @@ -61,6 +61,7 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[];
61 61 #import <SDWebImage/SDImageFrame.h>
62 62 #import <SDWebImage/SDImageCoderHelper.h>
63 63 #import <SDWebImage/SDImageGraphics.h>
  64 +#import <SDWebImage/SDGraphicsImageRenderer.h>
64 65 #import <SDWebImage/UIImage+GIF.h>
65 66 #import <SDWebImage/UIImage+ForceDecode.h>
66 67 #import <SDWebImage/NSData+ImageContentType.h>
... ...
Example/Pods/Target Support Files/SDWebImage/SDWebImage-Info.plist
... ... @@ -15,7 +15,7 @@
15 15 <key>CFBundlePackageType</key>
16 16 <string>FMWK</string>
17 17 <key>CFBundleShortVersionString</key>
18   - <string>5.2.5</string>
  18 + <string>5.8.4</string>
19 19 <key>CFBundleSignature</key>
20 20 <string>????</string>
21 21 <key>CFBundleVersion</key>
... ...
Example/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h
... ... @@ -14,10 +14,12 @@
14 14 #import "NSData+ImageContentType.h"
15 15 #import "NSImage+Compatibility.h"
16 16 #import "SDAnimatedImage.h"
  17 +#import "SDAnimatedImagePlayer.h"
17 18 #import "SDAnimatedImageRep.h"
18 19 #import "SDAnimatedImageView+WebCache.h"
19 20 #import "SDAnimatedImageView.h"
20 21 #import "SDDiskCache.h"
  22 +#import "SDGraphicsImageRenderer.h"
21 23 #import "SDImageAPNGCoder.h"
22 24 #import "SDImageCache.h"
23 25 #import "SDImageCacheConfig.h"
... ... @@ -42,8 +44,10 @@
42 44 #import "SDWebImageDefine.h"
43 45 #import "SDWebImageDownloader.h"
44 46 #import "SDWebImageDownloaderConfig.h"
  47 +#import "SDWebImageDownloaderDecryptor.h"
45 48 #import "SDWebImageDownloaderOperation.h"
46 49 #import "SDWebImageDownloaderRequestModifier.h"
  50 +#import "SDWebImageDownloaderResponseModifier.h"
47 51 #import "SDWebImageError.h"
48 52 #import "SDWebImageIndicator.h"
49 53 #import "SDWebImageManager.h"
... ... @@ -52,6 +56,7 @@
52 56 #import "SDWebImagePrefetcher.h"
53 57 #import "SDWebImageTransition.h"
54 58 #import "UIButton+WebCache.h"
  59 +#import "UIImage+ExtendedCacheData.h"
55 60 #import "UIImage+ForceDecode.h"
56 61 #import "UIImage+GIF.h"
57 62 #import "UIImage+MemoryCacheCost.h"
... ...
Example/Pods/Target Support Files/YBImageBrowser_DSCnliveShop/YBImageBrowser_DSCnliveShop-Info.plist
... ... @@ -15,7 +15,7 @@
15 15 <key>CFBundlePackageType</key>
16 16 <string>FMWK</string>
17 17 <key>CFBundleShortVersionString</key>
18   - <string>3.0.9</string>
  18 + <string>3.1.0</string>
19 19 <key>CFBundleSignature</key>
20 20 <string>????</string>
21 21 <key>CFBundleVersion</key>
... ...
YBImageBrowser_DSCnliveShop.podspec
1 1 Pod::Spec.new do |s|
2 2 s.name = "YBImageBrowser_DSCnliveShop"
3   - s.version = "3.1.0"
  3 + s.version = "3.1.1"
4 4 s.summary = "YBImageBrowser改依赖为YYKit"
5 5 s.homepage = "http://bj.gitlab.cnlive.com/DSIOSTeam"
6 6 s.author = { "DSIOSTeam" => "694092596@qq.com" }
... ...