Commit f080ffe1d67d7cf0e91c0fb015f080db23a88930
1 parent
7a266766
no message
Showing
36 changed files
with
2372 additions
and
0 deletions
WSWebImageDemo.xcodeproj/project.pbxproj
0 → 100644
| 1 | +// !$*UTF8*$! | ||
| 2 | +{ | ||
| 3 | + archiveVersion = 1; | ||
| 4 | + classes = { | ||
| 5 | + }; | ||
| 6 | + objectVersion = 46; | ||
| 7 | + objects = { | ||
| 8 | + | ||
| 9 | +/* Begin PBXBuildFile section */ | ||
| 10 | + 0339FBE91D48B7EF00E4EDAB /* text.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 0339FBE81D48B7EF00E4EDAB /* text.jpg */; }; | ||
| 11 | + 036CBF251D3731260044A601 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 036CBF241D3731260044A601 /* main.m */; }; | ||
| 12 | + 036CBF281D3731260044A601 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 036CBF271D3731260044A601 /* AppDelegate.m */; }; | ||
| 13 | + 036CBF2B1D3731260044A601 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 036CBF2A1D3731260044A601 /* ViewController.m */; }; | ||
| 14 | + 036CBF2E1D3731260044A601 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 036CBF2C1D3731260044A601 /* Main.storyboard */; }; | ||
| 15 | + 036CBF301D3731260044A601 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 036CBF2F1D3731260044A601 /* Assets.xcassets */; }; | ||
| 16 | + 036CBF331D3731260044A601 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 036CBF311D3731260044A601 /* LaunchScreen.storyboard */; }; | ||
| 17 | + 036CBF3E1D3731260044A601 /* WSWebImageDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 036CBF3D1D3731260044A601 /* WSWebImageDemoTests.m */; }; | ||
| 18 | + 036CBF491D3731260044A601 /* WSWebImageDemoUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 036CBF481D3731260044A601 /* WSWebImageDemoUITests.m */; }; | ||
| 19 | + 324590E81D4B2A3200889091 /* CNLiveImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 324590D91D4B2A3200889091 /* CNLiveImageCache.m */; }; | ||
| 20 | + 324590E91D4B2A3200889091 /* CNLiveWebImageDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 324590DC1D4B2A3200889091 /* CNLiveWebImageDownload.m */; }; | ||
| 21 | + 324590EA1D4B2A3200889091 /* CNLiveWebImageDownloadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 324590DE1D4B2A3200889091 /* CNLiveWebImageDownloadOperation.m */; }; | ||
| 22 | + 324590EB1D4B2A3200889091 /* CNLiveWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 324590E01D4B2A3200889091 /* CNLiveWebImageManager.m */; }; | ||
| 23 | + 324590EC1D4B2A3200889091 /* NSData+CNLiveImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 324590E31D4B2A3200889091 /* NSData+CNLiveImageContentType.m */; }; | ||
| 24 | + 324590ED1D4B2A3200889091 /* UIImage+CNLiveMultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 324590E51D4B2A3200889091 /* UIImage+CNLiveMultiFormat.m */; }; | ||
| 25 | + 324590EE1D4B2A3200889091 /* UIImageView+CNLiveWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 324590E71D4B2A3200889091 /* UIImageView+CNLiveWebCache.m */; }; | ||
| 26 | +/* End PBXBuildFile section */ | ||
| 27 | + | ||
| 28 | +/* Begin PBXContainerItemProxy section */ | ||
| 29 | + 036CBF3A1D3731260044A601 /* PBXContainerItemProxy */ = { | ||
| 30 | + isa = PBXContainerItemProxy; | ||
| 31 | + containerPortal = 036CBF181D3731260044A601 /* Project object */; | ||
| 32 | + proxyType = 1; | ||
| 33 | + remoteGlobalIDString = 036CBF1F1D3731260044A601; | ||
| 34 | + remoteInfo = WSWebImageDemo; | ||
| 35 | + }; | ||
| 36 | + 036CBF451D3731260044A601 /* PBXContainerItemProxy */ = { | ||
| 37 | + isa = PBXContainerItemProxy; | ||
| 38 | + containerPortal = 036CBF181D3731260044A601 /* Project object */; | ||
| 39 | + proxyType = 1; | ||
| 40 | + remoteGlobalIDString = 036CBF1F1D3731260044A601; | ||
| 41 | + remoteInfo = WSWebImageDemo; | ||
| 42 | + }; | ||
| 43 | +/* End PBXContainerItemProxy section */ | ||
| 44 | + | ||
| 45 | +/* Begin PBXFileReference section */ | ||
| 46 | + 0339FBE81D48B7EF00E4EDAB /* text.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = text.jpg; sourceTree = "<group>"; }; | ||
| 47 | + 036CBF201D3731260044A601 /* WSWebImageDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WSWebImageDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
| 48 | + 036CBF241D3731260044A601 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; | ||
| 49 | + 036CBF261D3731260044A601 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; }; | ||
| 50 | + 036CBF271D3731260044A601 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; }; | ||
| 51 | + 036CBF291D3731260044A601 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; }; | ||
| 52 | + 036CBF2A1D3731260044A601 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; }; | ||
| 53 | + 036CBF2D1D3731260044A601 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | ||
| 54 | + 036CBF2F1D3731260044A601 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | ||
| 55 | + 036CBF321D3731260044A601 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | ||
| 56 | + 036CBF341D3731260044A601 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||
| 57 | + 036CBF391D3731260044A601 /* WSWebImageDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WSWebImageDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
| 58 | + 036CBF3D1D3731260044A601 /* WSWebImageDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WSWebImageDemoTests.m; sourceTree = "<group>"; }; | ||
| 59 | + 036CBF3F1D3731260044A601 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||
| 60 | + 036CBF441D3731260044A601 /* WSWebImageDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WSWebImageDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
| 61 | + 036CBF481D3731260044A601 /* WSWebImageDemoUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WSWebImageDemoUITests.m; sourceTree = "<group>"; }; | ||
| 62 | + 036CBF4A1D3731260044A601 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||
| 63 | + 324590D81D4B2A3200889091 /* CNLiveImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNLiveImageCache.h; sourceTree = "<group>"; }; | ||
| 64 | + 324590D91D4B2A3200889091 /* CNLiveImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNLiveImageCache.m; sourceTree = "<group>"; }; | ||
| 65 | + 324590DA1D4B2A3200889091 /* CNLiveWebImageBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNLiveWebImageBlock.h; sourceTree = "<group>"; }; | ||
| 66 | + 324590DB1D4B2A3200889091 /* CNLiveWebImageDownload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNLiveWebImageDownload.h; sourceTree = "<group>"; }; | ||
| 67 | + 324590DC1D4B2A3200889091 /* CNLiveWebImageDownload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNLiveWebImageDownload.m; sourceTree = "<group>"; }; | ||
| 68 | + 324590DD1D4B2A3200889091 /* CNLiveWebImageDownloadOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNLiveWebImageDownloadOperation.h; sourceTree = "<group>"; }; | ||
| 69 | + 324590DE1D4B2A3200889091 /* CNLiveWebImageDownloadOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNLiveWebImageDownloadOperation.m; sourceTree = "<group>"; }; | ||
| 70 | + 324590DF1D4B2A3200889091 /* CNLiveWebImageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNLiveWebImageManager.h; sourceTree = "<group>"; }; | ||
| 71 | + 324590E01D4B2A3200889091 /* CNLiveWebImageManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CNLiveWebImageManager.m; sourceTree = "<group>"; }; | ||
| 72 | + 324590E11D4B2A3200889091 /* CNLiveWebImageOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CNLiveWebImageOperation.h; sourceTree = "<group>"; }; | ||
| 73 | + 324590E21D4B2A3200889091 /* NSData+CNLiveImageContentType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+CNLiveImageContentType.h"; sourceTree = "<group>"; }; | ||
| 74 | + 324590E31D4B2A3200889091 /* NSData+CNLiveImageContentType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+CNLiveImageContentType.m"; sourceTree = "<group>"; }; | ||
| 75 | + 324590E41D4B2A3200889091 /* UIImage+CNLiveMultiFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+CNLiveMultiFormat.h"; sourceTree = "<group>"; }; | ||
| 76 | + 324590E51D4B2A3200889091 /* UIImage+CNLiveMultiFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+CNLiveMultiFormat.m"; sourceTree = "<group>"; }; | ||
| 77 | + 324590E61D4B2A3200889091 /* UIImageView+CNLiveWebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+CNLiveWebCache.h"; sourceTree = "<group>"; }; | ||
| 78 | + 324590E71D4B2A3200889091 /* UIImageView+CNLiveWebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+CNLiveWebCache.m"; sourceTree = "<group>"; }; | ||
| 79 | +/* End PBXFileReference section */ | ||
| 80 | + | ||
| 81 | +/* Begin PBXFrameworksBuildPhase section */ | ||
| 82 | + 036CBF1D1D3731260044A601 /* Frameworks */ = { | ||
| 83 | + isa = PBXFrameworksBuildPhase; | ||
| 84 | + buildActionMask = 2147483647; | ||
| 85 | + files = ( | ||
| 86 | + ); | ||
| 87 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 88 | + }; | ||
| 89 | + 036CBF361D3731260044A601 /* Frameworks */ = { | ||
| 90 | + isa = PBXFrameworksBuildPhase; | ||
| 91 | + buildActionMask = 2147483647; | ||
| 92 | + files = ( | ||
| 93 | + ); | ||
| 94 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 95 | + }; | ||
| 96 | + 036CBF411D3731260044A601 /* Frameworks */ = { | ||
| 97 | + isa = PBXFrameworksBuildPhase; | ||
| 98 | + buildActionMask = 2147483647; | ||
| 99 | + files = ( | ||
| 100 | + ); | ||
| 101 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 102 | + }; | ||
| 103 | +/* End PBXFrameworksBuildPhase section */ | ||
| 104 | + | ||
| 105 | +/* Begin PBXGroup section */ | ||
| 106 | + 036CBF171D3731260044A601 = { | ||
| 107 | + isa = PBXGroup; | ||
| 108 | + children = ( | ||
| 109 | + 324590D71D4B2A3200889091 /* CNLiveWebImage */, | ||
| 110 | + 036CBF221D3731260044A601 /* WSWebImageDemo */, | ||
| 111 | + 036CBF3C1D3731260044A601 /* WSWebImageDemoTests */, | ||
| 112 | + 036CBF471D3731260044A601 /* WSWebImageDemoUITests */, | ||
| 113 | + 036CBF211D3731260044A601 /* Products */, | ||
| 114 | + ); | ||
| 115 | + sourceTree = "<group>"; | ||
| 116 | + }; | ||
| 117 | + 036CBF211D3731260044A601 /* Products */ = { | ||
| 118 | + isa = PBXGroup; | ||
| 119 | + children = ( | ||
| 120 | + 036CBF201D3731260044A601 /* WSWebImageDemo.app */, | ||
| 121 | + 036CBF391D3731260044A601 /* WSWebImageDemoTests.xctest */, | ||
| 122 | + 036CBF441D3731260044A601 /* WSWebImageDemoUITests.xctest */, | ||
| 123 | + ); | ||
| 124 | + name = Products; | ||
| 125 | + sourceTree = "<group>"; | ||
| 126 | + }; | ||
| 127 | + 036CBF221D3731260044A601 /* WSWebImageDemo */ = { | ||
| 128 | + isa = PBXGroup; | ||
| 129 | + children = ( | ||
| 130 | + 0339FBE81D48B7EF00E4EDAB /* text.jpg */, | ||
| 131 | + 036CBF261D3731260044A601 /* AppDelegate.h */, | ||
| 132 | + 036CBF271D3731260044A601 /* AppDelegate.m */, | ||
| 133 | + 036CBF291D3731260044A601 /* ViewController.h */, | ||
| 134 | + 036CBF2A1D3731260044A601 /* ViewController.m */, | ||
| 135 | + 036CBF2C1D3731260044A601 /* Main.storyboard */, | ||
| 136 | + 036CBF2F1D3731260044A601 /* Assets.xcassets */, | ||
| 137 | + 036CBF311D3731260044A601 /* LaunchScreen.storyboard */, | ||
| 138 | + 036CBF341D3731260044A601 /* Info.plist */, | ||
| 139 | + 036CBF231D3731260044A601 /* Supporting Files */, | ||
| 140 | + ); | ||
| 141 | + path = WSWebImageDemo; | ||
| 142 | + sourceTree = "<group>"; | ||
| 143 | + }; | ||
| 144 | + 036CBF231D3731260044A601 /* Supporting Files */ = { | ||
| 145 | + isa = PBXGroup; | ||
| 146 | + children = ( | ||
| 147 | + 036CBF241D3731260044A601 /* main.m */, | ||
| 148 | + ); | ||
| 149 | + name = "Supporting Files"; | ||
| 150 | + sourceTree = "<group>"; | ||
| 151 | + }; | ||
| 152 | + 036CBF3C1D3731260044A601 /* WSWebImageDemoTests */ = { | ||
| 153 | + isa = PBXGroup; | ||
| 154 | + children = ( | ||
| 155 | + 036CBF3D1D3731260044A601 /* WSWebImageDemoTests.m */, | ||
| 156 | + 036CBF3F1D3731260044A601 /* Info.plist */, | ||
| 157 | + ); | ||
| 158 | + path = WSWebImageDemoTests; | ||
| 159 | + sourceTree = "<group>"; | ||
| 160 | + }; | ||
| 161 | + 036CBF471D3731260044A601 /* WSWebImageDemoUITests */ = { | ||
| 162 | + isa = PBXGroup; | ||
| 163 | + children = ( | ||
| 164 | + 036CBF481D3731260044A601 /* WSWebImageDemoUITests.m */, | ||
| 165 | + 036CBF4A1D3731260044A601 /* Info.plist */, | ||
| 166 | + ); | ||
| 167 | + path = WSWebImageDemoUITests; | ||
| 168 | + sourceTree = "<group>"; | ||
| 169 | + }; | ||
| 170 | + 324590D71D4B2A3200889091 /* CNLiveWebImage */ = { | ||
| 171 | + isa = PBXGroup; | ||
| 172 | + children = ( | ||
| 173 | + 324590D81D4B2A3200889091 /* CNLiveImageCache.h */, | ||
| 174 | + 324590D91D4B2A3200889091 /* CNLiveImageCache.m */, | ||
| 175 | + 324590DA1D4B2A3200889091 /* CNLiveWebImageBlock.h */, | ||
| 176 | + 324590DB1D4B2A3200889091 /* CNLiveWebImageDownload.h */, | ||
| 177 | + 324590DC1D4B2A3200889091 /* CNLiveWebImageDownload.m */, | ||
| 178 | + 324590DD1D4B2A3200889091 /* CNLiveWebImageDownloadOperation.h */, | ||
| 179 | + 324590DE1D4B2A3200889091 /* CNLiveWebImageDownloadOperation.m */, | ||
| 180 | + 324590DF1D4B2A3200889091 /* CNLiveWebImageManager.h */, | ||
| 181 | + 324590E01D4B2A3200889091 /* CNLiveWebImageManager.m */, | ||
| 182 | + 324590E11D4B2A3200889091 /* CNLiveWebImageOperation.h */, | ||
| 183 | + 324590E21D4B2A3200889091 /* NSData+CNLiveImageContentType.h */, | ||
| 184 | + 324590E31D4B2A3200889091 /* NSData+CNLiveImageContentType.m */, | ||
| 185 | + 324590E41D4B2A3200889091 /* UIImage+CNLiveMultiFormat.h */, | ||
| 186 | + 324590E51D4B2A3200889091 /* UIImage+CNLiveMultiFormat.m */, | ||
| 187 | + 324590E61D4B2A3200889091 /* UIImageView+CNLiveWebCache.h */, | ||
| 188 | + 324590E71D4B2A3200889091 /* UIImageView+CNLiveWebCache.m */, | ||
| 189 | + ); | ||
| 190 | + name = CNLiveWebImage; | ||
| 191 | + path = WSWebImageDemo/CNLiveWebImage; | ||
| 192 | + sourceTree = "<group>"; | ||
| 193 | + }; | ||
| 194 | +/* End PBXGroup section */ | ||
| 195 | + | ||
| 196 | +/* Begin PBXNativeTarget section */ | ||
| 197 | + 036CBF1F1D3731260044A601 /* WSWebImageDemo */ = { | ||
| 198 | + isa = PBXNativeTarget; | ||
| 199 | + buildConfigurationList = 036CBF4D1D3731260044A601 /* Build configuration list for PBXNativeTarget "WSWebImageDemo" */; | ||
| 200 | + buildPhases = ( | ||
| 201 | + 036CBF1C1D3731260044A601 /* Sources */, | ||
| 202 | + 036CBF1D1D3731260044A601 /* Frameworks */, | ||
| 203 | + 036CBF1E1D3731260044A601 /* Resources */, | ||
| 204 | + ); | ||
| 205 | + buildRules = ( | ||
| 206 | + ); | ||
| 207 | + dependencies = ( | ||
| 208 | + ); | ||
| 209 | + name = WSWebImageDemo; | ||
| 210 | + productName = WSWebImageDemo; | ||
| 211 | + productReference = 036CBF201D3731260044A601 /* WSWebImageDemo.app */; | ||
| 212 | + productType = "com.apple.product-type.application"; | ||
| 213 | + }; | ||
| 214 | + 036CBF381D3731260044A601 /* WSWebImageDemoTests */ = { | ||
| 215 | + isa = PBXNativeTarget; | ||
| 216 | + buildConfigurationList = 036CBF501D3731260044A601 /* Build configuration list for PBXNativeTarget "WSWebImageDemoTests" */; | ||
| 217 | + buildPhases = ( | ||
| 218 | + 036CBF351D3731260044A601 /* Sources */, | ||
| 219 | + 036CBF361D3731260044A601 /* Frameworks */, | ||
| 220 | + 036CBF371D3731260044A601 /* Resources */, | ||
| 221 | + ); | ||
| 222 | + buildRules = ( | ||
| 223 | + ); | ||
| 224 | + dependencies = ( | ||
| 225 | + 036CBF3B1D3731260044A601 /* PBXTargetDependency */, | ||
| 226 | + ); | ||
| 227 | + name = WSWebImageDemoTests; | ||
| 228 | + productName = WSWebImageDemoTests; | ||
| 229 | + productReference = 036CBF391D3731260044A601 /* WSWebImageDemoTests.xctest */; | ||
| 230 | + productType = "com.apple.product-type.bundle.unit-test"; | ||
| 231 | + }; | ||
| 232 | + 036CBF431D3731260044A601 /* WSWebImageDemoUITests */ = { | ||
| 233 | + isa = PBXNativeTarget; | ||
| 234 | + buildConfigurationList = 036CBF531D3731260044A601 /* Build configuration list for PBXNativeTarget "WSWebImageDemoUITests" */; | ||
| 235 | + buildPhases = ( | ||
| 236 | + 036CBF401D3731260044A601 /* Sources */, | ||
| 237 | + 036CBF411D3731260044A601 /* Frameworks */, | ||
| 238 | + 036CBF421D3731260044A601 /* Resources */, | ||
| 239 | + ); | ||
| 240 | + buildRules = ( | ||
| 241 | + ); | ||
| 242 | + dependencies = ( | ||
| 243 | + 036CBF461D3731260044A601 /* PBXTargetDependency */, | ||
| 244 | + ); | ||
| 245 | + name = WSWebImageDemoUITests; | ||
| 246 | + productName = WSWebImageDemoUITests; | ||
| 247 | + productReference = 036CBF441D3731260044A601 /* WSWebImageDemoUITests.xctest */; | ||
| 248 | + productType = "com.apple.product-type.bundle.ui-testing"; | ||
| 249 | + }; | ||
| 250 | +/* End PBXNativeTarget section */ | ||
| 251 | + | ||
| 252 | +/* Begin PBXProject section */ | ||
| 253 | + 036CBF181D3731260044A601 /* Project object */ = { | ||
| 254 | + isa = PBXProject; | ||
| 255 | + attributes = { | ||
| 256 | + LastUpgradeCheck = 0730; | ||
| 257 | + ORGANIZATIONNAME = "王帅"; | ||
| 258 | + TargetAttributes = { | ||
| 259 | + 036CBF1F1D3731260044A601 = { | ||
| 260 | + CreatedOnToolsVersion = 7.3.1; | ||
| 261 | + }; | ||
| 262 | + 036CBF381D3731260044A601 = { | ||
| 263 | + CreatedOnToolsVersion = 7.3.1; | ||
| 264 | + TestTargetID = 036CBF1F1D3731260044A601; | ||
| 265 | + }; | ||
| 266 | + 036CBF431D3731260044A601 = { | ||
| 267 | + CreatedOnToolsVersion = 7.3.1; | ||
| 268 | + TestTargetID = 036CBF1F1D3731260044A601; | ||
| 269 | + }; | ||
| 270 | + }; | ||
| 271 | + }; | ||
| 272 | + buildConfigurationList = 036CBF1B1D3731260044A601 /* Build configuration list for PBXProject "WSWebImageDemo" */; | ||
| 273 | + compatibilityVersion = "Xcode 3.2"; | ||
| 274 | + developmentRegion = English; | ||
| 275 | + hasScannedForEncodings = 0; | ||
| 276 | + knownRegions = ( | ||
| 277 | + en, | ||
| 278 | + Base, | ||
| 279 | + ); | ||
| 280 | + mainGroup = 036CBF171D3731260044A601; | ||
| 281 | + productRefGroup = 036CBF211D3731260044A601 /* Products */; | ||
| 282 | + projectDirPath = ""; | ||
| 283 | + projectRoot = ""; | ||
| 284 | + targets = ( | ||
| 285 | + 036CBF1F1D3731260044A601 /* WSWebImageDemo */, | ||
| 286 | + 036CBF381D3731260044A601 /* WSWebImageDemoTests */, | ||
| 287 | + 036CBF431D3731260044A601 /* WSWebImageDemoUITests */, | ||
| 288 | + ); | ||
| 289 | + }; | ||
| 290 | +/* End PBXProject section */ | ||
| 291 | + | ||
| 292 | +/* Begin PBXResourcesBuildPhase section */ | ||
| 293 | + 036CBF1E1D3731260044A601 /* Resources */ = { | ||
| 294 | + isa = PBXResourcesBuildPhase; | ||
| 295 | + buildActionMask = 2147483647; | ||
| 296 | + files = ( | ||
| 297 | + 0339FBE91D48B7EF00E4EDAB /* text.jpg in Resources */, | ||
| 298 | + 036CBF331D3731260044A601 /* LaunchScreen.storyboard in Resources */, | ||
| 299 | + 036CBF301D3731260044A601 /* Assets.xcassets in Resources */, | ||
| 300 | + 036CBF2E1D3731260044A601 /* Main.storyboard in Resources */, | ||
| 301 | + ); | ||
| 302 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 303 | + }; | ||
| 304 | + 036CBF371D3731260044A601 /* Resources */ = { | ||
| 305 | + isa = PBXResourcesBuildPhase; | ||
| 306 | + buildActionMask = 2147483647; | ||
| 307 | + files = ( | ||
| 308 | + ); | ||
| 309 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 310 | + }; | ||
| 311 | + 036CBF421D3731260044A601 /* Resources */ = { | ||
| 312 | + isa = PBXResourcesBuildPhase; | ||
| 313 | + buildActionMask = 2147483647; | ||
| 314 | + files = ( | ||
| 315 | + ); | ||
| 316 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 317 | + }; | ||
| 318 | +/* End PBXResourcesBuildPhase section */ | ||
| 319 | + | ||
| 320 | +/* Begin PBXSourcesBuildPhase section */ | ||
| 321 | + 036CBF1C1D3731260044A601 /* Sources */ = { | ||
| 322 | + isa = PBXSourcesBuildPhase; | ||
| 323 | + buildActionMask = 2147483647; | ||
| 324 | + files = ( | ||
| 325 | + 324590EB1D4B2A3200889091 /* CNLiveWebImageManager.m in Sources */, | ||
| 326 | + 324590EC1D4B2A3200889091 /* NSData+CNLiveImageContentType.m in Sources */, | ||
| 327 | + 324590ED1D4B2A3200889091 /* UIImage+CNLiveMultiFormat.m in Sources */, | ||
| 328 | + 324590EE1D4B2A3200889091 /* UIImageView+CNLiveWebCache.m in Sources */, | ||
| 329 | + 324590E91D4B2A3200889091 /* CNLiveWebImageDownload.m in Sources */, | ||
| 330 | + 036CBF2B1D3731260044A601 /* ViewController.m in Sources */, | ||
| 331 | + 324590E81D4B2A3200889091 /* CNLiveImageCache.m in Sources */, | ||
| 332 | + 324590EA1D4B2A3200889091 /* CNLiveWebImageDownloadOperation.m in Sources */, | ||
| 333 | + 036CBF281D3731260044A601 /* AppDelegate.m in Sources */, | ||
| 334 | + 036CBF251D3731260044A601 /* main.m in Sources */, | ||
| 335 | + ); | ||
| 336 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 337 | + }; | ||
| 338 | + 036CBF351D3731260044A601 /* Sources */ = { | ||
| 339 | + isa = PBXSourcesBuildPhase; | ||
| 340 | + buildActionMask = 2147483647; | ||
| 341 | + files = ( | ||
| 342 | + 036CBF3E1D3731260044A601 /* WSWebImageDemoTests.m in Sources */, | ||
| 343 | + ); | ||
| 344 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 345 | + }; | ||
| 346 | + 036CBF401D3731260044A601 /* Sources */ = { | ||
| 347 | + isa = PBXSourcesBuildPhase; | ||
| 348 | + buildActionMask = 2147483647; | ||
| 349 | + files = ( | ||
| 350 | + 036CBF491D3731260044A601 /* WSWebImageDemoUITests.m in Sources */, | ||
| 351 | + ); | ||
| 352 | + runOnlyForDeploymentPostprocessing = 0; | ||
| 353 | + }; | ||
| 354 | +/* End PBXSourcesBuildPhase section */ | ||
| 355 | + | ||
| 356 | +/* Begin PBXTargetDependency section */ | ||
| 357 | + 036CBF3B1D3731260044A601 /* PBXTargetDependency */ = { | ||
| 358 | + isa = PBXTargetDependency; | ||
| 359 | + target = 036CBF1F1D3731260044A601 /* WSWebImageDemo */; | ||
| 360 | + targetProxy = 036CBF3A1D3731260044A601 /* PBXContainerItemProxy */; | ||
| 361 | + }; | ||
| 362 | + 036CBF461D3731260044A601 /* PBXTargetDependency */ = { | ||
| 363 | + isa = PBXTargetDependency; | ||
| 364 | + target = 036CBF1F1D3731260044A601 /* WSWebImageDemo */; | ||
| 365 | + targetProxy = 036CBF451D3731260044A601 /* PBXContainerItemProxy */; | ||
| 366 | + }; | ||
| 367 | +/* End PBXTargetDependency section */ | ||
| 368 | + | ||
| 369 | +/* Begin PBXVariantGroup section */ | ||
| 370 | + 036CBF2C1D3731260044A601 /* Main.storyboard */ = { | ||
| 371 | + isa = PBXVariantGroup; | ||
| 372 | + children = ( | ||
| 373 | + 036CBF2D1D3731260044A601 /* Base */, | ||
| 374 | + ); | ||
| 375 | + name = Main.storyboard; | ||
| 376 | + sourceTree = "<group>"; | ||
| 377 | + }; | ||
| 378 | + 036CBF311D3731260044A601 /* LaunchScreen.storyboard */ = { | ||
| 379 | + isa = PBXVariantGroup; | ||
| 380 | + children = ( | ||
| 381 | + 036CBF321D3731260044A601 /* Base */, | ||
| 382 | + ); | ||
| 383 | + name = LaunchScreen.storyboard; | ||
| 384 | + sourceTree = "<group>"; | ||
| 385 | + }; | ||
| 386 | +/* End PBXVariantGroup section */ | ||
| 387 | + | ||
| 388 | +/* Begin XCBuildConfiguration section */ | ||
| 389 | + 036CBF4B1D3731260044A601 /* Debug */ = { | ||
| 390 | + isa = XCBuildConfiguration; | ||
| 391 | + buildSettings = { | ||
| 392 | + ALWAYS_SEARCH_USER_PATHS = NO; | ||
| 393 | + CLANG_ANALYZER_NONNULL = YES; | ||
| 394 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
| 395 | + CLANG_CXX_LIBRARY = "libc++"; | ||
| 396 | + CLANG_ENABLE_MODULES = YES; | ||
| 397 | + CLANG_ENABLE_OBJC_ARC = YES; | ||
| 398 | + CLANG_WARN_BOOL_CONVERSION = YES; | ||
| 399 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
| 400 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
| 401 | + CLANG_WARN_EMPTY_BODY = YES; | ||
| 402 | + CLANG_WARN_ENUM_CONVERSION = YES; | ||
| 403 | + CLANG_WARN_INT_CONVERSION = YES; | ||
| 404 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
| 405 | + CLANG_WARN_UNREACHABLE_CODE = YES; | ||
| 406 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
| 407 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||
| 408 | + COPY_PHASE_STRIP = NO; | ||
| 409 | + DEBUG_INFORMATION_FORMAT = dwarf; | ||
| 410 | + ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
| 411 | + ENABLE_TESTABILITY = YES; | ||
| 412 | + GCC_C_LANGUAGE_STANDARD = gnu99; | ||
| 413 | + GCC_DYNAMIC_NO_PIC = NO; | ||
| 414 | + GCC_NO_COMMON_BLOCKS = YES; | ||
| 415 | + GCC_OPTIMIZATION_LEVEL = 0; | ||
| 416 | + GCC_PREPROCESSOR_DEFINITIONS = ( | ||
| 417 | + "DEBUG=1", | ||
| 418 | + "$(inherited)", | ||
| 419 | + ); | ||
| 420 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
| 421 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
| 422 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
| 423 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
| 424 | + GCC_WARN_UNUSED_FUNCTION = YES; | ||
| 425 | + GCC_WARN_UNUSED_VARIABLE = YES; | ||
| 426 | + IPHONEOS_DEPLOYMENT_TARGET = 9.3; | ||
| 427 | + MTL_ENABLE_DEBUG_INFO = YES; | ||
| 428 | + ONLY_ACTIVE_ARCH = YES; | ||
| 429 | + SDKROOT = iphoneos; | ||
| 430 | + TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 431 | + }; | ||
| 432 | + name = Debug; | ||
| 433 | + }; | ||
| 434 | + 036CBF4C1D3731260044A601 /* Release */ = { | ||
| 435 | + isa = XCBuildConfiguration; | ||
| 436 | + buildSettings = { | ||
| 437 | + ALWAYS_SEARCH_USER_PATHS = NO; | ||
| 438 | + CLANG_ANALYZER_NONNULL = YES; | ||
| 439 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||
| 440 | + CLANG_CXX_LIBRARY = "libc++"; | ||
| 441 | + CLANG_ENABLE_MODULES = YES; | ||
| 442 | + CLANG_ENABLE_OBJC_ARC = YES; | ||
| 443 | + CLANG_WARN_BOOL_CONVERSION = YES; | ||
| 444 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
| 445 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
| 446 | + CLANG_WARN_EMPTY_BODY = YES; | ||
| 447 | + CLANG_WARN_ENUM_CONVERSION = YES; | ||
| 448 | + CLANG_WARN_INT_CONVERSION = YES; | ||
| 449 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
| 450 | + CLANG_WARN_UNREACHABLE_CODE = YES; | ||
| 451 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
| 452 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||
| 453 | + COPY_PHASE_STRIP = NO; | ||
| 454 | + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
| 455 | + ENABLE_NS_ASSERTIONS = NO; | ||
| 456 | + ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
| 457 | + GCC_C_LANGUAGE_STANDARD = gnu99; | ||
| 458 | + GCC_NO_COMMON_BLOCKS = YES; | ||
| 459 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
| 460 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
| 461 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
| 462 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
| 463 | + GCC_WARN_UNUSED_FUNCTION = YES; | ||
| 464 | + GCC_WARN_UNUSED_VARIABLE = YES; | ||
| 465 | + IPHONEOS_DEPLOYMENT_TARGET = 9.3; | ||
| 466 | + MTL_ENABLE_DEBUG_INFO = NO; | ||
| 467 | + SDKROOT = iphoneos; | ||
| 468 | + TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 469 | + VALIDATE_PRODUCT = YES; | ||
| 470 | + }; | ||
| 471 | + name = Release; | ||
| 472 | + }; | ||
| 473 | + 036CBF4E1D3731260044A601 /* Debug */ = { | ||
| 474 | + isa = XCBuildConfiguration; | ||
| 475 | + buildSettings = { | ||
| 476 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||
| 477 | + INFOPLIST_FILE = WSWebImageDemo/Info.plist; | ||
| 478 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | ||
| 479 | + PRODUCT_BUNDLE_IDENTIFIER = wangshuai.WSWebImageDemo; | ||
| 480 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 481 | + }; | ||
| 482 | + name = Debug; | ||
| 483 | + }; | ||
| 484 | + 036CBF4F1D3731260044A601 /* Release */ = { | ||
| 485 | + isa = XCBuildConfiguration; | ||
| 486 | + buildSettings = { | ||
| 487 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||
| 488 | + INFOPLIST_FILE = WSWebImageDemo/Info.plist; | ||
| 489 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; | ||
| 490 | + PRODUCT_BUNDLE_IDENTIFIER = wangshuai.WSWebImageDemo; | ||
| 491 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 492 | + }; | ||
| 493 | + name = Release; | ||
| 494 | + }; | ||
| 495 | + 036CBF511D3731260044A601 /* Debug */ = { | ||
| 496 | + isa = XCBuildConfiguration; | ||
| 497 | + buildSettings = { | ||
| 498 | + BUNDLE_LOADER = "$(TEST_HOST)"; | ||
| 499 | + INFOPLIST_FILE = WSWebImageDemoTests/Info.plist; | ||
| 500 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 501 | + PRODUCT_BUNDLE_IDENTIFIER = wangshuai.WSWebImageDemoTests; | ||
| 502 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 503 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WSWebImageDemo.app/WSWebImageDemo"; | ||
| 504 | + }; | ||
| 505 | + name = Debug; | ||
| 506 | + }; | ||
| 507 | + 036CBF521D3731260044A601 /* Release */ = { | ||
| 508 | + isa = XCBuildConfiguration; | ||
| 509 | + buildSettings = { | ||
| 510 | + BUNDLE_LOADER = "$(TEST_HOST)"; | ||
| 511 | + INFOPLIST_FILE = WSWebImageDemoTests/Info.plist; | ||
| 512 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 513 | + PRODUCT_BUNDLE_IDENTIFIER = wangshuai.WSWebImageDemoTests; | ||
| 514 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 515 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WSWebImageDemo.app/WSWebImageDemo"; | ||
| 516 | + }; | ||
| 517 | + name = Release; | ||
| 518 | + }; | ||
| 519 | + 036CBF541D3731260044A601 /* Debug */ = { | ||
| 520 | + isa = XCBuildConfiguration; | ||
| 521 | + buildSettings = { | ||
| 522 | + INFOPLIST_FILE = WSWebImageDemoUITests/Info.plist; | ||
| 523 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 524 | + PRODUCT_BUNDLE_IDENTIFIER = wangshuai.WSWebImageDemoUITests; | ||
| 525 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 526 | + TEST_TARGET_NAME = WSWebImageDemo; | ||
| 527 | + }; | ||
| 528 | + name = Debug; | ||
| 529 | + }; | ||
| 530 | + 036CBF551D3731260044A601 /* Release */ = { | ||
| 531 | + isa = XCBuildConfiguration; | ||
| 532 | + buildSettings = { | ||
| 533 | + INFOPLIST_FILE = WSWebImageDemoUITests/Info.plist; | ||
| 534 | + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 535 | + PRODUCT_BUNDLE_IDENTIFIER = wangshuai.WSWebImageDemoUITests; | ||
| 536 | + PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 537 | + TEST_TARGET_NAME = WSWebImageDemo; | ||
| 538 | + }; | ||
| 539 | + name = Release; | ||
| 540 | + }; | ||
| 541 | +/* End XCBuildConfiguration section */ | ||
| 542 | + | ||
| 543 | +/* Begin XCConfigurationList section */ | ||
| 544 | + 036CBF1B1D3731260044A601 /* Build configuration list for PBXProject "WSWebImageDemo" */ = { | ||
| 545 | + isa = XCConfigurationList; | ||
| 546 | + buildConfigurations = ( | ||
| 547 | + 036CBF4B1D3731260044A601 /* Debug */, | ||
| 548 | + 036CBF4C1D3731260044A601 /* Release */, | ||
| 549 | + ); | ||
| 550 | + defaultConfigurationIsVisible = 0; | ||
| 551 | + defaultConfigurationName = Release; | ||
| 552 | + }; | ||
| 553 | + 036CBF4D1D3731260044A601 /* Build configuration list for PBXNativeTarget "WSWebImageDemo" */ = { | ||
| 554 | + isa = XCConfigurationList; | ||
| 555 | + buildConfigurations = ( | ||
| 556 | + 036CBF4E1D3731260044A601 /* Debug */, | ||
| 557 | + 036CBF4F1D3731260044A601 /* Release */, | ||
| 558 | + ); | ||
| 559 | + defaultConfigurationIsVisible = 0; | ||
| 560 | + defaultConfigurationName = Release; | ||
| 561 | + }; | ||
| 562 | + 036CBF501D3731260044A601 /* Build configuration list for PBXNativeTarget "WSWebImageDemoTests" */ = { | ||
| 563 | + isa = XCConfigurationList; | ||
| 564 | + buildConfigurations = ( | ||
| 565 | + 036CBF511D3731260044A601 /* Debug */, | ||
| 566 | + 036CBF521D3731260044A601 /* Release */, | ||
| 567 | + ); | ||
| 568 | + defaultConfigurationIsVisible = 0; | ||
| 569 | + defaultConfigurationName = Release; | ||
| 570 | + }; | ||
| 571 | + 036CBF531D3731260044A601 /* Build configuration list for PBXNativeTarget "WSWebImageDemoUITests" */ = { | ||
| 572 | + isa = XCConfigurationList; | ||
| 573 | + buildConfigurations = ( | ||
| 574 | + 036CBF541D3731260044A601 /* Debug */, | ||
| 575 | + 036CBF551D3731260044A601 /* Release */, | ||
| 576 | + ); | ||
| 577 | + defaultConfigurationIsVisible = 0; | ||
| 578 | + defaultConfigurationName = Release; | ||
| 579 | + }; | ||
| 580 | +/* End XCConfigurationList section */ | ||
| 581 | + }; | ||
| 582 | + rootObject = 036CBF181D3731260044A601 /* Project object */; | ||
| 583 | +} |
WSWebImageDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata
0 → 100644
WSWebImageDemo.xcodeproj/xcuserdata/leihaojie.xcuserdatad/xcschemes/WSWebImageDemo.xcscheme
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<Scheme | ||
| 3 | + LastUpgradeVersion = "0730" | ||
| 4 | + version = "1.3"> | ||
| 5 | + <BuildAction | ||
| 6 | + parallelizeBuildables = "YES" | ||
| 7 | + buildImplicitDependencies = "YES"> | ||
| 8 | + <BuildActionEntries> | ||
| 9 | + <BuildActionEntry | ||
| 10 | + buildForTesting = "YES" | ||
| 11 | + buildForRunning = "YES" | ||
| 12 | + buildForProfiling = "YES" | ||
| 13 | + buildForArchiving = "YES" | ||
| 14 | + buildForAnalyzing = "YES"> | ||
| 15 | + <BuildableReference | ||
| 16 | + BuildableIdentifier = "primary" | ||
| 17 | + BlueprintIdentifier = "036CBF1F1D3731260044A601" | ||
| 18 | + BuildableName = "WSWebImageDemo.app" | ||
| 19 | + BlueprintName = "WSWebImageDemo" | ||
| 20 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 21 | + </BuildableReference> | ||
| 22 | + </BuildActionEntry> | ||
| 23 | + </BuildActionEntries> | ||
| 24 | + </BuildAction> | ||
| 25 | + <TestAction | ||
| 26 | + buildConfiguration = "Debug" | ||
| 27 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
| 28 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
| 29 | + shouldUseLaunchSchemeArgsEnv = "YES"> | ||
| 30 | + <Testables> | ||
| 31 | + <TestableReference | ||
| 32 | + skipped = "NO"> | ||
| 33 | + <BuildableReference | ||
| 34 | + BuildableIdentifier = "primary" | ||
| 35 | + BlueprintIdentifier = "036CBF381D3731260044A601" | ||
| 36 | + BuildableName = "WSWebImageDemoTests.xctest" | ||
| 37 | + BlueprintName = "WSWebImageDemoTests" | ||
| 38 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 39 | + </BuildableReference> | ||
| 40 | + </TestableReference> | ||
| 41 | + <TestableReference | ||
| 42 | + skipped = "NO"> | ||
| 43 | + <BuildableReference | ||
| 44 | + BuildableIdentifier = "primary" | ||
| 45 | + BlueprintIdentifier = "036CBF431D3731260044A601" | ||
| 46 | + BuildableName = "WSWebImageDemoUITests.xctest" | ||
| 47 | + BlueprintName = "WSWebImageDemoUITests" | ||
| 48 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 49 | + </BuildableReference> | ||
| 50 | + </TestableReference> | ||
| 51 | + </Testables> | ||
| 52 | + <MacroExpansion> | ||
| 53 | + <BuildableReference | ||
| 54 | + BuildableIdentifier = "primary" | ||
| 55 | + BlueprintIdentifier = "036CBF1F1D3731260044A601" | ||
| 56 | + BuildableName = "WSWebImageDemo.app" | ||
| 57 | + BlueprintName = "WSWebImageDemo" | ||
| 58 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 59 | + </BuildableReference> | ||
| 60 | + </MacroExpansion> | ||
| 61 | + <AdditionalOptions> | ||
| 62 | + </AdditionalOptions> | ||
| 63 | + </TestAction> | ||
| 64 | + <LaunchAction | ||
| 65 | + buildConfiguration = "Debug" | ||
| 66 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
| 67 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
| 68 | + launchStyle = "0" | ||
| 69 | + useCustomWorkingDirectory = "NO" | ||
| 70 | + ignoresPersistentStateOnLaunch = "NO" | ||
| 71 | + debugDocumentVersioning = "YES" | ||
| 72 | + debugServiceExtension = "internal" | ||
| 73 | + allowLocationSimulation = "YES"> | ||
| 74 | + <BuildableProductRunnable | ||
| 75 | + runnableDebuggingMode = "0"> | ||
| 76 | + <BuildableReference | ||
| 77 | + BuildableIdentifier = "primary" | ||
| 78 | + BlueprintIdentifier = "036CBF1F1D3731260044A601" | ||
| 79 | + BuildableName = "WSWebImageDemo.app" | ||
| 80 | + BlueprintName = "WSWebImageDemo" | ||
| 81 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 82 | + </BuildableReference> | ||
| 83 | + </BuildableProductRunnable> | ||
| 84 | + <AdditionalOptions> | ||
| 85 | + </AdditionalOptions> | ||
| 86 | + </LaunchAction> | ||
| 87 | + <ProfileAction | ||
| 88 | + buildConfiguration = "Release" | ||
| 89 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
| 90 | + savedToolIdentifier = "" | ||
| 91 | + useCustomWorkingDirectory = "NO" | ||
| 92 | + debugDocumentVersioning = "YES"> | ||
| 93 | + <BuildableProductRunnable | ||
| 94 | + runnableDebuggingMode = "0"> | ||
| 95 | + <BuildableReference | ||
| 96 | + BuildableIdentifier = "primary" | ||
| 97 | + BlueprintIdentifier = "036CBF1F1D3731260044A601" | ||
| 98 | + BuildableName = "WSWebImageDemo.app" | ||
| 99 | + BlueprintName = "WSWebImageDemo" | ||
| 100 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 101 | + </BuildableReference> | ||
| 102 | + </BuildableProductRunnable> | ||
| 103 | + </ProfileAction> | ||
| 104 | + <AnalyzeAction | ||
| 105 | + buildConfiguration = "Debug"> | ||
| 106 | + </AnalyzeAction> | ||
| 107 | + <ArchiveAction | ||
| 108 | + buildConfiguration = "Release" | ||
| 109 | + revealArchiveInOrganizer = "YES"> | ||
| 110 | + </ArchiveAction> | ||
| 111 | +</Scheme> |
WSWebImageDemo.xcodeproj/xcuserdata/leihaojie.xcuserdatad/xcschemes/xcschememanagement.plist
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | +<plist version="1.0"> | ||
| 4 | +<dict> | ||
| 5 | + <key>SchemeUserState</key> | ||
| 6 | + <dict> | ||
| 7 | + <key>WSWebImageDemo.xcscheme</key> | ||
| 8 | + <dict> | ||
| 9 | + <key>orderHint</key> | ||
| 10 | + <integer>0</integer> | ||
| 11 | + </dict> | ||
| 12 | + </dict> | ||
| 13 | + <key>SuppressBuildableAutocreation</key> | ||
| 14 | + <dict> | ||
| 15 | + <key>036CBF1F1D3731260044A601</key> | ||
| 16 | + <dict> | ||
| 17 | + <key>primary</key> | ||
| 18 | + <true/> | ||
| 19 | + </dict> | ||
| 20 | + <key>036CBF381D3731260044A601</key> | ||
| 21 | + <dict> | ||
| 22 | + <key>primary</key> | ||
| 23 | + <true/> | ||
| 24 | + </dict> | ||
| 25 | + <key>036CBF431D3731260044A601</key> | ||
| 26 | + <dict> | ||
| 27 | + <key>primary</key> | ||
| 28 | + <true/> | ||
| 29 | + </dict> | ||
| 30 | + </dict> | ||
| 31 | +</dict> | ||
| 32 | +</plist> |
WSWebImageDemo.xcodeproj/xcuserdata/wangshuai.xcuserdatad/xcschemes/WSWebImageDemo.xcscheme
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<Scheme | ||
| 3 | + LastUpgradeVersion = "0730" | ||
| 4 | + version = "1.3"> | ||
| 5 | + <BuildAction | ||
| 6 | + parallelizeBuildables = "YES" | ||
| 7 | + buildImplicitDependencies = "YES"> | ||
| 8 | + <BuildActionEntries> | ||
| 9 | + <BuildActionEntry | ||
| 10 | + buildForTesting = "YES" | ||
| 11 | + buildForRunning = "YES" | ||
| 12 | + buildForProfiling = "YES" | ||
| 13 | + buildForArchiving = "YES" | ||
| 14 | + buildForAnalyzing = "YES"> | ||
| 15 | + <BuildableReference | ||
| 16 | + BuildableIdentifier = "primary" | ||
| 17 | + BlueprintIdentifier = "036CBF1F1D3731260044A601" | ||
| 18 | + BuildableName = "WSWebImageDemo.app" | ||
| 19 | + BlueprintName = "WSWebImageDemo" | ||
| 20 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 21 | + </BuildableReference> | ||
| 22 | + </BuildActionEntry> | ||
| 23 | + </BuildActionEntries> | ||
| 24 | + </BuildAction> | ||
| 25 | + <TestAction | ||
| 26 | + buildConfiguration = "Debug" | ||
| 27 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
| 28 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
| 29 | + shouldUseLaunchSchemeArgsEnv = "YES"> | ||
| 30 | + <Testables> | ||
| 31 | + <TestableReference | ||
| 32 | + skipped = "NO"> | ||
| 33 | + <BuildableReference | ||
| 34 | + BuildableIdentifier = "primary" | ||
| 35 | + BlueprintIdentifier = "036CBF381D3731260044A601" | ||
| 36 | + BuildableName = "WSWebImageDemoTests.xctest" | ||
| 37 | + BlueprintName = "WSWebImageDemoTests" | ||
| 38 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 39 | + </BuildableReference> | ||
| 40 | + </TestableReference> | ||
| 41 | + <TestableReference | ||
| 42 | + skipped = "NO"> | ||
| 43 | + <BuildableReference | ||
| 44 | + BuildableIdentifier = "primary" | ||
| 45 | + BlueprintIdentifier = "036CBF431D3731260044A601" | ||
| 46 | + BuildableName = "WSWebImageDemoUITests.xctest" | ||
| 47 | + BlueprintName = "WSWebImageDemoUITests" | ||
| 48 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 49 | + </BuildableReference> | ||
| 50 | + </TestableReference> | ||
| 51 | + </Testables> | ||
| 52 | + <MacroExpansion> | ||
| 53 | + <BuildableReference | ||
| 54 | + BuildableIdentifier = "primary" | ||
| 55 | + BlueprintIdentifier = "036CBF1F1D3731260044A601" | ||
| 56 | + BuildableName = "WSWebImageDemo.app" | ||
| 57 | + BlueprintName = "WSWebImageDemo" | ||
| 58 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 59 | + </BuildableReference> | ||
| 60 | + </MacroExpansion> | ||
| 61 | + <AdditionalOptions> | ||
| 62 | + </AdditionalOptions> | ||
| 63 | + </TestAction> | ||
| 64 | + <LaunchAction | ||
| 65 | + buildConfiguration = "Debug" | ||
| 66 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||
| 67 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||
| 68 | + launchStyle = "0" | ||
| 69 | + useCustomWorkingDirectory = "NO" | ||
| 70 | + ignoresPersistentStateOnLaunch = "NO" | ||
| 71 | + debugDocumentVersioning = "YES" | ||
| 72 | + debugServiceExtension = "internal" | ||
| 73 | + allowLocationSimulation = "YES"> | ||
| 74 | + <BuildableProductRunnable | ||
| 75 | + runnableDebuggingMode = "0"> | ||
| 76 | + <BuildableReference | ||
| 77 | + BuildableIdentifier = "primary" | ||
| 78 | + BlueprintIdentifier = "036CBF1F1D3731260044A601" | ||
| 79 | + BuildableName = "WSWebImageDemo.app" | ||
| 80 | + BlueprintName = "WSWebImageDemo" | ||
| 81 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 82 | + </BuildableReference> | ||
| 83 | + </BuildableProductRunnable> | ||
| 84 | + <AdditionalOptions> | ||
| 85 | + </AdditionalOptions> | ||
| 86 | + </LaunchAction> | ||
| 87 | + <ProfileAction | ||
| 88 | + buildConfiguration = "Release" | ||
| 89 | + shouldUseLaunchSchemeArgsEnv = "YES" | ||
| 90 | + savedToolIdentifier = "" | ||
| 91 | + useCustomWorkingDirectory = "NO" | ||
| 92 | + debugDocumentVersioning = "YES"> | ||
| 93 | + <BuildableProductRunnable | ||
| 94 | + runnableDebuggingMode = "0"> | ||
| 95 | + <BuildableReference | ||
| 96 | + BuildableIdentifier = "primary" | ||
| 97 | + BlueprintIdentifier = "036CBF1F1D3731260044A601" | ||
| 98 | + BuildableName = "WSWebImageDemo.app" | ||
| 99 | + BlueprintName = "WSWebImageDemo" | ||
| 100 | + ReferencedContainer = "container:WSWebImageDemo.xcodeproj"> | ||
| 101 | + </BuildableReference> | ||
| 102 | + </BuildableProductRunnable> | ||
| 103 | + </ProfileAction> | ||
| 104 | + <AnalyzeAction | ||
| 105 | + buildConfiguration = "Debug"> | ||
| 106 | + </AnalyzeAction> | ||
| 107 | + <ArchiveAction | ||
| 108 | + buildConfiguration = "Release" | ||
| 109 | + revealArchiveInOrganizer = "YES"> | ||
| 110 | + </ArchiveAction> | ||
| 111 | +</Scheme> |
WSWebImageDemo.xcodeproj/xcuserdata/wangshuai.xcuserdatad/xcschemes/xcschememanagement.plist
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | +<plist version="1.0"> | ||
| 4 | +<dict> | ||
| 5 | + <key>SchemeUserState</key> | ||
| 6 | + <dict> | ||
| 7 | + <key>WSWebImageDemo.xcscheme</key> | ||
| 8 | + <dict> | ||
| 9 | + <key>orderHint</key> | ||
| 10 | + <integer>0</integer> | ||
| 11 | + </dict> | ||
| 12 | + </dict> | ||
| 13 | + <key>SuppressBuildableAutocreation</key> | ||
| 14 | + <dict> | ||
| 15 | + <key>036CBF1F1D3731260044A601</key> | ||
| 16 | + <dict> | ||
| 17 | + <key>primary</key> | ||
| 18 | + <true/> | ||
| 19 | + </dict> | ||
| 20 | + <key>036CBF381D3731260044A601</key> | ||
| 21 | + <dict> | ||
| 22 | + <key>primary</key> | ||
| 23 | + <true/> | ||
| 24 | + </dict> | ||
| 25 | + <key>036CBF431D3731260044A601</key> | ||
| 26 | + <dict> | ||
| 27 | + <key>primary</key> | ||
| 28 | + <true/> | ||
| 29 | + </dict> | ||
| 30 | + </dict> | ||
| 31 | +</dict> | ||
| 32 | +</plist> |
WSWebImageDemo/AppDelegate.h
0 → 100644
| 1 | +// | ||
| 2 | +// AppDelegate.h | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/14. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | + | ||
| 11 | +@interface AppDelegate : UIResponder <UIApplicationDelegate> | ||
| 12 | + | ||
| 13 | +@property (strong, nonatomic) UIWindow *window; | ||
| 14 | + | ||
| 15 | + | ||
| 16 | +@end | ||
| 17 | + |
WSWebImageDemo/AppDelegate.m
0 → 100644
| 1 | +// | ||
| 2 | +// AppDelegate.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/14. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "AppDelegate.h" | ||
| 10 | + | ||
| 11 | +@interface AppDelegate () | ||
| 12 | + | ||
| 13 | +@end | ||
| 14 | + | ||
| 15 | +@implementation AppDelegate | ||
| 16 | + | ||
| 17 | + | ||
| 18 | +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { | ||
| 19 | + // Override point for customization after application launch. | ||
| 20 | + return YES; | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +- (void)applicationWillResignActive:(UIApplication *)application { | ||
| 24 | + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. | ||
| 25 | + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. | ||
| 26 | +} | ||
| 27 | + | ||
| 28 | +- (void)applicationDidEnterBackground:(UIApplication *)application { | ||
| 29 | + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. | ||
| 30 | + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +- (void)applicationWillEnterForeground:(UIApplication *)application { | ||
| 34 | + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +- (void)applicationDidBecomeActive:(UIApplication *)application { | ||
| 38 | + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +- (void)applicationWillTerminate:(UIApplication *)application { | ||
| 42 | + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. | ||
| 43 | +} | ||
| 44 | + | ||
| 45 | +@end |
WSWebImageDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
0 → 100644
| 1 | +{ | ||
| 2 | + "images" : [ | ||
| 3 | + { | ||
| 4 | + "idiom" : "iphone", | ||
| 5 | + "size" : "29x29", | ||
| 6 | + "scale" : "2x" | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + "idiom" : "iphone", | ||
| 10 | + "size" : "29x29", | ||
| 11 | + "scale" : "3x" | ||
| 12 | + }, | ||
| 13 | + { | ||
| 14 | + "idiom" : "iphone", | ||
| 15 | + "size" : "40x40", | ||
| 16 | + "scale" : "2x" | ||
| 17 | + }, | ||
| 18 | + { | ||
| 19 | + "idiom" : "iphone", | ||
| 20 | + "size" : "40x40", | ||
| 21 | + "scale" : "3x" | ||
| 22 | + }, | ||
| 23 | + { | ||
| 24 | + "idiom" : "iphone", | ||
| 25 | + "size" : "60x60", | ||
| 26 | + "scale" : "2x" | ||
| 27 | + }, | ||
| 28 | + { | ||
| 29 | + "idiom" : "iphone", | ||
| 30 | + "size" : "60x60", | ||
| 31 | + "scale" : "3x" | ||
| 32 | + }, | ||
| 33 | + { | ||
| 34 | + "idiom" : "ipad", | ||
| 35 | + "size" : "29x29", | ||
| 36 | + "scale" : "1x" | ||
| 37 | + }, | ||
| 38 | + { | ||
| 39 | + "idiom" : "ipad", | ||
| 40 | + "size" : "29x29", | ||
| 41 | + "scale" : "2x" | ||
| 42 | + }, | ||
| 43 | + { | ||
| 44 | + "idiom" : "ipad", | ||
| 45 | + "size" : "40x40", | ||
| 46 | + "scale" : "1x" | ||
| 47 | + }, | ||
| 48 | + { | ||
| 49 | + "idiom" : "ipad", | ||
| 50 | + "size" : "40x40", | ||
| 51 | + "scale" : "2x" | ||
| 52 | + }, | ||
| 53 | + { | ||
| 54 | + "idiom" : "ipad", | ||
| 55 | + "size" : "76x76", | ||
| 56 | + "scale" : "1x" | ||
| 57 | + }, | ||
| 58 | + { | ||
| 59 | + "idiom" : "ipad", | ||
| 60 | + "size" : "76x76", | ||
| 61 | + "scale" : "2x" | ||
| 62 | + }, | ||
| 63 | + { | ||
| 64 | + "idiom" : "ipad", | ||
| 65 | + "size" : "83.5x83.5", | ||
| 66 | + "scale" : "2x" | ||
| 67 | + } | ||
| 68 | + ], | ||
| 69 | + "info" : { | ||
| 70 | + "version" : 1, | ||
| 71 | + "author" : "xcode" | ||
| 72 | + } | ||
| 73 | +} | ||
| 0 | \ No newline at end of file | 74 | \ No newline at end of file |
WSWebImageDemo/Base.lproj/LaunchScreen.storyboard
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM"> | ||
| 3 | + <dependencies> | ||
| 4 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/> | ||
| 5 | + </dependencies> | ||
| 6 | + <scenes> | ||
| 7 | + <!--View Controller--> | ||
| 8 | + <scene sceneID="EHf-IW-A2E"> | ||
| 9 | + <objects> | ||
| 10 | + <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | ||
| 11 | + <layoutGuides> | ||
| 12 | + <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/> | ||
| 13 | + <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/> | ||
| 14 | + </layoutGuides> | ||
| 15 | + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | ||
| 16 | + <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | ||
| 17 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||
| 18 | + <animations/> | ||
| 19 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | ||
| 20 | + </view> | ||
| 21 | + </viewController> | ||
| 22 | + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | ||
| 23 | + </objects> | ||
| 24 | + <point key="canvasLocation" x="53" y="375"/> | ||
| 25 | + </scene> | ||
| 26 | + </scenes> | ||
| 27 | +</document> |
WSWebImageDemo/Base.lproj/Main.storyboard
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> | ||
| 3 | + <dependencies> | ||
| 4 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/> | ||
| 5 | + </dependencies> | ||
| 6 | + <scenes> | ||
| 7 | + <!--View Controller--> | ||
| 8 | + <scene sceneID="tne-QT-ifu"> | ||
| 9 | + <objects> | ||
| 10 | + <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController"> | ||
| 11 | + <layoutGuides> | ||
| 12 | + <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> | ||
| 13 | + <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> | ||
| 14 | + </layoutGuides> | ||
| 15 | + <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> | ||
| 16 | + <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | ||
| 17 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||
| 18 | + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | ||
| 19 | + </view> | ||
| 20 | + </viewController> | ||
| 21 | + <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | ||
| 22 | + </objects> | ||
| 23 | + </scene> | ||
| 24 | + </scenes> | ||
| 25 | +</document> |
WSWebImageDemo/CNLiveWebImage/CNLiveImageCache.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveImageCache.h | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/19. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | +#import <UIKit/UIKit.h> | ||
| 11 | +#import "CNLiveWebImageBlock.h" | ||
| 12 | + | ||
| 13 | +//typedef void(^CNLiveWebImageQueryCompletedBlock)(UIImage *image, CNLiveImageCacheType type); | ||
| 14 | +typedef void(^CNLiveCompletedBlock)(); | ||
| 15 | + | ||
| 16 | +@interface CNLiveImageCache : NSObject | ||
| 17 | + | ||
| 18 | ++ (CNLiveImageCache *)sharedImageCache; | ||
| 19 | + | ||
| 20 | +- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk; | ||
| 21 | + | ||
| 22 | +- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key; | ||
| 23 | + | ||
| 24 | +- (UIImage *)imageFromDiskCacheForKey:(NSString *)key; | ||
| 25 | + | ||
| 26 | +- (BOOL)queryDiskCacheForKey:(NSString *)key done:(CNLiveWebImageQueryCompletedBlock)doneBlock; | ||
| 27 | + | ||
| 28 | +- (void)removeCacheForKey:(NSString *)key done:(CNLiveCompletedBlock)completed; | ||
| 29 | + | ||
| 30 | +- (long long)diskCacheSize; | ||
| 31 | + | ||
| 32 | +- (void)clearMemory; | ||
| 33 | + | ||
| 34 | +- (void)clearDisk; | ||
| 35 | + | ||
| 36 | +@end |
WSWebImageDemo/CNLiveWebImage/CNLiveImageCache.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveImageCache.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/19. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveImageCache.h" | ||
| 10 | +#import <CommonCrypto/CommonDigest.h> | ||
| 11 | +#import "UIImage+CNLiveMultiFormat.h" | ||
| 12 | + | ||
| 13 | +FOUNDATION_STATIC_INLINE NSUInteger CNLiveCacheCostForImage(UIImage *image) { | ||
| 14 | + return image.size.height * image.size.width * image.scale * image.scale; | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +typedef void(^CNLiveWebImageNoParamsBlock)(); | ||
| 18 | + | ||
| 19 | +@interface CNLiveImageCache () | ||
| 20 | + | ||
| 21 | +@property (nonatomic, strong) NSCache *memoryCache; | ||
| 22 | +@property (nonatomic, copy) NSString *diskCachePath; | ||
| 23 | +@property (nonatomic, strong) dispatch_queue_t ioQueue; | ||
| 24 | + | ||
| 25 | +@end | ||
| 26 | + | ||
| 27 | +@implementation CNLiveImageCache | ||
| 28 | +{ | ||
| 29 | + NSFileManager *_fileManager; | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | ++ (CNLiveImageCache *)sharedImageCache | ||
| 33 | +{ | ||
| 34 | + static dispatch_once_t onceToken; | ||
| 35 | + static id instance; | ||
| 36 | + dispatch_once(&onceToken, ^{ | ||
| 37 | + instance = [self new]; | ||
| 38 | + }); | ||
| 39 | + return instance; | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +- (id)init { | ||
| 43 | + return [self initWithNamespace:@"default"]; | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +- (id)initWithNamespace:(NSString *)ns { | ||
| 47 | + NSString *path = [self makeDiskCachePath:ns]; | ||
| 48 | + return [self initWithNamespace:ns diskCacheDirectory:path]; | ||
| 49 | +} | ||
| 50 | + | ||
| 51 | +- (NSString *)makeDiskCachePath:(NSString *)fullNamespace { | ||
| 52 | + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); | ||
| 53 | + return [paths[0] stringByAppendingString:fullNamespace]; | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory { | ||
| 57 | + if (self = [super init]) { | ||
| 58 | + NSString *fullNameSpace = [@"com.cnlive.CNLiveImageCache." stringByAppendingString:ns]; | ||
| 59 | + _ioQueue = dispatch_queue_create("com.cnlive.CNLiveImageCacheQueue", DISPATCH_QUEUE_SERIAL); | ||
| 60 | + _memoryCache = [[NSCache alloc] init]; | ||
| 61 | + _memoryCache.name = fullNameSpace; | ||
| 62 | + | ||
| 63 | + if (directory != nil) { | ||
| 64 | + _diskCachePath = [directory stringByAppendingPathComponent:fullNameSpace]; | ||
| 65 | + } | ||
| 66 | + else { | ||
| 67 | + _diskCachePath = [[self makeDiskCachePath:ns] stringByAppendingPathComponent:fullNameSpace]; | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + dispatch_sync(_ioQueue, ^{ | ||
| 71 | + _fileManager = [NSFileManager new]; | ||
| 72 | + }); | ||
| 73 | + | ||
| 74 | + [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 75 | + selector:@selector(clearMemory) | ||
| 76 | + name:UIApplicationDidReceiveMemoryWarningNotification | ||
| 77 | + object:nil]; | ||
| 78 | + | ||
| 79 | +// [[NSNotificationCenter defaultCenter] addObserver:self | ||
| 80 | +// selector:@selector(clearDisk) | ||
| 81 | +// name:UIApplicationWillTerminateNotification | ||
| 82 | +// object:nil]; | ||
| 83 | + } | ||
| 84 | + return self; | ||
| 85 | +} | ||
| 86 | + | ||
| 87 | +- (void)dealloc | ||
| 88 | +{ | ||
| 89 | + [[NSNotificationCenter defaultCenter] removeObserver:self]; | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk | ||
| 93 | +{ | ||
| 94 | + if (!image || !key) { | ||
| 95 | + return; | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + NSUInteger cost = CNLiveCacheCostForImage(image); | ||
| 99 | + [_memoryCache setObject:image forKey:key cost:cost]; | ||
| 100 | + | ||
| 101 | + if (toDisk) { | ||
| 102 | + dispatch_async(_ioQueue, ^{ | ||
| 103 | + NSData *data = UIImageJPEGRepresentation(image, 1.0); | ||
| 104 | + | ||
| 105 | + if (data) { | ||
| 106 | + if (![_fileManager fileExistsAtPath:_diskCachePath]) { | ||
| 107 | + [_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; | ||
| 108 | + } | ||
| 109 | + NSString *cachePathForKey = [self defaultCachePathForKey:key]; | ||
| 110 | + [_fileManager createFileAtPath:cachePathForKey contents:data attributes:nil]; | ||
| 111 | + } | ||
| 112 | + }); | ||
| 113 | + } | ||
| 114 | +} | ||
| 115 | + | ||
| 116 | +- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key | ||
| 117 | +{ | ||
| 118 | + return [self.memoryCache objectForKey:key]; | ||
| 119 | +} | ||
| 120 | + | ||
| 121 | +- (UIImage *)imageFromDiskCacheForKey:(NSString *)key | ||
| 122 | +{ | ||
| 123 | + UIImage *memoryImage = [self imageFromMemoryCacheForKey:key]; | ||
| 124 | + if (memoryImage) { | ||
| 125 | + return memoryImage; | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + NSData *diskData = [self getDiskImageDataWithKey:key]; | ||
| 129 | + if (diskData) { | ||
| 130 | + return [UIImage ws_imageWithData:diskData]; | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + return nil; | ||
| 134 | +} | ||
| 135 | + | ||
| 136 | +- (BOOL)queryDiskCacheForKey:(NSString *)key done:(CNLiveWebImageQueryCompletedBlock)doneBlock | ||
| 137 | +{ | ||
| 138 | + if (!doneBlock) { | ||
| 139 | + return NO; | ||
| 140 | + } | ||
| 141 | + if (!key) { | ||
| 142 | + doneBlock(nil, CNLiveImageCacheTypeNone); | ||
| 143 | + return NO; | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + UIImage *memoryImage = [self imageFromMemoryCacheForKey:key]; | ||
| 147 | + if (memoryImage) { | ||
| 148 | + doneBlock(memoryImage, CNLiveImageCacheTypeMemory); | ||
| 149 | + return YES; | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + UIImage *diskImage = [self imageFromDiskCacheForKey:key]; | ||
| 153 | + if (diskImage) { | ||
| 154 | + doneBlock(diskImage, CNLiveImageCacheTypeDisk); | ||
| 155 | + return YES; | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + doneBlock(nil, CNLiveImageCacheTypeNone); | ||
| 159 | + return NO; | ||
| 160 | + | ||
| 161 | +} | ||
| 162 | + | ||
| 163 | +- (void)removeCacheForKey:(NSString *)key done:(CNLiveCompletedBlock)completed | ||
| 164 | +{ | ||
| 165 | + if (!key || !completed) { | ||
| 166 | + return; | ||
| 167 | + } | ||
| 168 | + | ||
| 169 | + if ([self imageFromMemoryCacheForKey:key]) { | ||
| 170 | + [self.memoryCache removeObjectForKey:key]; | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + if ([self imageFromDiskCacheForKey:key]) { | ||
| 174 | + NSString *cachePathForKey = [self defaultCachePathForKey:key]; | ||
| 175 | + [_fileManager removeItemAtPath:cachePathForKey error:nil]; | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + completed(); | ||
| 179 | +} | ||
| 180 | + | ||
| 181 | +- (long long)diskCacheSize | ||
| 182 | +{ | ||
| 183 | + if ([_fileManager fileExistsAtPath:self.diskCachePath]) { | ||
| 184 | + NSArray *subPathArray = [_fileManager subpathsAtPath:self.diskCachePath]; | ||
| 185 | + if (subPathArray && subPathArray.count > 0) { | ||
| 186 | + long long totalCacheSize = 0; | ||
| 187 | + for (NSString *subPath in subPathArray) { | ||
| 188 | + NSString *fullPath = [self.diskCachePath stringByAppendingPathComponent:subPath]; | ||
| 189 | + NSDictionary *cacheSizeDic = [_fileManager attributesOfItemAtPath:fullPath error:nil]; | ||
| 190 | + totalCacheSize += [cacheSizeDic fileSize]; | ||
| 191 | + } | ||
| 192 | + return totalCacheSize; | ||
| 193 | + } | ||
| 194 | + } | ||
| 195 | + return 0; | ||
| 196 | +} | ||
| 197 | + | ||
| 198 | +- (void)clearMemory | ||
| 199 | +{ | ||
| 200 | + [self.memoryCache removeAllObjects]; | ||
| 201 | +} | ||
| 202 | + | ||
| 203 | +- (void)clearDisk | ||
| 204 | +{ | ||
| 205 | + [self clearDiskOnCompletion:nil]; | ||
| 206 | +} | ||
| 207 | + | ||
| 208 | +- (void)clearDiskOnCompletion:(CNLiveWebImageNoParamsBlock)completion | ||
| 209 | +{ | ||
| 210 | + dispatch_async(self.ioQueue, ^{ | ||
| 211 | + [_fileManager removeItemAtPath:self.diskCachePath error:nil]; | ||
| 212 | + [_fileManager createDirectoryAtPath:self.diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; | ||
| 213 | + | ||
| 214 | + if (completion) { | ||
| 215 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 216 | + completion(); | ||
| 217 | + }); | ||
| 218 | + } | ||
| 219 | + }); | ||
| 220 | +} | ||
| 221 | + | ||
| 222 | +#pragma mark <PrivateMethod> | ||
| 223 | +- (NSData *)getDiskImageDataWithKey:(NSString *)key | ||
| 224 | +{ | ||
| 225 | + NSString *filePath = [self defaultCachePathForKey:key]; | ||
| 226 | + NSData *imageData = [NSData dataWithContentsOfFile:filePath]; | ||
| 227 | + return imageData; | ||
| 228 | +} | ||
| 229 | + | ||
| 230 | +- (NSString *)defaultCachePathForKey:(NSString *)key | ||
| 231 | +{ | ||
| 232 | + return [self cachePathForKey:key inPath:self.diskCachePath]; | ||
| 233 | +} | ||
| 234 | + | ||
| 235 | +- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path | ||
| 236 | +{ | ||
| 237 | + NSString *fileName = [self cachedFileNameForKey:key]; | ||
| 238 | + return [path stringByAppendingPathComponent:fileName]; | ||
| 239 | +} | ||
| 240 | + | ||
| 241 | +- (NSString *)cachedFileNameForKey:(NSString *)key { | ||
| 242 | + const char *str = [key UTF8String]; | ||
| 243 | + if (str == NULL) { | ||
| 244 | + str = ""; | ||
| 245 | + } | ||
| 246 | + unsigned char r[CC_MD5_DIGEST_LENGTH]; | ||
| 247 | + CC_MD5(str, (CC_LONG)strlen(str), r); | ||
| 248 | + NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", | ||
| 249 | + r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], r[11], r[12], r[13], r[14], r[15]]; | ||
| 250 | + | ||
| 251 | + return filename; | ||
| 252 | +} | ||
| 253 | + | ||
| 254 | +@end |
WSWebImageDemo/CNLiveWebImage/CNLiveWebImageBlock.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveWebImageBlock.h | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/27. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#ifndef CNLiveWebImageBlock_h | ||
| 10 | +#define CNLiveWebImageBlock_h | ||
| 11 | + | ||
| 12 | +typedef NS_ENUM(NSUInteger, CNLiveImageCacheType) { | ||
| 13 | + CNLiveImageCacheTypeNone, | ||
| 14 | + CNLiveImageCacheTypeMemory, | ||
| 15 | + CNLiveImageCacheTypeDisk | ||
| 16 | +}; | ||
| 17 | + | ||
| 18 | +typedef void(^CNLiveDownloadProgressBlock)(NSInteger receivedSize, NSInteger expectedSize); | ||
| 19 | +typedef void(^CNLiveDownloadCompletedBlock)(UIImage *image, NSData *data, NSError *error, BOOL finished); | ||
| 20 | + | ||
| 21 | +typedef void(^CNLiveWebImageQueryCompletedBlock)(UIImage *image, CNLiveImageCacheType type); | ||
| 22 | +typedef void(^CNLiveCompletedBlock)(); | ||
| 23 | +typedef void(^CNLiveWebImageNoParamsBlock)(); | ||
| 24 | + | ||
| 25 | +#endif /* CNLiveWebImageBlock_h */ |
WSWebImageDemo/CNLiveWebImage/CNLiveWebImageDownload.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveWebImageDownload.h | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/14. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | +#import <UIKit/UIKit.h> | ||
| 11 | +#import "CNLiveWebImageOperation.h" | ||
| 12 | +#import "CNLiveWebImageBlock.h" | ||
| 13 | + | ||
| 14 | +typedef NS_OPTIONS(NSUInteger, CNLiveWebImageDownloadOptions) { | ||
| 15 | + CNLiveWebImageDownloadProgressiveDownload = 1 << 0, | ||
| 16 | + CNLiveWebImageDownloadContinueInBackground = 1 << 1 | ||
| 17 | +}; | ||
| 18 | + | ||
| 19 | +@interface CNLiveWebImageDownload : NSObject | ||
| 20 | + | ||
| 21 | ++ (CNLiveWebImageDownload *)sharedDownload; | ||
| 22 | + | ||
| 23 | +- (id <CNLiveWebImageOperation>)downloadWebImageWithURL:(NSURL *)url options:(CNLiveWebImageDownloadOptions)options progress:(CNLiveDownloadProgressBlock)progress completed:(CNLiveDownloadCompletedBlock)completed; | ||
| 24 | + | ||
| 25 | +@end |
WSWebImageDemo/CNLiveWebImage/CNLiveWebImageDownload.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveWebImageDownload.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/14. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveWebImageDownload.h" | ||
| 10 | +#import "CNLiveWebImageDownloadOperation.h" | ||
| 11 | + | ||
| 12 | +@interface CNLiveWebImageDownload () | ||
| 13 | + | ||
| 14 | +@property (nonatomic, strong) NSOperationQueue *downloadQueue; | ||
| 15 | + | ||
| 16 | +@end | ||
| 17 | + | ||
| 18 | +@implementation CNLiveWebImageDownload | ||
| 19 | + | ||
| 20 | ++ (CNLiveWebImageDownload *)sharedDownload | ||
| 21 | +{ | ||
| 22 | + static dispatch_once_t once; | ||
| 23 | + static id instance; | ||
| 24 | + dispatch_once(&once, ^{ | ||
| 25 | + instance = [self new]; | ||
| 26 | + }); | ||
| 27 | + return instance; | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +- (instancetype)init | ||
| 31 | +{ | ||
| 32 | + if ((self = [super init])) { | ||
| 33 | + _downloadQueue = [NSOperationQueue new]; | ||
| 34 | + _downloadQueue.maxConcurrentOperationCount = 6; | ||
| 35 | + } | ||
| 36 | + return self; | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +- (void)dealloc | ||
| 40 | +{ | ||
| 41 | + [self.downloadQueue cancelAllOperations]; | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +- (id<CNLiveWebImageOperation>)downloadWebImageWithURL:(NSURL *)url options:(CNLiveWebImageDownloadOptions)options progress:(CNLiveDownloadProgressBlock)progress completed:(CNLiveDownloadCompletedBlock)completed | ||
| 45 | +{ | ||
| 46 | + CNLiveWebImageDownloadOperation *operation; | ||
| 47 | + operation = [[CNLiveWebImageDownloadOperation alloc] initWithURL:url | ||
| 48 | + options:options | ||
| 49 | + progress:progress | ||
| 50 | + completed:completed]; | ||
| 51 | + [self.downloadQueue addOperation:operation]; | ||
| 52 | + return (id <CNLiveWebImageOperation>)operation; | ||
| 53 | +} | ||
| 54 | +@end |
WSWebImageDemo/CNLiveWebImage/CNLiveWebImageDownloadOperation.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveWebImageDownloadOperation.h | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/25. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | +#import "CNLiveWebImageDownload.h" | ||
| 11 | +#import "CNLiveWebImageBlock.h" | ||
| 12 | + | ||
| 13 | +@interface CNLiveWebImageDownloadOperation : NSOperation | ||
| 14 | + | ||
| 15 | +- (id)initWithURL:(NSURL *)url options:(CNLiveWebImageDownloadOptions)options progress:(CNLiveDownloadProgressBlock)progress completed:(CNLiveDownloadCompletedBlock)completed; | ||
| 16 | + | ||
| 17 | +@end |
WSWebImageDemo/CNLiveWebImage/CNLiveWebImageDownloadOperation.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveWebImageDownloadOperation.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/25. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveWebImageDownloadOperation.h" | ||
| 10 | +#import "CNLiveWebImageOperation.h" | ||
| 11 | +#import <ImageIO/ImageIO.h> | ||
| 12 | +#import "UIImage+CNLiveMultiFormat.h" | ||
| 13 | + | ||
| 14 | +#define CNLiveWebImageBackgroundSessionIdentifier @"CNLiveWebImageBackgroundSessionIdentifier" | ||
| 15 | + | ||
| 16 | +@interface CNLiveWebImageDownloadOperation ()<CNLiveWebImageOperation, NSURLSessionDataDelegate, NSURLSessionTaskDelegate, NSURLSessionDelegate> | ||
| 17 | + | ||
| 18 | +@property (nonatomic, copy) CNLiveDownloadProgressBlock progressBlock; | ||
| 19 | +@property (nonatomic, copy) CNLiveDownloadCompletedBlock completedBlock; | ||
| 20 | +@property (nonatomic, assign) CNLiveWebImageDownloadOptions options; | ||
| 21 | +@property (nonatomic, strong) NSURL *url; | ||
| 22 | + | ||
| 23 | +@property (nonatomic, assign, getter = isExecuting) BOOL executing; | ||
| 24 | +@property (nonatomic, assign, getter = isFinished) BOOL finished; | ||
| 25 | +@property (nonatomic, strong) NSURLSessionConfiguration *config; | ||
| 26 | +@property (nonatomic, strong) NSURLSession *session; | ||
| 27 | +@property (nonatomic, strong) NSURLSessionDataTask *dataTask; | ||
| 28 | +@property (nonatomic, assign) NSInteger expectedSize; | ||
| 29 | +@property (nonatomic, strong) NSMutableData *imageData; | ||
| 30 | +@property (nonatomic, strong) NSURLResponse *response; | ||
| 31 | + | ||
| 32 | +@end | ||
| 33 | + | ||
| 34 | +@implementation CNLiveWebImageDownloadOperation | ||
| 35 | + | ||
| 36 | +- (id)initWithURL:(NSURL *)url options:(CNLiveWebImageDownloadOptions)options progress:(CNLiveDownloadProgressBlock)progress completed:(CNLiveDownloadCompletedBlock)completed | ||
| 37 | +{ | ||
| 38 | + if ((self = [super init])) { | ||
| 39 | + _url = url; | ||
| 40 | + _progressBlock = progress; | ||
| 41 | + _completedBlock = completed; | ||
| 42 | + _options = options; | ||
| 43 | + } | ||
| 44 | + return self; | ||
| 45 | +} | ||
| 46 | + | ||
| 47 | +@synthesize executing = _executing; | ||
| 48 | +@synthesize finished = _finished; | ||
| 49 | + | ||
| 50 | +- (void)setFinished:(BOOL)finished { | ||
| 51 | + [self willChangeValueForKey:@"isFinished"]; | ||
| 52 | + _finished = finished; | ||
| 53 | + [self didChangeValueForKey:@"isFinished"]; | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +- (void)setExecuting:(BOOL)executing { | ||
| 57 | + [self willChangeValueForKey:@"isExecuting"]; | ||
| 58 | + _executing = executing; | ||
| 59 | + [self didChangeValueForKey:@"isExecuting"]; | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +- (BOOL)isConcurrent | ||
| 63 | +{ | ||
| 64 | + return YES; | ||
| 65 | +} | ||
| 66 | + | ||
| 67 | +- (void)start | ||
| 68 | +{ | ||
| 69 | + @synchronized (self) { | ||
| 70 | + if (self.isCancelled) { | ||
| 71 | + return; | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + self.dataTask = [self.session dataTaskWithURL:self.url]; | ||
| 75 | + [self.dataTask resume]; | ||
| 76 | + [self.session finishTasksAndInvalidate]; | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +- (NSURLSessionConfiguration *)config | ||
| 80 | +{ | ||
| 81 | + if (!_config) { | ||
| 82 | + if (self.options & CNLiveWebImageDownloadContinueInBackground) { | ||
| 83 | + _config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:CNLiveWebImageBackgroundSessionIdentifier]; | ||
| 84 | + } | ||
| 85 | + else { | ||
| 86 | + _config = [NSURLSessionConfiguration ephemeralSessionConfiguration]; | ||
| 87 | + } | ||
| 88 | + } | ||
| 89 | + return _config; | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +- (NSURLSession *)session | ||
| 93 | +{ | ||
| 94 | + if (!_session) { | ||
| 95 | + _session = [NSURLSession sessionWithConfiguration:self.config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; | ||
| 96 | + } | ||
| 97 | + return _session; | ||
| 98 | +} | ||
| 99 | + | ||
| 100 | +#pragma mark <NSURLSessionDataDelegate> | ||
| 101 | +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler | ||
| 102 | +{ | ||
| 103 | + if (![response respondsToSelector:@selector(statusCode)] || ([((NSHTTPURLResponse *)response) statusCode] < 400 && [((NSHTTPURLResponse *)response) statusCode] != 304)) { | ||
| 104 | + NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; | ||
| 105 | + self.expectedSize = expected; | ||
| 106 | + if (self.progressBlock) { | ||
| 107 | + self.progressBlock(0, expected); | ||
| 108 | + } | ||
| 109 | + | ||
| 110 | + self.imageData = [[NSMutableData alloc] initWithCapacity:expected]; | ||
| 111 | + self.response = response; | ||
| 112 | + completionHandler(NSURLSessionResponseAllow); | ||
| 113 | + } | ||
| 114 | + else { | ||
| 115 | + | ||
| 116 | + [self.dataTask cancel]; | ||
| 117 | + | ||
| 118 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 119 | + if (self.completedBlock) { | ||
| 120 | + self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:[((NSHTTPURLResponse *)response) statusCode] userInfo:nil], YES); | ||
| 121 | + } | ||
| 122 | + }); | ||
| 123 | + [self done]; | ||
| 124 | + } | ||
| 125 | +} | ||
| 126 | + | ||
| 127 | +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data | ||
| 128 | +{ | ||
| 129 | + [self.imageData appendData:data]; | ||
| 130 | + if (self.options & CNLiveWebImageDownloadProgressiveDownload && self.completedBlock) { | ||
| 131 | + const NSInteger totalSize = self.imageData.length; | ||
| 132 | + CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)self.imageData, NULL); | ||
| 133 | + if (totalSize < self.expectedSize) { | ||
| 134 | + CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); | ||
| 135 | + if (partialImageRef) { | ||
| 136 | + UIImage *image = [UIImage imageWithCGImage:partialImageRef]; | ||
| 137 | + CGImageRelease(partialImageRef); | ||
| 138 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 139 | + if (self.completedBlock) { | ||
| 140 | + self.completedBlock(image, self.imageData, nil, NO); | ||
| 141 | + } | ||
| 142 | + }); | ||
| 143 | + } | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + CFRelease(imageSource); | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 150 | + if (self.progressBlock) { | ||
| 151 | + self.progressBlock(self.imageData.length, self.expectedSize); | ||
| 152 | + } | ||
| 153 | + }); | ||
| 154 | +} | ||
| 155 | + | ||
| 156 | +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error | ||
| 157 | +{ | ||
| 158 | + if (error) { | ||
| 159 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 160 | + if (self.completedBlock) { | ||
| 161 | + self.completedBlock(nil, nil, error, NO); | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + }); | ||
| 165 | + } | ||
| 166 | + else { | ||
| 167 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 168 | + if (self.completedBlock) { | ||
| 169 | + self.completedBlock([UIImage ws_imageWithData:self.imageData], self.imageData, nil, YES); | ||
| 170 | + } | ||
| 171 | + }); | ||
| 172 | + } | ||
| 173 | + [self done]; | ||
| 174 | +} | ||
| 175 | + | ||
| 176 | +- (void)cancel | ||
| 177 | +{ | ||
| 178 | + if (self.session) { | ||
| 179 | + [self.session invalidateAndCancel]; | ||
| 180 | + } | ||
| 181 | + self.completedBlock = nil; | ||
| 182 | + self.progressBlock = nil; | ||
| 183 | + self.session = nil; | ||
| 184 | + self.imageData = nil; | ||
| 185 | + if (self.isExecuting) self.executing = NO; | ||
| 186 | + if (!self.isFinished) self.finished = YES; | ||
| 187 | +} | ||
| 188 | + | ||
| 189 | +- (void)done { | ||
| 190 | + self.finished = YES; | ||
| 191 | + self.executing = NO; | ||
| 192 | +} | ||
| 193 | + | ||
| 194 | +@end |
WSWebImageDemo/CNLiveWebImage/CNLiveWebImageManager.h
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveWebImageManager.h | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/27. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | +#import <UIKit/UIKit.h> | ||
| 11 | +#import "CNLiveWebImageBlock.h" | ||
| 12 | +#import "CNLiveWebImageOperation.h" | ||
| 13 | + | ||
| 14 | +typedef NS_OPTIONS(NSUInteger, CNLiveWebImageOptions) { | ||
| 15 | + CNLiveWebImageRetryFailed = 1 << 0, | ||
| 16 | + CNLiveWebImageCacheMemoryOnly = 1 << 1, | ||
| 17 | + CNLiveWebImageProgressiveDownload = 1 << 2, | ||
| 18 | + CNLiveWebImageContinueInBackground = 1 << 3 | ||
| 19 | +}; | ||
| 20 | + | ||
| 21 | +@interface CNLiveWebImageManager : NSObject | ||
| 22 | + | ||
| 23 | ++ (nonnull id)sharedManager; | ||
| 24 | + | ||
| 25 | +- (nonnull id <CNLiveWebImageOperation>)downloadWebImageWithURL:(nonnull NSURL *)url options:(CNLiveWebImageOptions)options progress:(nonnull CNLiveDownloadProgressBlock)progress completed:(nonnull CNLiveDownloadCompletedBlock)completed; | ||
| 26 | + | ||
| 27 | +- (void)storeImage:(nonnull UIImage *)image imageUrl:(nonnull NSURL *)url toDisk:(BOOL)toDisk; | ||
| 28 | + | ||
| 29 | +- (nullable UIImage *)imageFromMemoryCacheWithImageUrl:(nonnull NSURL *)url; | ||
| 30 | + | ||
| 31 | +- (nullable UIImage *)imageFromDiskCacheWithImageUrl:(nonnull NSURL *)url; | ||
| 32 | + | ||
| 33 | +- (BOOL)queryDiskCacheWithImageUrl:(nonnull NSURL *)url done:(nonnull CNLiveWebImageQueryCompletedBlock)doneBlock; | ||
| 34 | + | ||
| 35 | +- (void)removeCacheWithUrl:(nonnull NSURL *)url done:(nonnull CNLiveCompletedBlock)completed; | ||
| 36 | + | ||
| 37 | +- (long long)diskCacheSize; | ||
| 38 | + | ||
| 39 | +- (void)clearMemory; | ||
| 40 | + | ||
| 41 | +- (void)clearDisk; | ||
| 42 | + | ||
| 43 | +@end |
WSWebImageDemo/CNLiveWebImage/CNLiveWebImageManager.m
0 → 100644
| 1 | +// | ||
| 2 | +// CNLiveWebImageManager.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/27. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "CNLiveWebImageManager.h" | ||
| 10 | +#import "CNLiveWebImageDownload.h" | ||
| 11 | +#import "CNLiveImageCache.h" | ||
| 12 | + | ||
| 13 | +@interface CNLiveWebImageManager () | ||
| 14 | + | ||
| 15 | +@property (nonatomic, strong) CNLiveImageCache *imageCache; | ||
| 16 | +@property (nonatomic, strong) NSMutableSet *failedURLs; | ||
| 17 | + | ||
| 18 | +@end | ||
| 19 | + | ||
| 20 | +@implementation CNLiveWebImageManager | ||
| 21 | + | ||
| 22 | ++ (id)sharedManager | ||
| 23 | +{ | ||
| 24 | + static id manager; | ||
| 25 | + static dispatch_once_t once; | ||
| 26 | + dispatch_once(&once, ^{ | ||
| 27 | + manager = [self new]; | ||
| 28 | + }); | ||
| 29 | + return manager; | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +- (instancetype)init | ||
| 33 | +{ | ||
| 34 | + if ((self = [super init])) { | ||
| 35 | + _imageCache = [CNLiveImageCache sharedImageCache]; | ||
| 36 | + _failedURLs = [NSMutableSet new]; | ||
| 37 | + } | ||
| 38 | + return self; | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +- (id<CNLiveWebImageOperation>)downloadWebImageWithURL:(NSURL *)url options:(CNLiveWebImageOptions)options progress:(CNLiveDownloadProgressBlock)progress completed:(CNLiveDownloadCompletedBlock)completed | ||
| 42 | +{ | ||
| 43 | + if ([url isKindOfClass:NSString.class]) { | ||
| 44 | + url = [NSURL URLWithString:(NSString *)url]; | ||
| 45 | + } | ||
| 46 | + if (![url isKindOfClass:NSURL.class]) { | ||
| 47 | + url = nil; | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + BOOL isFailedUrl = NO; | ||
| 51 | + @synchronized (self.failedURLs) { | ||
| 52 | + isFailedUrl = [self.failedURLs containsObject:url]; | ||
| 53 | + } | ||
| 54 | + if (!url || (!(options & CNLiveWebImageRetryFailed) && isFailedUrl)) { | ||
| 55 | + NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]; | ||
| 56 | + completed(nil, nil, error, YES); | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + BOOL hasCacheImage = [self.imageCache queryDiskCacheForKey:url.absoluteString done:^(UIImage *image, CNLiveImageCacheType type) { | ||
| 60 | + if (image) { | ||
| 61 | + completed(image,UIImageJPEGRepresentation(image, 1.0), nil, YES); | ||
| 62 | + } | ||
| 63 | + }];; | ||
| 64 | + | ||
| 65 | + if (hasCacheImage) { | ||
| 66 | + return nil; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + | ||
| 70 | + CNLiveWebImageDownloadOptions downloadOptions = 0; | ||
| 71 | + if (options & CNLiveWebImageProgressiveDownload) downloadOptions |= CNLiveWebImageDownloadProgressiveDownload; | ||
| 72 | + if (options & CNLiveWebImageContinueInBackground) downloadOptions |= CNLiveWebImageDownloadContinueInBackground; | ||
| 73 | + id <CNLiveWebImageOperation> operation = [[CNLiveWebImageDownload sharedDownload] downloadWebImageWithURL:url options:downloadOptions progress:progress completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { | ||
| 74 | + if (error) { | ||
| 75 | + BOOL shouldBeFailedURLAlliOSVersion = (error.code != NSURLErrorNotConnectedToInternet && error.code != NSURLErrorCancelled && error.code != NSURLErrorTimedOut); | ||
| 76 | + BOOL shouldBeFailedURLiOS7 = (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1 && error.code != NSURLErrorInternationalRoamingOff && error.code != NSURLErrorCallIsActive && error.code != NSURLErrorDataNotAllowed); | ||
| 77 | + if (shouldBeFailedURLAlliOSVersion || shouldBeFailedURLiOS7) { | ||
| 78 | + @synchronized (self.failedURLs) { | ||
| 79 | + [self.failedURLs addObject:url]; | ||
| 80 | + } | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | + else { | ||
| 84 | + if ((options & CNLiveWebImageRetryFailed)) { | ||
| 85 | + @synchronized (self.failedURLs) { | ||
| 86 | + [self.failedURLs removeObject:url]; | ||
| 87 | + } | ||
| 88 | + } | ||
| 89 | + | ||
| 90 | + BOOL cacheOnDisk = !(options & CNLiveWebImageCacheMemoryOnly); | ||
| 91 | + if (image && finished) { | ||
| 92 | + if (cacheOnDisk) { | ||
| 93 | + [self.imageCache storeImage:image forKey:[url absoluteString] toDisk:YES]; | ||
| 94 | + } | ||
| 95 | + else { | ||
| 96 | + [self.imageCache storeImage:image forKey:[url absoluteString] toDisk:NO]; | ||
| 97 | + } | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + completed(image, data, error, finished); | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + }]; | ||
| 104 | + return operation; | ||
| 105 | +} | ||
| 106 | + | ||
| 107 | +- (void)storeImage:(UIImage *)image imageUrl:(NSURL *)url toDisk:(BOOL)toDisk | ||
| 108 | +{ | ||
| 109 | + [self.imageCache storeImage:image forKey:url.absoluteString toDisk:toDisk]; | ||
| 110 | +} | ||
| 111 | + | ||
| 112 | +- (UIImage *)imageFromMemoryCacheWithImageUrl:(NSURL *)url | ||
| 113 | +{ | ||
| 114 | + return [self.imageCache imageFromMemoryCacheForKey:url.absoluteString]; | ||
| 115 | +} | ||
| 116 | + | ||
| 117 | +- (UIImage *)imageFromDiskCacheWithImageUrl:(NSURL *)url | ||
| 118 | +{ | ||
| 119 | + return [self.imageCache imageFromDiskCacheForKey:url.absoluteString]; | ||
| 120 | +} | ||
| 121 | + | ||
| 122 | +- (BOOL)queryDiskCacheWithImageUrl:(NSURL *)url done:(CNLiveWebImageQueryCompletedBlock)doneBlock | ||
| 123 | +{ | ||
| 124 | + return [self.imageCache queryDiskCacheForKey:url.absoluteString done:doneBlock]; | ||
| 125 | +} | ||
| 126 | + | ||
| 127 | +- (void)removeCacheWithUrl:(NSURL *)url done:(CNLiveCompletedBlock)completed | ||
| 128 | +{ | ||
| 129 | + [self.imageCache removeCacheForKey:url.absoluteString done:completed]; | ||
| 130 | +} | ||
| 131 | + | ||
| 132 | +- (long long)diskCacheSize | ||
| 133 | +{ | ||
| 134 | + return [self.imageCache diskCacheSize]; | ||
| 135 | +} | ||
| 136 | + | ||
| 137 | +- (void)clearMemory | ||
| 138 | +{ | ||
| 139 | + [self.imageCache clearMemory]; | ||
| 140 | +} | ||
| 141 | + | ||
| 142 | +- (void)clearDisk | ||
| 143 | +{ | ||
| 144 | + [self.imageCache clearDisk]; | ||
| 145 | +} | ||
| 146 | + | ||
| 147 | +@end |
WSWebImageDemo/CNLiveWebImage/CNLiveWebImageOperation.h
0 → 100644
WSWebImageDemo/CNLiveWebImage/NSData+CNLiveImageContentType.h
0 → 100644
| 1 | +// | ||
| 2 | +// NSData+ImageContentType.h | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/21. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <Foundation/Foundation.h> | ||
| 10 | + | ||
| 11 | +@interface NSData (CNLiveImageContentType) | ||
| 12 | + | ||
| 13 | ++ (NSString *)ws_imageContentTypeWithData:(NSData *)data; | ||
| 14 | + | ||
| 15 | +@end |
WSWebImageDemo/CNLiveWebImage/NSData+CNLiveImageContentType.m
0 → 100644
| 1 | +// | ||
| 2 | +// NSData+ImageContentType.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/21. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "NSData+CNLiveImageContentType.h" | ||
| 10 | + | ||
| 11 | +@implementation NSData (CNLiveImageContentType) | ||
| 12 | + | ||
| 13 | ++ (NSString *)ws_imageContentTypeWithData:(NSData *)data | ||
| 14 | +{ | ||
| 15 | + uint8_t c; | ||
| 16 | + [data getBytes:&c length:1]; | ||
| 17 | + switch (c) { | ||
| 18 | + case 0xFF: | ||
| 19 | + return @"image/jpeg"; | ||
| 20 | + case 0x89: | ||
| 21 | + return @"image/png"; | ||
| 22 | + case 0x47: | ||
| 23 | + return @"image/gif"; | ||
| 24 | + case 0x49: | ||
| 25 | + case 0x4D: | ||
| 26 | + return @"image/tiff"; | ||
| 27 | + case 0x52: | ||
| 28 | + | ||
| 29 | + if ([data length] < 12) { | ||
| 30 | + return nil; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; | ||
| 34 | + if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { | ||
| 35 | + return @"image/webp"; | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + return nil; | ||
| 39 | + } | ||
| 40 | + return nil; | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +@end |
WSWebImageDemo/CNLiveWebImage/UIImage+CNLiveMultiFormat.h
0 → 100644
WSWebImageDemo/CNLiveWebImage/UIImage+CNLiveMultiFormat.m
0 → 100644
| 1 | +// | ||
| 2 | +// UIImage+MultiFormat.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/21. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "UIImage+CNLiveMultiFormat.h" | ||
| 10 | +#import "NSData+CNLiveImageContentType.h" | ||
| 11 | + | ||
| 12 | +@implementation UIImage (CNLiveMultiFormat) | ||
| 13 | + | ||
| 14 | ++ (UIImage *)ws_imageWithData:(NSData *)data | ||
| 15 | +{ | ||
| 16 | + if (!data) { | ||
| 17 | + return nil; | ||
| 18 | + } | ||
| 19 | + UIImage *image; | ||
| 20 | + NSString *imageContentType = [NSData ws_imageContentTypeWithData:data]; | ||
| 21 | + | ||
| 22 | + if ([imageContentType isEqualToString:@"image/gif"]) { | ||
| 23 | + //TODO 处理GIF图片 | ||
| 24 | + } | ||
| 25 | + else if ([imageContentType isEqualToString:@"image/webp"]) { | ||
| 26 | + //TODO 处理WEBP图片 | ||
| 27 | + } | ||
| 28 | + else { | ||
| 29 | + image = [[UIImage alloc] initWithData:data]; | ||
| 30 | + } | ||
| 31 | + return image; | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +@end |
WSWebImageDemo/CNLiveWebImage/UIImageView+CNLiveWebCache.h
0 → 100644
| 1 | +// | ||
| 2 | +// UIImageView+WebCache.h | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/26. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "CNLiveWebImageManager.h" | ||
| 11 | + | ||
| 12 | +@interface UIImageView (CNLiveWebCache) | ||
| 13 | + | ||
| 14 | +- (void)ws_setImageWithUrl:(NSURL *)url; | ||
| 15 | + | ||
| 16 | +- (void)ws_setImageWithUrl:(NSURL *)url placeholderImage:(UIImage *)placeholder; | ||
| 17 | + | ||
| 18 | +@end |
WSWebImageDemo/CNLiveWebImage/UIImageView+CNLiveWebCache.m
0 → 100644
| 1 | +// | ||
| 2 | +// UIImageView+WebCache.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/26. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "UIImageView+CNLiveWebCache.h" | ||
| 10 | +#import "CNLiveWebImageBlock.h" | ||
| 11 | + | ||
| 12 | +@implementation UIImageView (CNLiveWebCache) | ||
| 13 | + | ||
| 14 | +- (void)ws_setImageWithUrl:(NSURL *)url | ||
| 15 | +{ | ||
| 16 | + [self ws_setImageWithUrl:url placeholderImage:nil options:0 progress:nil completed:nil]; | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +- (void)ws_setImageWithUrl:(NSURL *)url placeholderImage:(UIImage *)placeholder | ||
| 20 | +{ | ||
| 21 | + [self ws_setImageWithUrl:url placeholderImage:placeholder options:0 progress:nil completed:nil]; | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +- (void)ws_setImageWithUrl:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(CNLiveWebImageOptions)options progress:(CNLiveDownloadProgressBlock)progress completed:(CNLiveDownloadCompletedBlock)completed | ||
| 25 | +{ | ||
| 26 | + if (placeholder) { | ||
| 27 | + self.image = placeholder; | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + if (url) { | ||
| 31 | + __weak __typeof(self) weakSelf = self; | ||
| 32 | + [[CNLiveWebImageManager sharedManager] downloadWebImageWithURL:url | ||
| 33 | + options:options | ||
| 34 | + progress:progress | ||
| 35 | + completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { | ||
| 36 | + if (image && !error && finished) { | ||
| 37 | + weakSelf.image = image; | ||
| 38 | + } | ||
| 39 | + }]; | ||
| 40 | + } | ||
| 41 | + else { | ||
| 42 | + dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 43 | + NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; | ||
| 44 | + if (completed) { | ||
| 45 | + completed(nil, nil, error, NO); | ||
| 46 | + } | ||
| 47 | + }); | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +@end |
WSWebImageDemo/Info.plist
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | +<plist version="1.0"> | ||
| 4 | +<dict> | ||
| 5 | + <key>CFBundleDevelopmentRegion</key> | ||
| 6 | + <string>en</string> | ||
| 7 | + <key>CFBundleExecutable</key> | ||
| 8 | + <string>$(EXECUTABLE_NAME)</string> | ||
| 9 | + <key>CFBundleIdentifier</key> | ||
| 10 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
| 11 | + <key>CFBundleInfoDictionaryVersion</key> | ||
| 12 | + <string>6.0</string> | ||
| 13 | + <key>CFBundleName</key> | ||
| 14 | + <string>$(PRODUCT_NAME)</string> | ||
| 15 | + <key>CFBundlePackageType</key> | ||
| 16 | + <string>APPL</string> | ||
| 17 | + <key>CFBundleShortVersionString</key> | ||
| 18 | + <string>1.0</string> | ||
| 19 | + <key>CFBundleSignature</key> | ||
| 20 | + <string>????</string> | ||
| 21 | + <key>CFBundleVersion</key> | ||
| 22 | + <string>1</string> | ||
| 23 | + <key>LSRequiresIPhoneOS</key> | ||
| 24 | + <true/> | ||
| 25 | + <key>UILaunchStoryboardName</key> | ||
| 26 | + <string>LaunchScreen</string> | ||
| 27 | + <key>UIMainStoryboardFile</key> | ||
| 28 | + <string>Main</string> | ||
| 29 | + <key>UIRequiredDeviceCapabilities</key> | ||
| 30 | + <array> | ||
| 31 | + <string>armv7</string> | ||
| 32 | + </array> | ||
| 33 | + <key>UISupportedInterfaceOrientations</key> | ||
| 34 | + <array> | ||
| 35 | + <string>UIInterfaceOrientationPortrait</string> | ||
| 36 | + <string>UIInterfaceOrientationLandscapeLeft</string> | ||
| 37 | + <string>UIInterfaceOrientationLandscapeRight</string> | ||
| 38 | + </array> | ||
| 39 | + <key>UISupportedInterfaceOrientations~ipad</key> | ||
| 40 | + <array> | ||
| 41 | + <string>UIInterfaceOrientationPortrait</string> | ||
| 42 | + <string>UIInterfaceOrientationPortraitUpsideDown</string> | ||
| 43 | + <string>UIInterfaceOrientationLandscapeLeft</string> | ||
| 44 | + <string>UIInterfaceOrientationLandscapeRight</string> | ||
| 45 | + </array> | ||
| 46 | + <key>NSAppTransportSecurity</key> | ||
| 47 | + <dict> | ||
| 48 | + <key>NSAllowsArbitraryLoads</key> | ||
| 49 | + <true/> | ||
| 50 | + </dict> | ||
| 51 | +</dict> | ||
| 52 | +</plist> |
WSWebImageDemo/ViewController.h
0 → 100644
WSWebImageDemo/ViewController.m
0 → 100644
| 1 | +// | ||
| 2 | +// ViewController.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/14. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import "ViewController.h" | ||
| 10 | +#import "CNLiveWebImageManager.h" | ||
| 11 | +#import "CNLiveImageCache.h" | ||
| 12 | +#import "UIImageView+CNLiveWebCache.h" | ||
| 13 | + | ||
| 14 | +@interface ViewController ()<UITableViewDelegate, UITableViewDataSource> | ||
| 15 | +{ | ||
| 16 | + NSArray *_imageArray; | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +@property (nonatomic, strong) UIImageView *imageView; | ||
| 20 | + | ||
| 21 | +@end | ||
| 22 | +//static NSString *str = @"http://img.firefoxchina.cn/2016/07/4/201607261050080.jpg"; | ||
| 23 | +static NSString *str = @"http://desk.fd.zol-img.com.cn/t_s2560x1600c5/g5/M00/0D/0C/ChMkJ1eV8KuIKvxAADO4tztrTKcAAT0ZwCLaesAM7jP146.jpg"; | ||
| 24 | +//static NSString *str = @"http://pic104.nipic.com/file/20160720/21897230_115704969000_2.jpg"; | ||
| 25 | + | ||
| 26 | +@implementation ViewController | ||
| 27 | + | ||
| 28 | +- (void)viewDidLoad { | ||
| 29 | + [super viewDidLoad]; | ||
| 30 | + // Do any additional setup after loading the view, typically from a nib. | ||
| 31 | + | ||
| 32 | +// long long diskCacheSize = [[CNLiveImageCache sharedImageCache] diskCacheSize]; | ||
| 33 | +// NSLog(@"%lld",diskCacheSize); | ||
| 34 | +// | ||
| 35 | +// [self.view addSubview:self.imageView]; | ||
| 36 | +// [[CNLiveWebImageDownloadManager sharedManager] downloadWebImageWithURL:[NSURL URLWithString:str] | ||
| 37 | +// options:CNLiveWebImageProgressiveDownload | ||
| 38 | +// progress:^(NSInteger receivedSize, NSInteger expectedSize) { | ||
| 39 | +// NSLog(@"receivedSize = %ld, expectedSize = %ld",(long)receivedSize, (long)expectedSize); | ||
| 40 | +// } | ||
| 41 | +// completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { | ||
| 42 | +// dispatch_async(dispatch_get_main_queue(), ^{ | ||
| 43 | +// self.imageView.image = image; | ||
| 44 | +// }); | ||
| 45 | +// }]; | ||
| 46 | + | ||
| 47 | +// [[CNLiveImageCache sharedImageCache] removeCacheForKey:@"http://img.firefoxchina.cn/2016/07/4/201607261050080.jpg" done:^{ | ||
| 48 | +// NSLog(@"Do something"); | ||
| 49 | +// }]; | ||
| 50 | + | ||
| 51 | +// UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 300, 200)]; | ||
| 52 | +// imageView.backgroundColor = [UIColor cyanColor]; | ||
| 53 | +// [self.view addSubview:imageView]; | ||
| 54 | + | ||
| 55 | +// [imageView ws_setImageWithUrl:[NSURL URLWithString:str]]; | ||
| 56 | +// [imageView ws_setImageWithUrl:[NSURL URLWithString:str] placeholderImage:[UIImage imageNamed:@"text.jpg"]]; | ||
| 57 | + | ||
| 58 | + _imageArray = @[@"http://y1.cnliveimg.com:8080/image/itv/2016/0729/392ab54d87a049b6b7f7cf6d7df252d5_138931_101.jpg", | ||
| 59 | + @"http://y3.cnliveimg.com:8080/image/itv/2016/0729/d56e527238a04a6d909cf080092c3e74_138923_100.jpg", | ||
| 60 | + @"http://y2.cnliveimg.com:8080/image/itv/2016/0729/098609b945fc43169bea7a6093fe449e_138914_100.jpg", | ||
| 61 | + @"http://y3.cnliveimg.com:8080/image/itv/2016/0729/e67a4abf5781407195e6544a1931913c_138913_100.jpg", | ||
| 62 | + @"http://y3.cnliveimg.com:8080/image/itv/2016/0728/912ab18337e642439cfbca32ae527f23_138727_100.jpg", | ||
| 63 | + @"http://y1.cnliveimg.com:8080/image/itv/2016/0722/75be21e738a945e3b6b0437a01437beb_101.jpg", | ||
| 64 | + @"http://y1.cnliveimg.com:8080/image/itv/2016/0520/c4a9729f38f344f599be183bfb0ed0d0_100.jpg", | ||
| 65 | + @"http://y1.cnliveimg.com:8080/image/itv/2016/0429/2237884c0dc64c1bbf486b7c00888cb0_119818_100.jpg", | ||
| 66 | + @"http://y3.cnliveimg.com:8080/image/itv/2016/0405/f7e64bc903884ae3bebbd7493c81759e_115166_100.jpg", | ||
| 67 | + @"http://y1.cnliveimg.com:8080/image/itv/2016/0116/7521576fd18f4bfbaee9efa8d379eee0_101710_100.jpg"]; | ||
| 68 | + | ||
| 69 | + UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(100, 200, 100, 300) style:UITableViewStylePlain]; | ||
| 70 | + [self.view addSubview:tableView]; | ||
| 71 | + tableView.rowHeight = 100; | ||
| 72 | + tableView.delegate = self; | ||
| 73 | + tableView.dataSource = self; | ||
| 74 | + | ||
| 75 | +} | ||
| 76 | + | ||
| 77 | +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section | ||
| 78 | +{ | ||
| 79 | + return _imageArray.count; | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath | ||
| 83 | +{ | ||
| 84 | + static NSString *identify = @"cell"; | ||
| 85 | + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identify]; | ||
| 86 | + if (!cell) { | ||
| 87 | + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identify]; | ||
| 88 | + UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; | ||
| 89 | + [cell.contentView addSubview:image]; | ||
| 90 | + image.tag = 1001; | ||
| 91 | + } | ||
| 92 | + UIImageView *imageView = (UIImageView *)[cell viewWithTag:1001]; | ||
| 93 | + [imageView ws_setImageWithUrl:[NSURL URLWithString:_imageArray[indexPath.row]] placeholderImage:[UIImage imageNamed:@"text.jpg"]]; | ||
| 94 | + | ||
| 95 | + return cell; | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +- (void)didReceiveMemoryWarning { | ||
| 99 | + [super didReceiveMemoryWarning]; | ||
| 100 | + // Dispose of any resources that can be recreated. | ||
| 101 | +} | ||
| 102 | + | ||
| 103 | +-(UIImageView *)imageView{ | ||
| 104 | + if (!_imageView) { | ||
| 105 | + _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(40,40,300,200)]; | ||
| 106 | + _imageView.backgroundColor = [UIColor redColor]; | ||
| 107 | + _imageView.contentMode = UIViewContentModeScaleToFill; | ||
| 108 | + } | ||
| 109 | + return _imageView; | ||
| 110 | +} | ||
| 111 | + | ||
| 112 | +@end |
WSWebImageDemo/main.m
0 → 100644
| 1 | +// | ||
| 2 | +// main.m | ||
| 3 | +// WSWebImageDemo | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/14. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <UIKit/UIKit.h> | ||
| 10 | +#import "AppDelegate.h" | ||
| 11 | + | ||
| 12 | +int main(int argc, char * argv[]) { | ||
| 13 | + @autoreleasepool { | ||
| 14 | + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); | ||
| 15 | + } | ||
| 16 | +} |
WSWebImageDemo/text.jpg
0 → 100644
41.4 KB
WSWebImageDemoTests/Info.plist
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | +<plist version="1.0"> | ||
| 4 | +<dict> | ||
| 5 | + <key>CFBundleDevelopmentRegion</key> | ||
| 6 | + <string>en</string> | ||
| 7 | + <key>CFBundleExecutable</key> | ||
| 8 | + <string>$(EXECUTABLE_NAME)</string> | ||
| 9 | + <key>CFBundleIdentifier</key> | ||
| 10 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
| 11 | + <key>CFBundleInfoDictionaryVersion</key> | ||
| 12 | + <string>6.0</string> | ||
| 13 | + <key>CFBundleName</key> | ||
| 14 | + <string>$(PRODUCT_NAME)</string> | ||
| 15 | + <key>CFBundlePackageType</key> | ||
| 16 | + <string>BNDL</string> | ||
| 17 | + <key>CFBundleShortVersionString</key> | ||
| 18 | + <string>1.0</string> | ||
| 19 | + <key>CFBundleSignature</key> | ||
| 20 | + <string>????</string> | ||
| 21 | + <key>CFBundleVersion</key> | ||
| 22 | + <string>1</string> | ||
| 23 | +</dict> | ||
| 24 | +</plist> |
WSWebImageDemoTests/WSWebImageDemoTests.m
0 → 100644
| 1 | +// | ||
| 2 | +// WSWebImageDemoTests.m | ||
| 3 | +// WSWebImageDemoTests | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/14. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <XCTest/XCTest.h> | ||
| 10 | + | ||
| 11 | +@interface WSWebImageDemoTests : XCTestCase | ||
| 12 | + | ||
| 13 | +@end | ||
| 14 | + | ||
| 15 | +@implementation WSWebImageDemoTests | ||
| 16 | + | ||
| 17 | +- (void)setUp { | ||
| 18 | + [super setUp]; | ||
| 19 | + // Put setup code here. This method is called before the invocation of each test method in the class. | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +- (void)tearDown { | ||
| 23 | + // Put teardown code here. This method is called after the invocation of each test method in the class. | ||
| 24 | + [super tearDown]; | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +- (void)testExample { | ||
| 28 | + // This is an example of a functional test case. | ||
| 29 | + // Use XCTAssert and related functions to verify your tests produce the correct results. | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +- (void)testPerformanceExample { | ||
| 33 | + // This is an example of a performance test case. | ||
| 34 | + [self measureBlock:^{ | ||
| 35 | + // Put the code you want to measure the time of here. | ||
| 36 | + }]; | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +@end |
WSWebImageDemoUITests/Info.plist
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | +<plist version="1.0"> | ||
| 4 | +<dict> | ||
| 5 | + <key>CFBundleDevelopmentRegion</key> | ||
| 6 | + <string>en</string> | ||
| 7 | + <key>CFBundleExecutable</key> | ||
| 8 | + <string>$(EXECUTABLE_NAME)</string> | ||
| 9 | + <key>CFBundleIdentifier</key> | ||
| 10 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||
| 11 | + <key>CFBundleInfoDictionaryVersion</key> | ||
| 12 | + <string>6.0</string> | ||
| 13 | + <key>CFBundleName</key> | ||
| 14 | + <string>$(PRODUCT_NAME)</string> | ||
| 15 | + <key>CFBundlePackageType</key> | ||
| 16 | + <string>BNDL</string> | ||
| 17 | + <key>CFBundleShortVersionString</key> | ||
| 18 | + <string>1.0</string> | ||
| 19 | + <key>CFBundleSignature</key> | ||
| 20 | + <string>????</string> | ||
| 21 | + <key>CFBundleVersion</key> | ||
| 22 | + <string>1</string> | ||
| 23 | +</dict> | ||
| 24 | +</plist> |
WSWebImageDemoUITests/WSWebImageDemoUITests.m
0 → 100644
| 1 | +// | ||
| 2 | +// WSWebImageDemoUITests.m | ||
| 3 | +// WSWebImageDemoUITests | ||
| 4 | +// | ||
| 5 | +// Created by 王帅 on 16/7/14. | ||
| 6 | +// Copyright © 2016年 王帅. All rights reserved. | ||
| 7 | +// | ||
| 8 | + | ||
| 9 | +#import <XCTest/XCTest.h> | ||
| 10 | + | ||
| 11 | +@interface WSWebImageDemoUITests : XCTestCase | ||
| 12 | + | ||
| 13 | +@end | ||
| 14 | + | ||
| 15 | +@implementation WSWebImageDemoUITests | ||
| 16 | + | ||
| 17 | +- (void)setUp { | ||
| 18 | + [super setUp]; | ||
| 19 | + | ||
| 20 | + // Put setup code here. This method is called before the invocation of each test method in the class. | ||
| 21 | + | ||
| 22 | + // In UI tests it is usually best to stop immediately when a failure occurs. | ||
| 23 | + self.continueAfterFailure = NO; | ||
| 24 | + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. | ||
| 25 | + [[[XCUIApplication alloc] init] launch]; | ||
| 26 | + | ||
| 27 | + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +- (void)tearDown { | ||
| 31 | + // Put teardown code here. This method is called after the invocation of each test method in the class. | ||
| 32 | + [super tearDown]; | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +- (void)testExample { | ||
| 36 | + // Use recording to get started writing UI tests. | ||
| 37 | + // Use XCTAssert and related functions to verify your tests produce the correct results. | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +@end |