├── Examples ├── BasicAuth │ ├── BasicAuth.xcodeproj │ │ └── project.pbxproj │ └── BasicAuth │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── BasicAuth-Info.plist │ │ ├── BasicAuth-Prefix.pch │ │ ├── Default-568h@2x.png │ │ ├── ViewController.h │ │ ├── ViewController.m │ │ ├── en.lproj │ │ ├── InfoPlist.strings │ │ └── ViewController.xib │ │ └── main.m ├── ImageLoader │ ├── Classes │ │ ├── ImageLoaderAppDelegate.h │ │ ├── ImageLoaderAppDelegate.m │ │ ├── RootViewController.h │ │ └── RootViewController.m │ ├── Default-568h@2x.png │ ├── ImageLoader-Info.plist │ ├── ImageLoader.xcodeproj │ │ ├── nick.lockwood.pbxuser │ │ ├── nick.mode1v3 │ │ ├── nick.pbxuser │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcuserdata │ │ │ │ ├── nick.lockwood.xcuserdatad │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ └── nick.xcuserdatad │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcuserdata │ │ │ ├── nick.lockwood.xcuserdatad │ │ │ ├── xcdebugger │ │ │ │ └── Breakpoints.xcbkptlist │ │ │ └── xcschemes │ │ │ │ ├── ImageLoader.xcscheme │ │ │ │ └── xcschememanagement.plist │ │ │ └── nick.xcuserdatad │ │ │ ├── xcdebugger │ │ │ └── Breakpoints.xcbkptlist │ │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ ├── ImageLoader_Prefix.pch │ ├── Images.plist │ ├── MainWindow.xib │ ├── RootViewController.xib │ └── main.m └── ProgressLoader │ ├── Classes │ ├── ImageLoaderAppDelegate.h │ ├── ImageLoaderAppDelegate.m │ ├── RootViewController.h │ └── RootViewController.m │ ├── Default-568h@2x.png │ ├── ImageLoader_Prefix.pch │ ├── Images.plist │ ├── MainWindow.xib │ ├── ProgressLoader-Info.plist │ ├── ProgressLoader.xcodeproj │ ├── nick.lockwood.pbxuser │ ├── nick.mode1v3 │ ├── nick.pbxuser │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcuserdata │ │ │ ├── nick.lockwood.xcuserdatad │ │ │ └── WorkspaceSettings.xcsettings │ │ │ └── nick.xcuserdatad │ │ │ └── WorkspaceSettings.xcsettings │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── ProgressLoader.xcscheme │ └── xcuserdata │ │ ├── nick.lockwood.xcuserdatad │ │ ├── xcdebugger │ │ │ └── Breakpoints.xcbkptlist │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ │ └── nick.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints.xcbkptlist │ │ └── xcschemes │ │ └── xcschememanagement.plist │ ├── RootViewController.xib │ └── main.m ├── LICENCE.md ├── README.md ├── RequestQueue.podspec.json └── RequestQueue ├── RequestQueue.h └── RequestQueue.m /Examples/BasicAuth/BasicAuth.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 01FDC29916811842001E49A6 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 01FDC29816811842001E49A6 /* Default-568h@2x.png */; }; 11 | B22B852E156528300001A7C2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B22B852D156528300001A7C2 /* UIKit.framework */; }; 12 | B22B8530156528300001A7C2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B22B852F156528300001A7C2 /* Foundation.framework */; }; 13 | B22B8532156528300001A7C2 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B22B8531156528300001A7C2 /* CoreGraphics.framework */; }; 14 | B22B8538156528300001A7C2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B22B8536156528300001A7C2 /* InfoPlist.strings */; }; 15 | B22B853A156528300001A7C2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B22B8539156528300001A7C2 /* main.m */; }; 16 | B22B853E156528300001A7C2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B22B853D156528300001A7C2 /* AppDelegate.m */; }; 17 | B22B8541156528300001A7C2 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B22B8540156528300001A7C2 /* ViewController.m */; }; 18 | B22B8544156528300001A7C2 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = B22B8542156528300001A7C2 /* ViewController.xib */; }; 19 | B22B854D156528450001A7C2 /* RequestQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = B22B854C156528450001A7C2 /* RequestQueue.m */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | 01FDC29816811842001E49A6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 24 | B22B8529156528300001A7C2 /* BasicAuth.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BasicAuth.app; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | B22B852D156528300001A7C2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 26 | B22B852F156528300001A7C2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 27 | B22B8531156528300001A7C2 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 28 | B22B8535156528300001A7C2 /* BasicAuth-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "BasicAuth-Info.plist"; sourceTree = ""; }; 29 | B22B8537156528300001A7C2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 30 | B22B8539156528300001A7C2 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 31 | B22B853B156528300001A7C2 /* BasicAuth-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BasicAuth-Prefix.pch"; sourceTree = ""; }; 32 | B22B853C156528300001A7C2 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 33 | B22B853D156528300001A7C2 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 34 | B22B853F156528300001A7C2 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 35 | B22B8540156528300001A7C2 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 36 | B22B8543156528300001A7C2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController.xib; sourceTree = ""; }; 37 | B22B854B156528450001A7C2 /* RequestQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RequestQueue.h; sourceTree = ""; }; 38 | B22B854C156528450001A7C2 /* RequestQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RequestQueue.m; sourceTree = ""; }; 39 | /* End PBXFileReference section */ 40 | 41 | /* Begin PBXFrameworksBuildPhase section */ 42 | B22B8526156528300001A7C2 /* Frameworks */ = { 43 | isa = PBXFrameworksBuildPhase; 44 | buildActionMask = 2147483647; 45 | files = ( 46 | B22B852E156528300001A7C2 /* UIKit.framework in Frameworks */, 47 | B22B8530156528300001A7C2 /* Foundation.framework in Frameworks */, 48 | B22B8532156528300001A7C2 /* CoreGraphics.framework in Frameworks */, 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXFrameworksBuildPhase section */ 53 | 54 | /* Begin PBXGroup section */ 55 | B22B851E156528300001A7C2 = { 56 | isa = PBXGroup; 57 | children = ( 58 | B22B854A156528450001A7C2 /* RequestQueue */, 59 | B22B8533156528300001A7C2 /* BasicAuth */, 60 | B22B852C156528300001A7C2 /* Frameworks */, 61 | B22B852A156528300001A7C2 /* Products */, 62 | ); 63 | sourceTree = ""; 64 | }; 65 | B22B852A156528300001A7C2 /* Products */ = { 66 | isa = PBXGroup; 67 | children = ( 68 | B22B8529156528300001A7C2 /* BasicAuth.app */, 69 | ); 70 | name = Products; 71 | sourceTree = ""; 72 | }; 73 | B22B852C156528300001A7C2 /* Frameworks */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | B22B852D156528300001A7C2 /* UIKit.framework */, 77 | B22B852F156528300001A7C2 /* Foundation.framework */, 78 | B22B8531156528300001A7C2 /* CoreGraphics.framework */, 79 | ); 80 | name = Frameworks; 81 | sourceTree = ""; 82 | }; 83 | B22B8533156528300001A7C2 /* BasicAuth */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | B22B853C156528300001A7C2 /* AppDelegate.h */, 87 | B22B853D156528300001A7C2 /* AppDelegate.m */, 88 | B22B853F156528300001A7C2 /* ViewController.h */, 89 | B22B8540156528300001A7C2 /* ViewController.m */, 90 | B22B8542156528300001A7C2 /* ViewController.xib */, 91 | B22B8534156528300001A7C2 /* Supporting Files */, 92 | ); 93 | path = BasicAuth; 94 | sourceTree = ""; 95 | }; 96 | B22B8534156528300001A7C2 /* Supporting Files */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 01FDC29816811842001E49A6 /* Default-568h@2x.png */, 100 | B22B8535156528300001A7C2 /* BasicAuth-Info.plist */, 101 | B22B8536156528300001A7C2 /* InfoPlist.strings */, 102 | B22B8539156528300001A7C2 /* main.m */, 103 | B22B853B156528300001A7C2 /* BasicAuth-Prefix.pch */, 104 | ); 105 | name = "Supporting Files"; 106 | sourceTree = ""; 107 | }; 108 | B22B854A156528450001A7C2 /* RequestQueue */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | B22B854B156528450001A7C2 /* RequestQueue.h */, 112 | B22B854C156528450001A7C2 /* RequestQueue.m */, 113 | ); 114 | name = RequestQueue; 115 | path = ../../RequestQueue; 116 | sourceTree = ""; 117 | }; 118 | /* End PBXGroup section */ 119 | 120 | /* Begin PBXNativeTarget section */ 121 | B22B8528156528300001A7C2 /* BasicAuth */ = { 122 | isa = PBXNativeTarget; 123 | buildConfigurationList = B22B8547156528300001A7C2 /* Build configuration list for PBXNativeTarget "BasicAuth" */; 124 | buildPhases = ( 125 | B22B8525156528300001A7C2 /* Sources */, 126 | B22B8526156528300001A7C2 /* Frameworks */, 127 | B22B8527156528300001A7C2 /* Resources */, 128 | ); 129 | buildRules = ( 130 | ); 131 | dependencies = ( 132 | ); 133 | name = BasicAuth; 134 | productName = BasicAuth; 135 | productReference = B22B8529156528300001A7C2 /* BasicAuth.app */; 136 | productType = "com.apple.product-type.application"; 137 | }; 138 | /* End PBXNativeTarget section */ 139 | 140 | /* Begin PBXProject section */ 141 | B22B8520156528300001A7C2 /* Project object */ = { 142 | isa = PBXProject; 143 | attributes = { 144 | LastUpgradeCheck = 0600; 145 | }; 146 | buildConfigurationList = B22B8523156528300001A7C2 /* Build configuration list for PBXProject "BasicAuth" */; 147 | compatibilityVersion = "Xcode 3.2"; 148 | developmentRegion = English; 149 | hasScannedForEncodings = 0; 150 | knownRegions = ( 151 | en, 152 | ); 153 | mainGroup = B22B851E156528300001A7C2; 154 | productRefGroup = B22B852A156528300001A7C2 /* Products */; 155 | projectDirPath = ""; 156 | projectRoot = ""; 157 | targets = ( 158 | B22B8528156528300001A7C2 /* BasicAuth */, 159 | ); 160 | }; 161 | /* End PBXProject section */ 162 | 163 | /* Begin PBXResourcesBuildPhase section */ 164 | B22B8527156528300001A7C2 /* Resources */ = { 165 | isa = PBXResourcesBuildPhase; 166 | buildActionMask = 2147483647; 167 | files = ( 168 | B22B8538156528300001A7C2 /* InfoPlist.strings in Resources */, 169 | B22B8544156528300001A7C2 /* ViewController.xib in Resources */, 170 | 01FDC29916811842001E49A6 /* Default-568h@2x.png in Resources */, 171 | ); 172 | runOnlyForDeploymentPostprocessing = 0; 173 | }; 174 | /* End PBXResourcesBuildPhase section */ 175 | 176 | /* Begin PBXSourcesBuildPhase section */ 177 | B22B8525156528300001A7C2 /* Sources */ = { 178 | isa = PBXSourcesBuildPhase; 179 | buildActionMask = 2147483647; 180 | files = ( 181 | B22B853A156528300001A7C2 /* main.m in Sources */, 182 | B22B853E156528300001A7C2 /* AppDelegate.m in Sources */, 183 | B22B8541156528300001A7C2 /* ViewController.m in Sources */, 184 | B22B854D156528450001A7C2 /* RequestQueue.m in Sources */, 185 | ); 186 | runOnlyForDeploymentPostprocessing = 0; 187 | }; 188 | /* End PBXSourcesBuildPhase section */ 189 | 190 | /* Begin PBXVariantGroup section */ 191 | B22B8536156528300001A7C2 /* InfoPlist.strings */ = { 192 | isa = PBXVariantGroup; 193 | children = ( 194 | B22B8537156528300001A7C2 /* en */, 195 | ); 196 | name = InfoPlist.strings; 197 | sourceTree = ""; 198 | }; 199 | B22B8542156528300001A7C2 /* ViewController.xib */ = { 200 | isa = PBXVariantGroup; 201 | children = ( 202 | B22B8543156528300001A7C2 /* en */, 203 | ); 204 | name = ViewController.xib; 205 | sourceTree = ""; 206 | }; 207 | /* End PBXVariantGroup section */ 208 | 209 | /* Begin XCBuildConfiguration section */ 210 | B22B8545156528300001A7C2 /* Debug */ = { 211 | isa = XCBuildConfiguration; 212 | buildSettings = { 213 | ALWAYS_SEARCH_USER_PATHS = NO; 214 | CLANG_ENABLE_OBJC_ARC = YES; 215 | CLANG_WARN_BOOL_CONVERSION = YES; 216 | CLANG_WARN_CONSTANT_CONVERSION = YES; 217 | CLANG_WARN_EMPTY_BODY = YES; 218 | CLANG_WARN_ENUM_CONVERSION = YES; 219 | CLANG_WARN_INT_CONVERSION = YES; 220 | CLANG_WARN_OBJCPP_ARC_ABI = YES; 221 | CLANG_WARN_UNREACHABLE_CODE = YES; 222 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 223 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 224 | COPY_PHASE_STRIP = NO; 225 | ENABLE_STRICT_OBJC_MSGSEND = YES; 226 | GCC_C_LANGUAGE_STANDARD = gnu99; 227 | GCC_DYNAMIC_NO_PIC = NO; 228 | GCC_OPTIMIZATION_LEVEL = 0; 229 | GCC_PREPROCESSOR_DEFINITIONS = ( 230 | "DEBUG=1", 231 | "$(inherited)", 232 | ); 233 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 234 | GCC_TREAT_WARNINGS_AS_ERRORS = YES; 235 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 236 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 237 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 238 | GCC_WARN_UNDECLARED_SELECTOR = YES; 239 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 240 | GCC_WARN_UNUSED_FUNCTION = YES; 241 | GCC_WARN_UNUSED_VARIABLE = YES; 242 | IPHONEOS_DEPLOYMENT_TARGET = 5.1; 243 | ONLY_ACTIVE_ARCH = YES; 244 | RUN_CLANG_STATIC_ANALYZER = YES; 245 | SDKROOT = iphoneos; 246 | WARNING_CFLAGS = ( 247 | "-Wall", 248 | "-Wextra", 249 | ); 250 | }; 251 | name = Debug; 252 | }; 253 | B22B8546156528300001A7C2 /* Release */ = { 254 | isa = XCBuildConfiguration; 255 | buildSettings = { 256 | ALWAYS_SEARCH_USER_PATHS = NO; 257 | CLANG_ENABLE_OBJC_ARC = YES; 258 | CLANG_WARN_BOOL_CONVERSION = YES; 259 | CLANG_WARN_CONSTANT_CONVERSION = YES; 260 | CLANG_WARN_EMPTY_BODY = YES; 261 | CLANG_WARN_ENUM_CONVERSION = YES; 262 | CLANG_WARN_INT_CONVERSION = YES; 263 | CLANG_WARN_OBJCPP_ARC_ABI = YES; 264 | CLANG_WARN_UNREACHABLE_CODE = YES; 265 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 266 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 267 | COPY_PHASE_STRIP = YES; 268 | ENABLE_STRICT_OBJC_MSGSEND = YES; 269 | GCC_C_LANGUAGE_STANDARD = gnu99; 270 | GCC_TREAT_WARNINGS_AS_ERRORS = YES; 271 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 272 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 273 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 274 | GCC_WARN_UNDECLARED_SELECTOR = YES; 275 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 276 | GCC_WARN_UNUSED_FUNCTION = YES; 277 | GCC_WARN_UNUSED_VARIABLE = YES; 278 | IPHONEOS_DEPLOYMENT_TARGET = 5.1; 279 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 280 | RUN_CLANG_STATIC_ANALYZER = YES; 281 | SDKROOT = iphoneos; 282 | VALIDATE_PRODUCT = YES; 283 | WARNING_CFLAGS = ( 284 | "-Wall", 285 | "-Wextra", 286 | ); 287 | }; 288 | name = Release; 289 | }; 290 | B22B8548156528300001A7C2 /* Debug */ = { 291 | isa = XCBuildConfiguration; 292 | buildSettings = { 293 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 294 | GCC_PREFIX_HEADER = "BasicAuth/BasicAuth-Prefix.pch"; 295 | INFOPLIST_FILE = "BasicAuth/BasicAuth-Info.plist"; 296 | PRODUCT_NAME = "$(TARGET_NAME)"; 297 | WRAPPER_EXTENSION = app; 298 | }; 299 | name = Debug; 300 | }; 301 | B22B8549156528300001A7C2 /* Release */ = { 302 | isa = XCBuildConfiguration; 303 | buildSettings = { 304 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 305 | GCC_PREFIX_HEADER = "BasicAuth/BasicAuth-Prefix.pch"; 306 | INFOPLIST_FILE = "BasicAuth/BasicAuth-Info.plist"; 307 | PRODUCT_NAME = "$(TARGET_NAME)"; 308 | WRAPPER_EXTENSION = app; 309 | }; 310 | name = Release; 311 | }; 312 | /* End XCBuildConfiguration section */ 313 | 314 | /* Begin XCConfigurationList section */ 315 | B22B8523156528300001A7C2 /* Build configuration list for PBXProject "BasicAuth" */ = { 316 | isa = XCConfigurationList; 317 | buildConfigurations = ( 318 | B22B8545156528300001A7C2 /* Debug */, 319 | B22B8546156528300001A7C2 /* Release */, 320 | ); 321 | defaultConfigurationIsVisible = 0; 322 | defaultConfigurationName = Release; 323 | }; 324 | B22B8547156528300001A7C2 /* Build configuration list for PBXNativeTarget "BasicAuth" */ = { 325 | isa = XCConfigurationList; 326 | buildConfigurations = ( 327 | B22B8548156528300001A7C2 /* Debug */, 328 | B22B8549156528300001A7C2 /* Release */, 329 | ); 330 | defaultConfigurationIsVisible = 0; 331 | defaultConfigurationName = Release; 332 | }; 333 | /* End XCConfigurationList section */ 334 | }; 335 | rootObject = B22B8520156528300001A7C2 /* Project object */; 336 | } 337 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // BasicAuth 4 | // 5 | // Created by Nick Lockwood on 17/05/2012. 6 | // Copyright (c) 2012 Charcoal Design. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class ViewController; 12 | 13 | @interface AppDelegate : UIResponder 14 | 15 | @property (nonatomic) UIWindow *window; 16 | @property (nonatomic) ViewController *viewController; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // BasicAuth 4 | // 5 | // Created by Nick Lockwood on 17/05/2012. 6 | // Copyright (c) 2012 Charcoal Design. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | #import "ViewController.h" 12 | 13 | @implementation AppDelegate 14 | 15 | - (BOOL)application:(__unused UIApplication *)application didFinishLaunchingWithOptions:(__unused NSDictionary *)launchOptions 16 | { 17 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 18 | // Override point for customization after application launch. 19 | self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 20 | self.window.rootViewController = self.viewController; 21 | [self.window makeKeyAndVisible]; 22 | return YES; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/BasicAuth-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.charcoaldesign.BasicAuth.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/BasicAuth-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'BasicAuth' target in the 'BasicAuth' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_4_0 8 | #warning "This project uses features only available in iOS SDK 4.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicklockwood/RequestQueue/6a15aeafaccf765d27cf60342ff36ca0766185c6/Examples/BasicAuth/BasicAuth/Default-568h@2x.png -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // BasicAuth 4 | // 5 | // Created by Nick Lockwood on 17/05/2012. 6 | // Copyright (c) 2012 Charcoal Design. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | @property (nonatomic) IBOutlet UIImageView *imageView; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // BasicAuth 4 | // 5 | // Created by Nick Lockwood on 17/05/2012. 6 | // Copyright (c) 2012 Charcoal Design. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "RequestQueue.h" 11 | 12 | 13 | @interface ViewController () 14 | 15 | @property (nonatomic) NSURLAuthenticationChallenge *challenge; 16 | 17 | @end 18 | 19 | 20 | @implementation ViewController 21 | 22 | - (void)viewDidLoad 23 | { 24 | [super viewDidLoad]; 25 | 26 | //set up request for protected resource 27 | NSURL *URL = [NSURL URLWithString:@"http://www.charcoaldesign.co.uk/RequestQueue/Auth/IMG_0351.jpg"]; 28 | NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 29 | RQOperation *operation = [RQOperation operationWithRequest:request]; 30 | 31 | //add auth handler 32 | operation.authenticationChallengeHandler = ^(NSURLAuthenticationChallenge *challenge) 33 | { 34 | _challenge = challenge; 35 | [[[UIAlertView alloc] initWithTitle:@"Challenge Receiver" message:@"Send credentials?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Send", nil] show]; 36 | 37 | }; 38 | 39 | //add response handler 40 | operation.completionHandler = ^(__unused NSURLResponse *response, NSData *data, NSError *error) 41 | { 42 | if (error) 43 | { 44 | [[[UIAlertView alloc] initWithTitle:@"Error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; 45 | } 46 | else 47 | { 48 | //set image 49 | _imageView.image = [UIImage imageWithData:data]; 50 | } 51 | }; 52 | 53 | //make request 54 | [[RequestQueue mainQueue] addOperation:operation]; 55 | } 56 | 57 | - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 58 | { 59 | if (buttonIndex == alertView.cancelButtonIndex) 60 | { 61 | //don't send credentials 62 | [_challenge.sender continueWithoutCredentialForAuthenticationChallenge:_challenge]; 63 | } 64 | else 65 | { 66 | //construct credential 67 | NSURLCredential *credential = [NSURLCredential credentialWithUser:@"test" 68 | password:@"test" 69 | persistence:NSURLCredentialPersistenceNone]; 70 | //send credential 71 | [_challenge.sender useCredential:credential forAuthenticationChallenge:_challenge]; 72 | } 73 | } 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/en.lproj/ViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1296 5 | 13F34 6 | 6245 7 | 1265.21 8 | 698.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 6238 12 | 13 | 14 | IBProxyObject 15 | IBUIImageView 16 | IBUIView 17 | 18 | 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | PluginDependencyRecalculationVersion 23 | 24 | 25 | 26 | 27 | IBFilesOwner 28 | IBCocoaTouchFramework 29 | 30 | 31 | IBFirstResponder 32 | IBCocoaTouchFramework 33 | 34 | 35 | 36 | 274 37 | 38 | 39 | 40 | 274 41 | {320, 460} 42 | 43 | 44 | _NS:9 45 | 2 46 | NO 47 | IBCocoaTouchFramework 48 | 49 | 50 | {{0, 20}, {320, 460}} 51 | 52 | 53 | 54 | 3 55 | MC43NQA 56 | 57 | 2 58 | 59 | 60 | NO 61 | 62 | 63 | IBUISimulatedFreeformSizeMetricsSentinel 64 | Freeform 65 | 66 | IBCocoaTouchFramework 67 | 68 | 69 | 70 | 71 | 72 | 73 | view 74 | 75 | 76 | 77 | 7 78 | 79 | 80 | 81 | imageView 82 | 83 | 84 | 85 | 9 86 | 87 | 88 | 89 | 90 | 91 | 0 92 | 93 | 94 | 95 | 96 | 97 | -1 98 | 99 | 100 | File's Owner 101 | 102 | 103 | -2 104 | 105 | 106 | 107 | 108 | 6 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 8 117 | 118 | 119 | 120 | 121 | 122 | 123 | ViewController 124 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 125 | UIResponder 126 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 127 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 128 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 129 | 130 | 131 | 132 | 133 | 134 | 9 135 | 136 | 137 | 138 | 139 | ViewController 140 | UIViewController 141 | 142 | imageView 143 | UIImageView 144 | 145 | 146 | imageView 147 | 148 | imageView 149 | UIImageView 150 | 151 | 152 | 153 | IBProjectSource 154 | ../BasicAuth/ViewController.h 155 | 156 | 157 | 158 | 159 | 160 | UIGestureRecognizer 161 | NSObject 162 | 163 | IBFrameworkSource 164 | UIKit.framework/Headers/UIGestureRecognizer.h 165 | 166 | 167 | 168 | UIImageView 169 | UIView 170 | 171 | IBFrameworkSource 172 | UIKit.framework/Headers/UIImageView.h 173 | 174 | 175 | 176 | UIResponder 177 | NSObject 178 | 179 | IBFrameworkSource 180 | UIKit.framework/Headers/UIResponder.h 181 | 182 | 183 | 184 | UISearchBar 185 | UIView 186 | 187 | IBFrameworkSource 188 | UIKit.framework/Headers/UISearchBar.h 189 | 190 | 191 | 192 | UISearchDisplayController 193 | NSObject 194 | 195 | IBFrameworkSource 196 | UIKit.framework/Headers/UISearchDisplayController.h 197 | 198 | 199 | 200 | UIView 201 | UIResponder 202 | 203 | IBFrameworkSource 204 | UIKit.framework/Headers/UIView.h 205 | 206 | 207 | 208 | UIViewController 209 | UIResponder 210 | 211 | IBFrameworkSource 212 | UIKit.framework/Headers/UIViewController.h 213 | 214 | 215 | 216 | 217 | 0 218 | IBCocoaTouchFramework 219 | NO 220 | 221 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 222 | 223 | 224 | 225 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 226 | 227 | 228 | YES 229 | 3 230 | 231 | 232 | -------------------------------------------------------------------------------- /Examples/BasicAuth/BasicAuth/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // BasicAuth 4 | // 5 | // Created by Nick Lockwood on 17/05/2012. 6 | // Copyright (c) 2012 Charcoal Design. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "AppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Examples/ImageLoader/Classes/ImageLoaderAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // ImageLoaderAppDelegate.h 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import 10 | 11 | @interface ImageLoaderAppDelegate : NSObject 12 | 13 | @property (nonatomic, strong) IBOutlet UIWindow *window; 14 | @property (nonatomic, strong) IBOutlet UINavigationController *navigationController; 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /Examples/ImageLoader/Classes/ImageLoaderAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // ImageLoaderAppDelegate.m 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import "ImageLoaderAppDelegate.h" 10 | #import "RootViewController.h" 11 | 12 | 13 | @implementation ImageLoaderAppDelegate 14 | 15 | @synthesize window; 16 | @synthesize navigationController; 17 | 18 | - (BOOL)application:(__unused UIApplication *)application didFinishLaunchingWithOptions:(__unused NSDictionary *)launchOptions 19 | { 20 | [window addSubview:[navigationController view]]; 21 | [window makeKeyAndVisible]; 22 | return YES; 23 | } 24 | 25 | @end 26 | 27 | -------------------------------------------------------------------------------- /Examples/ImageLoader/Classes/RootViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RootViewController.h 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import 10 | 11 | @interface RootViewController : UITableViewController 12 | 13 | @property (nonatomic, strong) UIBarButtonItem *loadUnloadButton; 14 | 15 | - (IBAction)loadUnloadImages; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Examples/ImageLoader/Classes/RootViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RootViewController.m 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import "RootViewController.h" 10 | #import "RequestQueue.h" 11 | 12 | 13 | @interface RootViewController () 14 | 15 | @property (nonatomic, strong) NSMutableArray *urlStrings; 16 | @property (nonatomic, strong) NSMutableDictionary *images; 17 | 18 | @end 19 | 20 | 21 | @implementation RootViewController 22 | 23 | @synthesize loadUnloadButton; 24 | @synthesize urlStrings; 25 | @synthesize images; 26 | 27 | #pragma mark View lifecycle 28 | 29 | - (void)viewDidLoad 30 | { 31 | [super viewDidLoad]; 32 | 33 | self.loadUnloadButton = [[UIBarButtonItem alloc] initWithTitle:@"Load" 34 | style:UIBarButtonItemStylePlain 35 | target:self 36 | action:@selector(loadUnloadImages)]; 37 | 38 | self.navigationItem.rightBarButtonItem = loadUnloadButton; 39 | self.navigationItem.title = @"Images"; 40 | } 41 | 42 | - (void)refreshView 43 | { 44 | //reload table data 45 | [self.tableView reloadData]; 46 | 47 | //update button state 48 | if ([[RequestQueue mainQueue] requestCount]) 49 | { 50 | //loading 51 | loadUnloadButton.enabled = NO; 52 | loadUnloadButton.title = @"Wait"; 53 | } 54 | else if ([urlStrings count]) 55 | { 56 | //finished 57 | loadUnloadButton.enabled = YES; 58 | loadUnloadButton.title = @"Clear"; 59 | } 60 | else 61 | { 62 | //idle 63 | loadUnloadButton.enabled = YES; 64 | loadUnloadButton.title = @"Load"; 65 | } 66 | } 67 | 68 | - (void)loadUnloadImages 69 | { 70 | //select action 71 | if ([urlStrings count]) 72 | { 73 | //clear images 74 | self.urlStrings = nil; 75 | self.images = nil; 76 | 77 | //refresh view 78 | [self refreshView]; 79 | } 80 | else 81 | { 82 | //reset data source 83 | NSString *path = [[NSBundle mainBundle] pathForResource:@"Images" ofType:@"plist"]; 84 | self.urlStrings = [NSMutableArray arrayWithContentsOfFile:path]; 85 | self.images = [NSMutableDictionary dictionary]; 86 | [self refreshView]; 87 | 88 | //load images 89 | for (NSString *urlString in urlStrings) 90 | { 91 | NSURL *URL = [NSURL URLWithString:urlString]; 92 | NSURLCacheStoragePolicy policy = NSURLCacheStorageNotAllowed; 93 | NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:policy timeoutInterval:15.0]; 94 | [[RequestQueue mainQueue] addRequest:request completionHandler:^(__unused NSURLResponse *response, NSData *data, NSError *error) { 95 | 96 | if (!error) 97 | { 98 | //image downloaded 99 | UIImage *image = [UIImage imageWithData:data]; 100 | if (image) 101 | { 102 | images[urlString] = image; 103 | } 104 | else 105 | { 106 | //image error 107 | NSInteger index = [urlStrings indexOfObject:urlString]; 108 | urlStrings[index] = @"Image was missing or corrupt"; 109 | } 110 | } 111 | else 112 | { 113 | //loading error 114 | NSInteger index = [urlStrings indexOfObject:urlString]; 115 | urlStrings[index] = [error localizedDescription]; 116 | } 117 | 118 | //refresh view 119 | [self refreshView]; 120 | }]; 121 | } 122 | 123 | } 124 | } 125 | 126 | #pragma mark Table view data source 127 | 128 | - (NSInteger)tableView:(__unused UITableView *)tableView numberOfRowsInSection:(__unused NSInteger)section 129 | { 130 | return [urlStrings count]; 131 | } 132 | 133 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 134 | { 135 | static NSString *CellIdentifier = @"Cell"; 136 | 137 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 138 | if (cell == nil) 139 | { 140 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 141 | } 142 | 143 | NSString *urlString = urlStrings[indexPath.row]; 144 | cell.imageView.image = images[urlString]; 145 | cell.textLabel.text = [urlString lastPathComponent]; 146 | 147 | return cell; 148 | } 149 | 150 | #pragma mark Table view delegate 151 | 152 | - (void)tableView:(__unused UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 153 | { 154 | //create view controller 155 | UIViewController *viewController = [[UIViewController alloc] init]; 156 | 157 | //set view 158 | NSString *urlString = urlStrings[indexPath.row]; 159 | UIImage *image = images[urlString]; 160 | UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 161 | viewController.view = imageView; 162 | 163 | //pass the selected object to the new view controller. 164 | [self.navigationController pushViewController:viewController animated:YES]; 165 | } 166 | 167 | #pragma mark Memory management 168 | 169 | - (void)viewDidUnload 170 | { 171 | self.loadUnloadButton = nil; 172 | [super viewDidUnload]; 173 | } 174 | 175 | 176 | 177 | @end 178 | 179 | -------------------------------------------------------------------------------- /Examples/ImageLoader/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicklockwood/RequestQueue/6a15aeafaccf765d27cf60342ff36ca0766185c6/Examples/ImageLoader/Default-568h@2x.png -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFile 12 | 13 | CFBundleIdentifier 14 | com.yourcompany.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | NSMainNibFile 28 | MainWindow 29 | 30 | 31 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/nick.lockwood.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 01C29DAA119AEFA6009D0C64 /* ImageLoader.h */ = { 4 | uiCtxt = { 5 | sepNavIntBoundsRect = "{{0, 0}, {795, 494}}"; 6 | sepNavSelRange = "{0, 0}"; 7 | sepNavVisRange = "{0, 681}"; 8 | }; 9 | }; 10 | 01C29DAB119AEFA6009D0C64 /* ImageLoader.m */ = { 11 | uiCtxt = { 12 | sepNavIntBoundsRect = "{{0, 0}, {1167, 1079}}"; 13 | sepNavSelRange = "{717, 1}"; 14 | sepNavVisRange = "{273, 966}"; 15 | }; 16 | }; 17 | 01E9A41211A5280E00AF5133 /* SyncronousLoader.h */ = { 18 | uiCtxt = { 19 | sepNavIntBoundsRect = "{{0, 0}, {795, 471}}"; 20 | sepNavSelRange = "{0, 0}"; 21 | sepNavVisRange = "{0, 257}"; 22 | }; 23 | }; 24 | 01E9A41311A5280E00AF5133 /* SyncronousLoader.m */ = { 25 | uiCtxt = { 26 | sepNavIntBoundsRect = "{{0, 0}, {798, 574}}"; 27 | sepNavSelRange = "{160, 0}"; 28 | sepNavVisRange = "{0, 1158}"; 29 | }; 30 | }; 31 | 01E9A49C11A5397200AF5133 /* SingleThreadedLoader.h */ = { 32 | uiCtxt = { 33 | sepNavIntBoundsRect = "{{0, 0}, {798, 574}}"; 34 | sepNavSelRange = "{0, 0}"; 35 | sepNavVisRange = "{0, 253}"; 36 | }; 37 | }; 38 | 01E9A49D11A5397200AF5133 /* SingleThreadedLoader.m */ = { 39 | uiCtxt = { 40 | sepNavIntBoundsRect = "{{0, 0}, {798, 728}}"; 41 | sepNavSelRange = "{1140, 27}"; 42 | sepNavVisRange = "{133, 1254}"; 43 | }; 44 | }; 45 | 01E9A4B211A5452200AF5133 /* MultiThreadedLoader.h */ = { 46 | uiCtxt = { 47 | sepNavIntBoundsRect = "{{0, 0}, {798, 448}}"; 48 | sepNavSelRange = "{250, 26}"; 49 | sepNavVisRange = "{0, 285}"; 50 | }; 51 | }; 52 | 01E9A4B311A5452200AF5133 /* MultiThreadedLoader.m */ = { 53 | uiCtxt = { 54 | sepNavIntBoundsRect = "{{0, 0}, {698, 819}}"; 55 | sepNavSelRange = "{0, 0}"; 56 | sepNavVisRange = "{0, 1208}"; 57 | }; 58 | }; 59 | 01E9A5A111A56FF000AF5133 /* NSOperationLoader.h */ = { 60 | uiCtxt = { 61 | sepNavIntBoundsRect = "{{0, 0}, {798, 574}}"; 62 | sepNavSelRange = "{287, 0}"; 63 | sepNavVisRange = "{0, 344}"; 64 | }; 65 | }; 66 | 01E9A5A211A56FF000AF5133 /* NSOperationLoader.m */ = { 67 | uiCtxt = { 68 | sepNavIntBoundsRect = "{{0, 0}, {795, 1729}}"; 69 | sepNavSelRange = "{1301, 3}"; 70 | sepNavVisRange = "{582, 838}"; 71 | }; 72 | }; 73 | 01E9A73211A5789600AF5133 /* NSURLConnectionLoader.h */ = { 74 | uiCtxt = { 75 | sepNavIntBoundsRect = "{{0, 0}, {798, 425}}"; 76 | sepNavSelRange = "{0, 0}"; 77 | sepNavVisRange = "{0, 348}"; 78 | }; 79 | }; 80 | 01E9A73311A5789600AF5133 /* NSURLConnectionLoader.m */ = { 81 | uiCtxt = { 82 | sepNavIntBoundsRect = "{{0, 0}, {798, 1235}}"; 83 | sepNavSelRange = "{1362, 15}"; 84 | sepNavVisRange = "{634, 1002}"; 85 | }; 86 | }; 87 | 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */ = { 88 | uiCtxt = { 89 | sepNavIntBoundsRect = "{{0, 0}, {810, 624}}"; 90 | sepNavSelRange = "{0, 0}"; 91 | sepNavVisRange = "{0, 780}"; 92 | }; 93 | }; 94 | 1D6058900D05DD3D006BFB54 /* ImageLoader */ = { 95 | activeExec = 0; 96 | executables = ( 97 | B2DBE92111E60DAF006CC7F5 /* ImageLoader */, 98 | ); 99 | }; 100 | 28C286E00D94DF7D0034E888 /* RootViewController.m */ = { 101 | uiCtxt = { 102 | sepNavIntBoundsRect = "{{0, 0}, {1076, 1846}}"; 103 | sepNavSelRange = "{1494, 30}"; 104 | sepNavVisRange = "{233, 999}"; 105 | }; 106 | }; 107 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 108 | activeBuildConfigurationName = Debug; 109 | activeExecutable = B2DBE92111E60DAF006CC7F5 /* ImageLoader */; 110 | activeSDKPreference = iphonesimulator4.0; 111 | activeTarget = 1D6058900D05DD3D006BFB54 /* ImageLoader */; 112 | addToTargets = ( 113 | 1D6058900D05DD3D006BFB54 /* ImageLoader */, 114 | ); 115 | codeSenseManager = B2DBE92A11E60DCE006CC7F5 /* Code sense */; 116 | executables = ( 117 | B2DBE92111E60DAF006CC7F5 /* ImageLoader */, 118 | ); 119 | perUserDictionary = { 120 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 121 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 122 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 123 | PBXFileTableDataSourceColumnWidthsKey = ( 124 | 20, 125 | 617, 126 | 20, 127 | 48, 128 | 43, 129 | 43, 130 | 20, 131 | ); 132 | PBXFileTableDataSourceColumnsKey = ( 133 | PBXFileDataSource_FiletypeID, 134 | PBXFileDataSource_Filename_ColumnID, 135 | PBXFileDataSource_Built_ColumnID, 136 | PBXFileDataSource_ObjectSize_ColumnID, 137 | PBXFileDataSource_Errors_ColumnID, 138 | PBXFileDataSource_Warnings_ColumnID, 139 | PBXFileDataSource_Target_ColumnID, 140 | ); 141 | }; 142 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { 143 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 144 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 145 | PBXFileTableDataSourceColumnWidthsKey = ( 146 | 20, 147 | 580, 148 | 60, 149 | 20, 150 | 48, 151 | 43, 152 | 43, 153 | ); 154 | PBXFileTableDataSourceColumnsKey = ( 155 | PBXFileDataSource_FiletypeID, 156 | PBXFileDataSource_Filename_ColumnID, 157 | PBXTargetDataSource_PrimaryAttribute, 158 | PBXFileDataSource_Built_ColumnID, 159 | PBXFileDataSource_ObjectSize_ColumnID, 160 | PBXFileDataSource_Errors_ColumnID, 161 | PBXFileDataSource_Warnings_ColumnID, 162 | ); 163 | }; 164 | PBXPerProjectTemplateStateSaveDate = 316025697; 165 | PBXWorkspaceStateSaveDate = 316025697; 166 | }; 167 | perUserProjectItems = { 168 | B26D32BD11F89AF100963471 /* PBXTextBookmark */ = B26D32BD11F89AF100963471 /* PBXTextBookmark */; 169 | B28BB4E4120B0F0C00A31E5A /* PBXTextBookmark */ = B28BB4E4120B0F0C00A31E5A /* PBXTextBookmark */; 170 | B28BB4E5120B0F0C00A31E5A /* PBXTextBookmark */ = B28BB4E5120B0F0C00A31E5A /* PBXTextBookmark */; 171 | B28BB4E6120B0F0C00A31E5A /* PBXTextBookmark */ = B28BB4E6120B0F0C00A31E5A /* PBXTextBookmark */; 172 | B28BB4E7120B0F0C00A31E5A /* PBXTextBookmark */ = B28BB4E7120B0F0C00A31E5A /* PBXTextBookmark */; 173 | B2DBE9C311E62762006CC7F5 /* PBXTextBookmark */ = B2DBE9C311E62762006CC7F5 /* PBXTextBookmark */; 174 | B2DEBA8611F0869100B4E775 /* PBXTextBookmark */ = B2DEBA8611F0869100B4E775 /* PBXTextBookmark */; 175 | B2E332F512D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F512D62BF1000CFCDF /* PBXTextBookmark */; 176 | B2E332F612D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F612D62BF1000CFCDF /* PBXTextBookmark */; 177 | B2E332F712D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F712D62BF1000CFCDF /* PBXTextBookmark */; 178 | B2E332F812D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F812D62BF1000CFCDF /* PBXTextBookmark */; 179 | B2E332F912D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F912D62BF1000CFCDF /* PBXTextBookmark */; 180 | B2E332FA12D62BF1000CFCDF /* PBXTextBookmark */ = B2E332FA12D62BF1000CFCDF /* PBXTextBookmark */; 181 | B2E332FB12D62BF1000CFCDF /* PBXTextBookmark */ = B2E332FB12D62BF1000CFCDF /* PBXTextBookmark */; 182 | B2E332FC12D62BF1000CFCDF /* PBXTextBookmark */ = B2E332FC12D62BF1000CFCDF /* PBXTextBookmark */; 183 | }; 184 | sourceControlManager = B2DBE92911E60DCE006CC7F5 /* Source Control */; 185 | userBuildSettings = { 186 | }; 187 | }; 188 | B26D32BD11F89AF100963471 /* PBXTextBookmark */ = { 189 | isa = PBXTextBookmark; 190 | fRef = 01E9A73311A5789600AF5133 /* NSURLConnectionLoader.m */; 191 | name = "NSURLConnectionLoader.m: 57"; 192 | rLen = 0; 193 | rLoc = 1484; 194 | rType = 0; 195 | vrLen = 1282; 196 | vrLoc = 555; 197 | }; 198 | B28BB4E4120B0F0C00A31E5A /* PBXTextBookmark */ = { 199 | isa = PBXTextBookmark; 200 | fRef = 01E9A41311A5280E00AF5133 /* SyncronousLoader.m */; 201 | name = "SyncronousLoader.m: 9"; 202 | rLen = 0; 203 | rLoc = 160; 204 | rType = 0; 205 | vrLen = 1158; 206 | vrLoc = 0; 207 | }; 208 | B28BB4E5120B0F0C00A31E5A /* PBXTextBookmark */ = { 209 | isa = PBXTextBookmark; 210 | fRef = 01E9A49C11A5397200AF5133 /* SingleThreadedLoader.h */; 211 | name = "SingleThreadedLoader.h: 1"; 212 | rLen = 0; 213 | rLoc = 0; 214 | rType = 0; 215 | vrLen = 253; 216 | vrLoc = 0; 217 | }; 218 | B28BB4E6120B0F0C00A31E5A /* PBXTextBookmark */ = { 219 | isa = PBXTextBookmark; 220 | fRef = 01E9A49D11A5397200AF5133 /* SingleThreadedLoader.m */; 221 | name = "SingleThreadedLoader.m: 42"; 222 | rLen = 27; 223 | rLoc = 1140; 224 | rType = 0; 225 | vrLen = 1254; 226 | vrLoc = 133; 227 | }; 228 | B28BB4E7120B0F0C00A31E5A /* PBXTextBookmark */ = { 229 | isa = PBXTextBookmark; 230 | fRef = 01E9A5A111A56FF000AF5133 /* NSOperationLoader.h */; 231 | name = "NSOperationLoader.h: 15"; 232 | rLen = 0; 233 | rLoc = 287; 234 | rType = 0; 235 | vrLen = 344; 236 | vrLoc = 0; 237 | }; 238 | B2DBE92111E60DAF006CC7F5 /* ImageLoader */ = { 239 | isa = PBXExecutable; 240 | activeArgIndices = ( 241 | ); 242 | argumentStrings = ( 243 | ); 244 | autoAttachOnCrash = 1; 245 | breakpointsEnabled = 0; 246 | configStateDict = { 247 | }; 248 | customDataFormattersEnabled = 1; 249 | dataTipCustomDataFormattersEnabled = 1; 250 | dataTipShowTypeColumn = 1; 251 | dataTipSortType = 0; 252 | debuggerPlugin = GDBDebugging; 253 | disassemblyDisplayState = 0; 254 | dylibVariantSuffix = ""; 255 | enableDebugStr = 1; 256 | environmentEntries = ( 257 | ); 258 | executableSystemSymbolLevel = 0; 259 | executableUserSymbolLevel = 0; 260 | libgmallocEnabled = 0; 261 | name = ImageLoader; 262 | savedGlobals = { 263 | }; 264 | showTypeColumn = 0; 265 | sourceDirectories = ( 266 | ); 267 | }; 268 | B2DBE92911E60DCE006CC7F5 /* Source Control */ = { 269 | isa = PBXSourceControlManager; 270 | fallbackIsa = XCSourceControlManager; 271 | isSCMEnabled = 0; 272 | scmConfiguration = { 273 | repositoryNamesForRoots = { 274 | "" = ""; 275 | }; 276 | }; 277 | }; 278 | B2DBE92A11E60DCE006CC7F5 /* Code sense */ = { 279 | isa = PBXCodeSenseManager; 280 | indexTemplatePath = ""; 281 | }; 282 | B2DBE94311E60FC0006CC7F5 /* BlockLoader.h */ = { 283 | uiCtxt = { 284 | sepNavIntBoundsRect = "{{0, 0}, {663, 569}}"; 285 | sepNavSelRange = "{204, 0}"; 286 | sepNavVisRange = "{0, 346}"; 287 | }; 288 | }; 289 | B2DBE94411E60FC0006CC7F5 /* BlockLoader.m */ = { 290 | uiCtxt = { 291 | sepNavIntBoundsRect = "{{0, 0}, {803, 1001}}"; 292 | sepNavSelRange = "{945, 0}"; 293 | sepNavVisRange = "{199, 1378}"; 294 | }; 295 | }; 296 | B2DBE9C311E62762006CC7F5 /* PBXTextBookmark */ = { 297 | isa = PBXTextBookmark; 298 | fRef = 01E9A4B211A5452200AF5133 /* MultiThreadedLoader.h */; 299 | name = "MultiThreadedLoader.h: 14"; 300 | rLen = 26; 301 | rLoc = 250; 302 | rType = 0; 303 | vrLen = 285; 304 | vrLoc = 0; 305 | }; 306 | B2DEBA8611F0869100B4E775 /* PBXTextBookmark */ = { 307 | isa = PBXTextBookmark; 308 | fRef = 01E9A73211A5789600AF5133 /* NSURLConnectionLoader.h */; 309 | name = "NSURLConnectionLoader.h: 1"; 310 | rLen = 0; 311 | rLoc = 0; 312 | rType = 0; 313 | vrLen = 348; 314 | vrLoc = 0; 315 | }; 316 | B2E332F512D62BF1000CFCDF /* PBXTextBookmark */ = { 317 | isa = PBXTextBookmark; 318 | fRef = 01E9A5A211A56FF000AF5133 /* NSOperationLoader.m */; 319 | name = "NSOperationLoader.m: 53"; 320 | rLen = 3; 321 | rLoc = 1301; 322 | rType = 0; 323 | vrLen = 838; 324 | vrLoc = 582; 325 | }; 326 | B2E332F612D62BF1000CFCDF /* PBXTextBookmark */ = { 327 | isa = PBXTextBookmark; 328 | fRef = B2DBE94411E60FC0006CC7F5 /* BlockLoader.m */; 329 | name = "BlockLoader.m: 36"; 330 | rLen = 0; 331 | rLoc = 945; 332 | rType = 0; 333 | vrLen = 1378; 334 | vrLoc = 199; 335 | }; 336 | B2E332F712D62BF1000CFCDF /* PBXTextBookmark */ = { 337 | isa = PBXTextBookmark; 338 | fRef = 01C29DAA119AEFA6009D0C64 /* ImageLoader.h */; 339 | name = "ImageLoader.h: 1"; 340 | rLen = 0; 341 | rLoc = 0; 342 | rType = 0; 343 | vrLen = 681; 344 | vrLoc = 0; 345 | }; 346 | B2E332F812D62BF1000CFCDF /* PBXTextBookmark */ = { 347 | isa = PBXTextBookmark; 348 | fRef = 01E9A41211A5280E00AF5133 /* SyncronousLoader.h */; 349 | name = "SyncronousLoader.h: 1"; 350 | rLen = 0; 351 | rLoc = 0; 352 | rType = 0; 353 | vrLen = 257; 354 | vrLoc = 0; 355 | }; 356 | B2E332F912D62BF1000CFCDF /* PBXTextBookmark */ = { 357 | isa = PBXTextBookmark; 358 | fRef = 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */; 359 | name = "ImageLoaderAppDelegate.m: 1"; 360 | rLen = 0; 361 | rLoc = 0; 362 | rType = 0; 363 | vrLen = 780; 364 | vrLoc = 0; 365 | }; 366 | B2E332FA12D62BF1000CFCDF /* PBXTextBookmark */ = { 367 | isa = PBXTextBookmark; 368 | fRef = 28C286E00D94DF7D0034E888 /* RootViewController.m */; 369 | name = "RootViewController.m: 63"; 370 | rLen = 30; 371 | rLoc = 1494; 372 | rType = 0; 373 | vrLen = 999; 374 | vrLoc = 233; 375 | }; 376 | B2E332FB12D62BF1000CFCDF /* PBXTextBookmark */ = { 377 | isa = PBXTextBookmark; 378 | fRef = 01C29DAB119AEFA6009D0C64 /* ImageLoader.m */; 379 | name = "ImageLoader.m: 60"; 380 | rLen = 0; 381 | rLoc = 1450; 382 | rType = 0; 383 | vrLen = 1060; 384 | vrLoc = 558; 385 | }; 386 | B2E332FC12D62BF1000CFCDF /* PBXTextBookmark */ = { 387 | isa = PBXTextBookmark; 388 | fRef = 01C29DAB119AEFA6009D0C64 /* ImageLoader.m */; 389 | name = "ImageLoader.m: 32"; 390 | rLen = 1; 391 | rLoc = 717; 392 | rType = 0; 393 | vrLen = 966; 394 | vrLoc = 273; 395 | }; 396 | } 397 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/nick.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 0133DAF611A588000057B3AF /* PBXTextBookmark */ = { 4 | isa = PBXTextBookmark; 5 | fRef = 1D3623240D0F684500981E51 /* ImageLoaderAppDelegate.h */; 6 | name = "ImageLoaderAppDelegate.h: 22"; 7 | rLen = 0; 8 | rLoc = 470; 9 | rType = 0; 10 | vrLen = 470; 11 | vrLoc = 0; 12 | }; 13 | 01C29D95119AEE5C009D0C64 /* ImageLoader */ = { 14 | isa = PBXExecutable; 15 | activeArgIndices = ( 16 | ); 17 | argumentStrings = ( 18 | ); 19 | autoAttachOnCrash = 1; 20 | breakpointsEnabled = 1; 21 | configStateDict = { 22 | }; 23 | customDataFormattersEnabled = 1; 24 | dataTipCustomDataFormattersEnabled = 1; 25 | dataTipShowTypeColumn = 1; 26 | dataTipSortType = 0; 27 | debuggerPlugin = GDBDebugging; 28 | disassemblyDisplayState = 0; 29 | dylibVariantSuffix = ""; 30 | enableDebugStr = 1; 31 | environmentEntries = ( 32 | ); 33 | executableSystemSymbolLevel = 0; 34 | executableUserSymbolLevel = 0; 35 | libgmallocEnabled = 0; 36 | name = ImageLoader; 37 | savedGlobals = { 38 | }; 39 | showTypeColumn = 0; 40 | sourceDirectories = ( 41 | ); 42 | variableFormatDictionary = { 43 | }; 44 | }; 45 | 01C29DA6119AEE69009D0C64 /* Source Control */ = { 46 | isa = PBXSourceControlManager; 47 | fallbackIsa = XCSourceControlManager; 48 | isSCMEnabled = 0; 49 | scmConfiguration = { 50 | repositoryNamesForRoots = { 51 | "" = ""; 52 | }; 53 | }; 54 | }; 55 | 01C29DA7119AEE69009D0C64 /* Code sense */ = { 56 | isa = PBXCodeSenseManager; 57 | indexTemplatePath = ""; 58 | }; 59 | 01C29DAA119AEFA6009D0C64 /* ImageLoader.h */ = { 60 | uiCtxt = { 61 | sepNavIntBoundsRect = "{{0, 0}, {1113, 524}}"; 62 | sepNavSelRange = "{319, 98}"; 63 | sepNavVisRange = "{0, 681}"; 64 | sepNavWindowFrame = "{{0, 4}, {1280, 742}}"; 65 | }; 66 | }; 67 | 01C29DAB119AEFA6009D0C64 /* ImageLoader.m */ = { 68 | uiCtxt = { 69 | sepNavIntBoundsRect = "{{0, 0}, {1113, 1092}}"; 70 | sepNavSelRange = "{2028, 0}"; 71 | sepNavVisRange = "{869, 997}"; 72 | }; 73 | }; 74 | 01C29DD2119B0B6B009D0C64 /* PBXTextBookmark */ = { 75 | isa = PBXTextBookmark; 76 | fRef = 01C29DD3119B0B6B009D0C64 /* UIBarButtonItem.h */; 77 | name = "UIBarButtonItem.h: 69"; 78 | rLen = 109; 79 | rLoc = 1966; 80 | rType = 0; 81 | vrLen = 1421; 82 | vrLoc = 1354; 83 | }; 84 | 01C29DD3119B0B6B009D0C64 /* UIBarButtonItem.h */ = { 85 | isa = PBXFileReference; 86 | lastKnownFileType = sourcecode.c.h; 87 | name = UIBarButtonItem.h; 88 | path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIBarButtonItem.h; 89 | sourceTree = ""; 90 | }; 91 | 01E9A40F11A5261A00AF5133 /* Images.plist */ = { 92 | uiCtxt = { 93 | sepNavIntBoundsRect = "{{0, 0}, {1292, 742}}"; 94 | sepNavSelRange = "{1135, 0}"; 95 | sepNavVisRect = "{{0, 23}, {1292, 718}}"; 96 | }; 97 | }; 98 | 01E9A41211A5280E00AF5133 /* SyncronousLoader.h */ = { 99 | uiCtxt = { 100 | sepNavIntBoundsRect = "{{0, 0}, {937, 524}}"; 101 | sepNavSelRange = "{178, 23}"; 102 | sepNavVisRange = "{0, 257}"; 103 | }; 104 | }; 105 | 01E9A41311A5280E00AF5133 /* SyncronousLoader.m */ = { 106 | uiCtxt = { 107 | sepNavIntBoundsRect = "{{0, 0}, {937, 572}}"; 108 | sepNavSelRange = "{615, 0}"; 109 | sepNavVisRange = "{0, 1152}"; 110 | }; 111 | }; 112 | 01E9A47F11A537CC00AF5133 /* PBXTextBookmark */ = { 113 | isa = PBXTextBookmark; 114 | fRef = 01E9A48011A537CC00AF5133 /* NSURL.h */; 115 | name = "NSURL.h: 51"; 116 | rLen = 0; 117 | rLoc = 2585; 118 | rType = 0; 119 | vrLen = 3302; 120 | vrLoc = 1578; 121 | }; 122 | 01E9A48011A537CC00AF5133 /* NSURL.h */ = { 123 | isa = PBXFileReference; 124 | lastKnownFileType = sourcecode.c.h; 125 | name = NSURL.h; 126 | path = /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSURL.h; 127 | sourceTree = ""; 128 | }; 129 | 01E9A49C11A5397200AF5133 /* SingleThreadedLoader.h */ = { 130 | uiCtxt = { 131 | sepNavIntBoundsRect = "{{0, 0}, {1113, 524}}"; 132 | sepNavSelRange = "{230, 11}"; 133 | sepNavVisRange = "{0, 253}"; 134 | }; 135 | }; 136 | 01E9A49D11A5397200AF5133 /* SingleThreadedLoader.m */ = { 137 | uiCtxt = { 138 | sepNavIntBoundsRect = "{{0, 0}, {1113, 754}}"; 139 | sepNavSelRange = "{1239, 0}"; 140 | sepNavVisRange = "{292, 1224}"; 141 | }; 142 | }; 143 | 01E9A4B211A5452200AF5133 /* MultiThreadedLoader.h */ = { 144 | uiCtxt = { 145 | sepNavIntBoundsRect = "{{0, 0}, {937, 524}}"; 146 | sepNavSelRange = "{250, 26}"; 147 | sepNavVisRange = "{0, 285}"; 148 | }; 149 | }; 150 | 01E9A4B311A5452200AF5133 /* MultiThreadedLoader.m */ = { 151 | uiCtxt = { 152 | sepNavIntBoundsRect = "{{0, 0}, {937, 832}}"; 153 | sepNavSelRange = "{1145, 0}"; 154 | sepNavVisRange = "{431, 1160}"; 155 | }; 156 | }; 157 | 01E9A57011A56C6900AF5133 /* PBXTextBookmark */ = { 158 | isa = PBXTextBookmark; 159 | fRef = 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */; 160 | name = "ImageLoaderAppDelegate.m: 40"; 161 | rLen = 0; 162 | rLoc = 831; 163 | rType = 0; 164 | vrLen = 879; 165 | vrLoc = 0; 166 | }; 167 | 01E9A58311A56D7600AF5133 /* PlistBookmark */ = { 168 | isa = PlistBookmark; 169 | fRef = 8D1107310486CEB800E47090 /* ImageLoader-Info.plist */; 170 | fallbackIsa = PBXBookmark; 171 | isK = 0; 172 | kPath = ( 173 | ); 174 | name = "/Users/nick/Desktop/ImageLoader/ImageLoader-Info.plist"; 175 | rLen = 0; 176 | rLoc = 9223372036854775808; 177 | }; 178 | 01E9A5A111A56FF000AF5133 /* NSOperationLoader.h */ = { 179 | uiCtxt = { 180 | sepNavIntBoundsRect = "{{0, 0}, {937, 524}}"; 181 | sepNavSelRange = "{273, 16}"; 182 | sepNavVisRange = "{0, 344}"; 183 | }; 184 | }; 185 | 01E9A5A211A56FF000AF5133 /* NSOperationLoader.m */ = { 186 | uiCtxt = { 187 | sepNavIntBoundsRect = "{{0, 0}, {720, 1729}}"; 188 | sepNavSelRange = "{332, 4}"; 189 | sepNavVisRange = "{218, 278}"; 190 | }; 191 | }; 192 | 01E9A71611A5764200AF5133 /* PBXTextBookmark */ = { 193 | isa = PBXTextBookmark; 194 | fRef = 01E9A4B211A5452200AF5133 /* MultiThreadedLoader.h */; 195 | name = "MultiThreadedLoader.h: 14"; 196 | rLen = 26; 197 | rLoc = 250; 198 | rType = 0; 199 | vrLen = 285; 200 | vrLoc = 0; 201 | }; 202 | 01E9A72011A5769200AF5133 /* PBXTextBookmark */ = { 203 | isa = PBXTextBookmark; 204 | fRef = 01E9A4B311A5452200AF5133 /* MultiThreadedLoader.m */; 205 | name = "MultiThreadedLoader.m: 12"; 206 | rLen = 0; 207 | rLoc = 198; 208 | rType = 0; 209 | vrLen = 1493; 210 | vrLoc = 92; 211 | }; 212 | 01E9A72811A5780200AF5133 /* PBXTextBookmark */ = { 213 | isa = PBXTextBookmark; 214 | fRef = 01E9A5A111A56FF000AF5133 /* NSOperationLoader.h */; 215 | name = "NSOperationLoader.h: 20"; 216 | rLen = 0; 217 | rLoc = 344; 218 | rType = 0; 219 | vrLen = 344; 220 | vrLoc = 0; 221 | }; 222 | 01E9A73211A5789600AF5133 /* NSURLConnectionLoader.h */ = { 223 | uiCtxt = { 224 | sepNavIntBoundsRect = "{{0, 0}, {937, 524}}"; 225 | sepNavSelRange = "{267, 0}"; 226 | sepNavVisRange = "{0, 348}"; 227 | }; 228 | }; 229 | 01E9A73311A5789600AF5133 /* NSURLConnectionLoader.m */ = { 230 | uiCtxt = { 231 | sepNavIntBoundsRect = "{{0, 0}, {937, 1222}}"; 232 | sepNavSelRange = "{2029, 0}"; 233 | sepNavVisRange = "{0, 975}"; 234 | }; 235 | }; 236 | 01E9A73C11A57E8000AF5133 /* PBXTextBookmark */ = { 237 | isa = PBXTextBookmark; 238 | fRef = 01E9A73211A5789600AF5133 /* NSURLConnectionLoader.h */; 239 | name = "NSURLConnectionLoader.h: 14"; 240 | rLen = 0; 241 | rLoc = 267; 242 | rType = 0; 243 | vrLen = 348; 244 | vrLoc = 0; 245 | }; 246 | 01E9A73D11A57E8000AF5133 /* PBXTextBookmark */ = { 247 | isa = PBXTextBookmark; 248 | fRef = 01E9A5A211A56FF000AF5133 /* NSOperationLoader.m */; 249 | name = "NSOperationLoader.m: 89"; 250 | rLen = 0; 251 | rLoc = 1823; 252 | rType = 0; 253 | vrLen = 1448; 254 | vrLoc = 1439; 255 | }; 256 | 01E9A73E11A57E8000AF5133 /* PBXTextBookmark */ = { 257 | isa = PBXTextBookmark; 258 | fRef = 01E9A49C11A5397200AF5133 /* SingleThreadedLoader.h */; 259 | name = "SingleThreadedLoader.h: 12"; 260 | rLen = 11; 261 | rLoc = 230; 262 | rType = 0; 263 | vrLen = 253; 264 | vrLoc = 0; 265 | }; 266 | 01E9A74311A57E9600AF5133 /* PBXTextBookmark */ = { 267 | isa = PBXTextBookmark; 268 | fRef = 01E9A49D11A5397200AF5133 /* SingleThreadedLoader.m */; 269 | name = "SingleThreadedLoader.m: 25"; 270 | rLen = 0; 271 | rLoc = 527; 272 | rType = 0; 273 | vrLen = 1518; 274 | vrLoc = 3; 275 | }; 276 | 01E9A75011A57F7700AF5133 /* PBXTextBookmark */ = { 277 | isa = PBXTextBookmark; 278 | fRef = 01E9A73311A5789600AF5133 /* NSURLConnectionLoader.m */; 279 | name = "NSURLConnectionLoader.m: 21"; 280 | rLen = 0; 281 | rLoc = 508; 282 | rType = 0; 283 | vrLen = 1480; 284 | vrLoc = 144; 285 | }; 286 | 01E9A75311A57F7700AF5133 /* PBXTextBookmark */ = { 287 | isa = PBXTextBookmark; 288 | fRef = 01E9A40F11A5261A00AF5133 /* Images.plist */; 289 | name = "Images.plist: 15"; 290 | rLen = 0; 291 | rLoc = 1135; 292 | rType = 0; 293 | vrLen = 4436; 294 | vrLoc = 0; 295 | }; 296 | 01E9A75411A57F7700AF5133 /* PBXTextBookmark */ = { 297 | isa = PBXTextBookmark; 298 | fRef = 28C286DF0D94DF7D0034E888 /* RootViewController.h */; 299 | name = "RootViewController.h: 22"; 300 | rLen = 0; 301 | rLoc = 374; 302 | rType = 0; 303 | vrLen = 374; 304 | vrLoc = 0; 305 | }; 306 | 01E9A75511A57F7700AF5133 /* PBXTextBookmark */ = { 307 | isa = PBXTextBookmark; 308 | fRef = 28C286E00D94DF7D0034E888 /* RootViewController.m */; 309 | name = "RootViewController.m: 54"; 310 | rLen = 0; 311 | rLoc = 1306; 312 | rType = 0; 313 | vrLen = 1527; 314 | vrLoc = 451; 315 | }; 316 | 01E9A75C11A57FA900AF5133 /* PBXTextBookmark */ = { 317 | isa = PBXTextBookmark; 318 | fRef = 01E9A41211A5280E00AF5133 /* SyncronousLoader.h */; 319 | name = "SyncronousLoader.h: 10"; 320 | rLen = 23; 321 | rLoc = 178; 322 | rType = 0; 323 | vrLen = 257; 324 | vrLoc = 0; 325 | }; 326 | 01E9A75F11A57FE800AF5133 /* PBXTextBookmark */ = { 327 | isa = PBXTextBookmark; 328 | fRef = 01E9A41311A5280E00AF5133 /* SyncronousLoader.m */; 329 | name = "SyncronousLoader.m: 25"; 330 | rLen = 0; 331 | rLoc = 533; 332 | rType = 0; 333 | vrLen = 1158; 334 | vrLoc = 0; 335 | }; 336 | 01E9A76011A57FE800AF5133 /* PBXTextBookmark */ = { 337 | isa = PBXTextBookmark; 338 | fRef = 01C29DAB119AEFA6009D0C64 /* ImageLoader.m */; 339 | name = "ImageLoader.m: 54"; 340 | rLen = 0; 341 | rLoc = 1283; 342 | rType = 0; 343 | vrLen = 1313; 344 | vrLoc = 0; 345 | }; 346 | 01E9A76311A57FF800AF5133 /* PBXTextBookmark */ = { 347 | isa = PBXTextBookmark; 348 | fRef = 01C29DAA119AEFA6009D0C64 /* ImageLoader.h */; 349 | name = "ImageLoader.h: 27"; 350 | rLen = 0; 351 | rLoc = 430; 352 | rType = 0; 353 | vrLen = 681; 354 | vrLoc = 0; 355 | }; 356 | 1D3623240D0F684500981E51 /* ImageLoaderAppDelegate.h */ = { 357 | uiCtxt = { 358 | sepNavIntBoundsRect = "{{0, 0}, {1278, 739}}"; 359 | sepNavSelRange = "{470, 0}"; 360 | sepNavVisRange = "{0, 470}"; 361 | }; 362 | }; 363 | 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */ = { 364 | uiCtxt = { 365 | sepNavIntBoundsRect = "{{0, 0}, {937, 624}}"; 366 | sepNavSelRange = "{831, 0}"; 367 | sepNavVisRange = "{0, 871}"; 368 | }; 369 | }; 370 | 1D6058900D05DD3D006BFB54 /* ImageLoader */ = { 371 | activeExec = 0; 372 | executables = ( 373 | 01C29D95119AEE5C009D0C64 /* ImageLoader */, 374 | ); 375 | }; 376 | 28C286DF0D94DF7D0034E888 /* RootViewController.h */ = { 377 | uiCtxt = { 378 | sepNavIntBoundsRect = "{{0, 0}, {937, 547}}"; 379 | sepNavSelRange = "{374, 0}"; 380 | sepNavVisRange = "{0, 374}"; 381 | }; 382 | }; 383 | 28C286E00D94DF7D0034E888 /* RootViewController.m */ = { 384 | uiCtxt = { 385 | sepNavIntBoundsRect = "{{0, 0}, {937, 1807}}"; 386 | sepNavSelRange = "{900, 51}"; 387 | sepNavVisRange = "{2608, 991}"; 388 | }; 389 | }; 390 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 391 | activeBuildConfigurationName = Debug; 392 | activeExecutable = 01C29D95119AEE5C009D0C64 /* ImageLoader */; 393 | activeTarget = 1D6058900D05DD3D006BFB54 /* ImageLoader */; 394 | addToTargets = ( 395 | 1D6058900D05DD3D006BFB54 /* ImageLoader */, 396 | ); 397 | breakpoints = ( 398 | ); 399 | codeSenseManager = 01C29DA7119AEE69009D0C64 /* Code sense */; 400 | executables = ( 401 | 01C29D95119AEE5C009D0C64 /* ImageLoader */, 402 | ); 403 | perUserDictionary = { 404 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 405 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 406 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 407 | PBXFileTableDataSourceColumnWidthsKey = ( 408 | 20, 409 | 1100, 410 | 20, 411 | 48, 412 | 43, 413 | 43, 414 | 20, 415 | ); 416 | PBXFileTableDataSourceColumnsKey = ( 417 | PBXFileDataSource_FiletypeID, 418 | PBXFileDataSource_Filename_ColumnID, 419 | PBXFileDataSource_Built_ColumnID, 420 | PBXFileDataSource_ObjectSize_ColumnID, 421 | PBXFileDataSource_Errors_ColumnID, 422 | PBXFileDataSource_Warnings_ColumnID, 423 | PBXFileDataSource_Target_ColumnID, 424 | ); 425 | }; 426 | PBXPerProjectTemplateStateSaveDate = 297190869; 427 | PBXWorkspaceStateSaveDate = 297190869; 428 | }; 429 | perUserProjectItems = { 430 | 0133DAF611A588000057B3AF /* PBXTextBookmark */ = 0133DAF611A588000057B3AF /* PBXTextBookmark */; 431 | 01C29DD2119B0B6B009D0C64 /* PBXTextBookmark */ = 01C29DD2119B0B6B009D0C64 /* PBXTextBookmark */; 432 | 01E9A47F11A537CC00AF5133 /* PBXTextBookmark */ = 01E9A47F11A537CC00AF5133 /* PBXTextBookmark */; 433 | 01E9A57011A56C6900AF5133 /* PBXTextBookmark */ = 01E9A57011A56C6900AF5133 /* PBXTextBookmark */; 434 | 01E9A58311A56D7600AF5133 /* PlistBookmark */ = 01E9A58311A56D7600AF5133 /* PlistBookmark */; 435 | 01E9A71611A5764200AF5133 /* PBXTextBookmark */ = 01E9A71611A5764200AF5133 /* PBXTextBookmark */; 436 | 01E9A72011A5769200AF5133 /* PBXTextBookmark */ = 01E9A72011A5769200AF5133 /* PBXTextBookmark */; 437 | 01E9A72811A5780200AF5133 /* PBXTextBookmark */ = 01E9A72811A5780200AF5133 /* PBXTextBookmark */; 438 | 01E9A73C11A57E8000AF5133 /* PBXTextBookmark */ = 01E9A73C11A57E8000AF5133 /* PBXTextBookmark */; 439 | 01E9A73D11A57E8000AF5133 /* PBXTextBookmark */ = 01E9A73D11A57E8000AF5133 /* PBXTextBookmark */; 440 | 01E9A73E11A57E8000AF5133 /* PBXTextBookmark */ = 01E9A73E11A57E8000AF5133 /* PBXTextBookmark */; 441 | 01E9A74311A57E9600AF5133 /* PBXTextBookmark */ = 01E9A74311A57E9600AF5133 /* PBXTextBookmark */; 442 | 01E9A75011A57F7700AF5133 /* PBXTextBookmark */ = 01E9A75011A57F7700AF5133 /* PBXTextBookmark */; 443 | 01E9A75311A57F7700AF5133 /* PBXTextBookmark */ = 01E9A75311A57F7700AF5133 /* PBXTextBookmark */; 444 | 01E9A75411A57F7700AF5133 /* PBXTextBookmark */ = 01E9A75411A57F7700AF5133 /* PBXTextBookmark */; 445 | 01E9A75511A57F7700AF5133 /* PBXTextBookmark */ = 01E9A75511A57F7700AF5133 /* PBXTextBookmark */; 446 | 01E9A75C11A57FA900AF5133 /* PBXTextBookmark */ = 01E9A75C11A57FA900AF5133 /* PBXTextBookmark */; 447 | 01E9A75F11A57FE800AF5133 /* PBXTextBookmark */ = 01E9A75F11A57FE800AF5133 /* PBXTextBookmark */; 448 | 01E9A76011A57FE800AF5133 /* PBXTextBookmark */ = 01E9A76011A57FE800AF5133 /* PBXTextBookmark */; 449 | 01E9A76311A57FF800AF5133 /* PBXTextBookmark */ = 01E9A76311A57FF800AF5133 /* PBXTextBookmark */; 450 | }; 451 | sourceControlManager = 01C29DA6119AEE69009D0C64 /* Source Control */; 452 | userBuildSettings = { 453 | }; 454 | }; 455 | 29B97316FDCFA39411CA2CEA /* main.m */ = { 456 | uiCtxt = { 457 | sepNavIntBoundsRect = "{{0, 0}, {1113, 524}}"; 458 | sepNavSelRange = "{356, 0}"; 459 | sepNavVisRange = "{0, 356}"; 460 | }; 461 | }; 462 | } 463 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 01E9A41011A5261A00AF5133 /* Images.plist in Resources */ = {isa = PBXBuildFile; fileRef = 01E9A40F11A5261A00AF5133 /* Images.plist */; }; 11 | 01FDC2A1168118B9001E49A6 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 01FDC2A0168118B9001E49A6 /* Default-568h@2x.png */; }; 12 | 1D3623260D0F684500981E51 /* ImageLoaderAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */; }; 13 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 14 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 15 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 16 | 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; }; 17 | 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD735F0D9D9599002E5188 /* MainWindow.xib */; }; 18 | 28C286E10D94DF7D0034E888 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28C286E00D94DF7D0034E888 /* RootViewController.m */; }; 19 | 28F335F11007B36200424DE2 /* RootViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28F335F01007B36200424DE2 /* RootViewController.xib */; }; 20 | B21F427814C6DFE400A39BFD /* RequestQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = B21F427714C6DFE400A39BFD /* RequestQueue.m */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXFileReference section */ 24 | 01E9A40F11A5261A00AF5133 /* Images.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Images.plist; sourceTree = ""; }; 25 | 01FDC2A0168118B9001E49A6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 26 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 27 | 1D3623240D0F684500981E51 /* ImageLoaderAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = ImageLoaderAppDelegate.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 28 | 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ImageLoaderAppDelegate.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 29 | 1D6058910D05DD3D006BFB54 /* ImageLoader.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ImageLoader.app; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 31 | 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 32 | 28A0AAE50D9B0CCF005BE974 /* ImageLoader_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageLoader_Prefix.pch; sourceTree = ""; }; 33 | 28AD735F0D9D9599002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 34 | 28C286DF0D94DF7D0034E888 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = RootViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 35 | 28C286E00D94DF7D0034E888 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = RootViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 36 | 28F335F01007B36200424DE2 /* RootViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RootViewController.xib; sourceTree = ""; }; 37 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = main.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 38 | 8D1107310486CEB800E47090 /* ImageLoader-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "ImageLoader-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 39 | B21F427614C6DFE400A39BFD /* RequestQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RequestQueue.h; sourceTree = ""; }; 40 | B21F427714C6DFE400A39BFD /* RequestQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RequestQueue.m; sourceTree = ""; }; 41 | /* End PBXFileReference section */ 42 | 43 | /* Begin PBXFrameworksBuildPhase section */ 44 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 45 | isa = PBXFrameworksBuildPhase; 46 | buildActionMask = 2147483647; 47 | files = ( 48 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 49 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 50 | 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, 51 | ); 52 | runOnlyForDeploymentPostprocessing = 0; 53 | }; 54 | /* End PBXFrameworksBuildPhase section */ 55 | 56 | /* Begin PBXGroup section */ 57 | 080E96DDFE201D6D7F000001 /* Classes */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | 1D3623240D0F684500981E51 /* ImageLoaderAppDelegate.h */, 61 | 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */, 62 | 28C286DF0D94DF7D0034E888 /* RootViewController.h */, 63 | 28C286E00D94DF7D0034E888 /* RootViewController.m */, 64 | ); 65 | path = Classes; 66 | sourceTree = ""; 67 | }; 68 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 1D6058910D05DD3D006BFB54 /* ImageLoader.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | B21F427514C6DFE400A39BFD /* RequestQueue */, 80 | 080E96DDFE201D6D7F000001 /* Classes */, 81 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 82 | 29B97317FDCFA39411CA2CEA /* Resources */, 83 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 84 | 19C28FACFE9D520D11CA2CBB /* Products */, 85 | ); 86 | name = CustomTemplate; 87 | sourceTree = ""; 88 | }; 89 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 28A0AAE50D9B0CCF005BE974 /* ImageLoader_Prefix.pch */, 93 | 29B97316FDCFA39411CA2CEA /* main.m */, 94 | ); 95 | name = "Other Sources"; 96 | sourceTree = ""; 97 | }; 98 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 01FDC2A0168118B9001E49A6 /* Default-568h@2x.png */, 102 | 28F335F01007B36200424DE2 /* RootViewController.xib */, 103 | 28AD735F0D9D9599002E5188 /* MainWindow.xib */, 104 | 8D1107310486CEB800E47090 /* ImageLoader-Info.plist */, 105 | 01E9A40F11A5261A00AF5133 /* Images.plist */, 106 | ); 107 | name = Resources; 108 | sourceTree = ""; 109 | }; 110 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 114 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 115 | 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */, 116 | ); 117 | name = Frameworks; 118 | sourceTree = ""; 119 | }; 120 | B21F427514C6DFE400A39BFD /* RequestQueue */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | B21F427614C6DFE400A39BFD /* RequestQueue.h */, 124 | B21F427714C6DFE400A39BFD /* RequestQueue.m */, 125 | ); 126 | name = RequestQueue; 127 | path = ../../RequestQueue; 128 | sourceTree = ""; 129 | }; 130 | /* End PBXGroup section */ 131 | 132 | /* Begin PBXNativeTarget section */ 133 | 1D6058900D05DD3D006BFB54 /* ImageLoader */ = { 134 | isa = PBXNativeTarget; 135 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "ImageLoader" */; 136 | buildPhases = ( 137 | 1D60588D0D05DD3D006BFB54 /* Resources */, 138 | 1D60588E0D05DD3D006BFB54 /* Sources */, 139 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 140 | ); 141 | buildRules = ( 142 | ); 143 | dependencies = ( 144 | ); 145 | name = ImageLoader; 146 | productName = ImageLoader; 147 | productReference = 1D6058910D05DD3D006BFB54 /* ImageLoader.app */; 148 | productType = "com.apple.product-type.application"; 149 | }; 150 | /* End PBXNativeTarget section */ 151 | 152 | /* Begin PBXProject section */ 153 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 154 | isa = PBXProject; 155 | attributes = { 156 | LastUpgradeCheck = 0600; 157 | }; 158 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ImageLoader" */; 159 | compatibilityVersion = "Xcode 3.2"; 160 | developmentRegion = English; 161 | hasScannedForEncodings = 1; 162 | knownRegions = ( 163 | English, 164 | Japanese, 165 | French, 166 | German, 167 | en, 168 | ); 169 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 170 | projectDirPath = ""; 171 | projectRoot = ""; 172 | targets = ( 173 | 1D6058900D05DD3D006BFB54 /* ImageLoader */, 174 | ); 175 | }; 176 | /* End PBXProject section */ 177 | 178 | /* Begin PBXResourcesBuildPhase section */ 179 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 180 | isa = PBXResourcesBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */, 184 | 28F335F11007B36200424DE2 /* RootViewController.xib in Resources */, 185 | 01E9A41011A5261A00AF5133 /* Images.plist in Resources */, 186 | 01FDC2A1168118B9001E49A6 /* Default-568h@2x.png in Resources */, 187 | ); 188 | runOnlyForDeploymentPostprocessing = 0; 189 | }; 190 | /* End PBXResourcesBuildPhase section */ 191 | 192 | /* Begin PBXSourcesBuildPhase section */ 193 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 194 | isa = PBXSourcesBuildPhase; 195 | buildActionMask = 2147483647; 196 | files = ( 197 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 198 | 1D3623260D0F684500981E51 /* ImageLoaderAppDelegate.m in Sources */, 199 | 28C286E10D94DF7D0034E888 /* RootViewController.m in Sources */, 200 | B21F427814C6DFE400A39BFD /* RequestQueue.m in Sources */, 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | }; 204 | /* End PBXSourcesBuildPhase section */ 205 | 206 | /* Begin XCBuildConfiguration section */ 207 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 208 | isa = XCBuildConfiguration; 209 | buildSettings = { 210 | ALWAYS_SEARCH_USER_PATHS = NO; 211 | CLANG_ENABLE_OBJC_ARC = YES; 212 | COPY_PHASE_STRIP = NO; 213 | GCC_DYNAMIC_NO_PIC = NO; 214 | GCC_OPTIMIZATION_LEVEL = 0; 215 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 216 | GCC_PREFIX_HEADER = ImageLoader_Prefix.pch; 217 | INFOPLIST_FILE = "ImageLoader-Info.plist"; 218 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 219 | PRODUCT_NAME = ImageLoader; 220 | SDKROOT = iphoneos; 221 | TARGETED_DEVICE_FAMILY = 1; 222 | }; 223 | name = Debug; 224 | }; 225 | 1D6058950D05DD3E006BFB54 /* Release */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | ALWAYS_SEARCH_USER_PATHS = NO; 229 | CLANG_ENABLE_OBJC_ARC = YES; 230 | COPY_PHASE_STRIP = YES; 231 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 232 | GCC_PREFIX_HEADER = ImageLoader_Prefix.pch; 233 | INFOPLIST_FILE = "ImageLoader-Info.plist"; 234 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 235 | PRODUCT_NAME = ImageLoader; 236 | SDKROOT = iphoneos; 237 | TARGETED_DEVICE_FAMILY = 1; 238 | VALIDATE_PRODUCT = YES; 239 | }; 240 | name = Release; 241 | }; 242 | C01FCF4F08A954540054247B /* Debug */ = { 243 | isa = XCBuildConfiguration; 244 | buildSettings = { 245 | CLANG_WARN_OBJCPP_ARC_ABI = YES; 246 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 247 | GCC_C_LANGUAGE_STANDARD = c99; 248 | GCC_TREAT_WARNINGS_AS_ERRORS = YES; 249 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 250 | GCC_WARN_UNUSED_VARIABLE = YES; 251 | ONLY_ACTIVE_ARCH = YES; 252 | RUN_CLANG_STATIC_ANALYZER = YES; 253 | SDKROOT = iphoneos; 254 | WARNING_CFLAGS = ( 255 | "-Wall", 256 | "-Wextra", 257 | ); 258 | }; 259 | name = Debug; 260 | }; 261 | C01FCF5008A954540054247B /* Release */ = { 262 | isa = XCBuildConfiguration; 263 | buildSettings = { 264 | CLANG_WARN_OBJCPP_ARC_ABI = YES; 265 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 266 | GCC_C_LANGUAGE_STANDARD = c99; 267 | GCC_TREAT_WARNINGS_AS_ERRORS = YES; 268 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 269 | GCC_WARN_UNUSED_VARIABLE = YES; 270 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 271 | RUN_CLANG_STATIC_ANALYZER = YES; 272 | SDKROOT = iphoneos; 273 | WARNING_CFLAGS = ( 274 | "-Wall", 275 | "-Wextra", 276 | ); 277 | }; 278 | name = Release; 279 | }; 280 | /* End XCBuildConfiguration section */ 281 | 282 | /* Begin XCConfigurationList section */ 283 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "ImageLoader" */ = { 284 | isa = XCConfigurationList; 285 | buildConfigurations = ( 286 | 1D6058940D05DD3E006BFB54 /* Debug */, 287 | 1D6058950D05DD3E006BFB54 /* Release */, 288 | ); 289 | defaultConfigurationIsVisible = 0; 290 | defaultConfigurationName = Release; 291 | }; 292 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ImageLoader" */ = { 293 | isa = XCConfigurationList; 294 | buildConfigurations = ( 295 | C01FCF4F08A954540054247B /* Debug */, 296 | C01FCF5008A954540054247B /* Release */, 297 | ); 298 | defaultConfigurationIsVisible = 0; 299 | defaultConfigurationName = Release; 300 | }; 301 | /* End XCConfigurationList section */ 302 | }; 303 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 304 | } 305 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/project.xcworkspace/xcuserdata/nick.lockwood.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceUserSettings_BuildLocationStyle 6 | 0 7 | IDEWorkspaceUserSettings_BuildSubfolderNameStyle 8 | 0 9 | IDEWorkspaceUserSettings_DerivedDataLocationStyle 10 | 0 11 | IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 12 | 13 | IDEWorkspaceUserSettings_IssueFilterStyle 14 | 0 15 | IDEWorkspaceUserSettings_LiveSourceIssuesEnabled 16 | 17 | IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges 18 | 19 | IDEWorkspaceUserSettings_SnapshotLocationStyle 20 | 0 21 | 22 | 23 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/project.xcworkspace/xcuserdata/nick.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/xcuserdata/nick.lockwood.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/xcuserdata/nick.lockwood.xcuserdatad/xcschemes/ImageLoader.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/xcuserdata/nick.lockwood.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ImageLoader.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1D6058900D05DD3D006BFB54 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/xcuserdata/nick.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ImageLoader.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1D6058900D05DD3D006BFB54 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Examples/ImageLoader/ImageLoader_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'ImageLoader' target in the 'ImageLoader' project 3 | // 4 | #import 5 | 6 | #ifndef __IPHONE_3_0 7 | #warning "This project uses features only available in iPhone SDK 3.0 and later." 8 | #endif 9 | 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /Examples/ImageLoader/Images.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0351.JPG 6 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0355.JPG 7 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0356.JPG 8 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0357.JPG 9 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0358.JPG 10 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0361.JPG 11 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0362.JPG 12 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0150.jpg 13 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0154.jpg 14 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0163.jpg 15 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0169.jpg 16 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0170.jpg 17 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0173.jpg 18 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0174.jpg 19 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0180.jpg 20 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0181.jpg 21 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0184.jpg 22 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0197.jpg 23 | 24 | 25 | -------------------------------------------------------------------------------- /Examples/ImageLoader/MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 800 5 | 10D541 6 | 760 7 | 1038.29 8 | 460.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 81 12 | 13 | 14 | YES 15 | 16 | 17 | 18 | YES 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | YES 23 | 24 | YES 25 | 26 | 27 | YES 28 | 29 | 30 | 31 | YES 32 | 33 | IBFilesOwner 34 | IBCocoaTouchFramework 35 | 36 | 37 | IBFirstResponder 38 | IBCocoaTouchFramework 39 | 40 | 41 | IBCocoaTouchFramework 42 | 43 | 44 | 45 | 1316 46 | 47 | {320, 480} 48 | 49 | 1 50 | MSAxIDEAA 51 | 52 | NO 53 | NO 54 | 55 | IBCocoaTouchFramework 56 | YES 57 | 58 | 59 | 60 | IBCocoaTouchFramework 61 | 62 | 63 | 256 64 | {0, 0} 65 | NO 66 | YES 67 | YES 68 | IBCocoaTouchFramework 69 | 70 | 71 | YES 72 | 73 | 74 | 75 | IBCocoaTouchFramework 76 | 77 | 78 | RootViewController 79 | 80 | IBCocoaTouchFramework 81 | 82 | 83 | 84 | 85 | 86 | 87 | YES 88 | 89 | 90 | delegate 91 | 92 | 93 | 94 | 4 95 | 96 | 97 | 98 | window 99 | 100 | 101 | 102 | 5 103 | 104 | 105 | 106 | navigationController 107 | 108 | 109 | 110 | 15 111 | 112 | 113 | 114 | 115 | YES 116 | 117 | 0 118 | 119 | 120 | 121 | 122 | 123 | 2 124 | 125 | 126 | YES 127 | 128 | 129 | 130 | 131 | -1 132 | 133 | 134 | File's Owner 135 | 136 | 137 | 3 138 | 139 | 140 | 141 | 142 | -2 143 | 144 | 145 | 146 | 147 | 9 148 | 149 | 150 | YES 151 | 152 | 153 | 154 | 155 | 156 | 157 | 11 158 | 159 | 160 | 161 | 162 | 13 163 | 164 | 165 | YES 166 | 167 | 168 | 169 | 170 | 171 | 14 172 | 173 | 174 | 175 | 176 | 177 | 178 | YES 179 | 180 | YES 181 | -1.CustomClassName 182 | -2.CustomClassName 183 | 11.IBPluginDependency 184 | 13.CustomClassName 185 | 13.IBPluginDependency 186 | 2.IBAttributePlaceholdersKey 187 | 2.IBEditorWindowLastContentRect 188 | 2.IBPluginDependency 189 | 3.CustomClassName 190 | 3.IBPluginDependency 191 | 9.IBEditorWindowLastContentRect 192 | 9.IBPluginDependency 193 | 194 | 195 | YES 196 | UIApplication 197 | UIResponder 198 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 199 | RootViewController 200 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 201 | 202 | YES 203 | 204 | 205 | YES 206 | 207 | 208 | {{673, 376}, {320, 480}} 209 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 210 | ImageLoaderAppDelegate 211 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 212 | {{186, 376}, {320, 480}} 213 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 214 | 215 | 216 | 217 | YES 218 | 219 | 220 | YES 221 | 222 | 223 | 224 | 225 | YES 226 | 227 | 228 | YES 229 | 230 | 231 | 232 | 15 233 | 234 | 235 | 236 | YES 237 | 238 | RootViewController 239 | UITableViewController 240 | 241 | IBProjectSource 242 | Classes/RootViewController.h 243 | 244 | 245 | 246 | ImageLoaderAppDelegate 247 | NSObject 248 | 249 | YES 250 | 251 | YES 252 | navigationController 253 | window 254 | 255 | 256 | YES 257 | UINavigationController 258 | UIWindow 259 | 260 | 261 | 262 | IBProjectSource 263 | Classes/ImageLoaderAppDelegate.h 264 | 265 | 266 | 267 | 268 | 0 269 | IBCocoaTouchFramework 270 | 271 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 272 | 273 | 274 | YES 275 | ImageLoader.xcodeproj 276 | 3 277 | 81 278 | 279 | 280 | -------------------------------------------------------------------------------- /Examples/ImageLoader/RootViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1280 5 | 11C74 6 | 1938 7 | 1138.23 8 | 567.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 933 12 | 13 | 14 | YES 15 | IBProxyObject 16 | IBUITableView 17 | 18 | 19 | YES 20 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 21 | 22 | 23 | PluginDependencyRecalculationVersion 24 | 25 | 26 | 27 | YES 28 | 29 | IBFilesOwner 30 | IBCocoaTouchFramework 31 | 32 | 33 | IBFirstResponder 34 | IBCocoaTouchFramework 35 | 36 | 37 | 38 | 274 39 | {320, 247} 40 | 41 | 42 | 43 | 1 44 | MSAxIDEAA 45 | 46 | 1 47 | 48 | 49 | NO 50 | YES 51 | NO 52 | 53 | 3 54 | 3 55 | 56 | IBCocoaTouchFramework 57 | NO 58 | 1 59 | 0 60 | YES 61 | 44 62 | 22 63 | 22 64 | 65 | 66 | 67 | 68 | YES 69 | 70 | 71 | view 72 | 73 | 74 | 75 | 3 76 | 77 | 78 | 79 | dataSource 80 | 81 | 82 | 83 | 4 84 | 85 | 86 | 87 | delegate 88 | 89 | 90 | 91 | 5 92 | 93 | 94 | 95 | 96 | YES 97 | 98 | 0 99 | 100 | YES 101 | 102 | 103 | 104 | 105 | 106 | -1 107 | 108 | 109 | File's Owner 110 | 111 | 112 | -2 113 | 114 | 115 | 116 | 117 | 2 118 | 119 | 120 | 121 | 122 | 123 | 124 | YES 125 | 126 | YES 127 | -1.CustomClassName 128 | -1.IBPluginDependency 129 | -2.CustomClassName 130 | -2.IBPluginDependency 131 | 2.IBPluginDependency 132 | 133 | 134 | YES 135 | RootViewController 136 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 137 | UIResponder 138 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 139 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 140 | 141 | 142 | 143 | YES 144 | 145 | 146 | 147 | 148 | 149 | YES 150 | 151 | 152 | 153 | 154 | 5 155 | 156 | 157 | 158 | YES 159 | 160 | RootViewController 161 | UITableViewController 162 | 163 | loadUnloadImages 164 | id 165 | 166 | 167 | loadUnloadImages 168 | 169 | loadUnloadImages 170 | id 171 | 172 | 173 | 174 | IBProjectSource 175 | ./Classes/RootViewController.h 176 | 177 | 178 | 179 | 180 | 0 181 | IBCocoaTouchFramework 182 | 183 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 184 | 185 | 186 | 187 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 188 | 189 | 190 | YES 191 | 3 192 | 933 193 | 194 | 195 | -------------------------------------------------------------------------------- /Examples/ImageLoader/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) { 12 | 13 | @autoreleasepool { 14 | int retVal = UIApplicationMain(argc, argv, nil, nil); 15 | return retVal; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/Classes/ImageLoaderAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // ImageLoaderAppDelegate.h 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import 10 | 11 | @interface ImageLoaderAppDelegate : NSObject 12 | 13 | @property (nonatomic, strong) IBOutlet UIWindow *window; 14 | @property (nonatomic, strong) IBOutlet UINavigationController *navigationController; 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/Classes/ImageLoaderAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // ImageLoaderAppDelegate.m 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import "ImageLoaderAppDelegate.h" 10 | #import "RootViewController.h" 11 | 12 | 13 | @implementation ImageLoaderAppDelegate 14 | 15 | - (BOOL)application:(__unused UIApplication *)application didFinishLaunchingWithOptions:(__unused NSDictionary *)launchOptions 16 | { 17 | _window.rootViewController = _navigationController; 18 | [_window makeKeyAndVisible]; 19 | return YES; 20 | } 21 | 22 | @end 23 | 24 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/Classes/RootViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RootViewController.h 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import 10 | 11 | @interface RootViewController : UITableViewController 12 | 13 | @property (nonatomic, strong) UIBarButtonItem *loadUnloadButton; 14 | 15 | - (IBAction)loadUnloadImages; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/Classes/RootViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RootViewController.m 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import "RootViewController.h" 10 | #import "RequestQueue.h" 11 | 12 | 13 | @interface RootViewController () 14 | 15 | @property (nonatomic, strong) NSMutableArray *urlStrings; 16 | @property (nonatomic, strong) NSMutableDictionary *images; 17 | @property (nonatomic, strong) NSMutableDictionary *progressStatuses; 18 | 19 | @end 20 | 21 | 22 | @implementation RootViewController 23 | 24 | @synthesize loadUnloadButton; 25 | @synthesize urlStrings; 26 | @synthesize images; 27 | @synthesize progressStatuses; 28 | 29 | #pragma mark View lifecycle 30 | 31 | - (void)viewDidLoad 32 | { 33 | [super viewDidLoad]; 34 | 35 | self.loadUnloadButton = [[UIBarButtonItem alloc] initWithTitle:@"Load" 36 | style:UIBarButtonItemStylePlain 37 | target:self 38 | action:@selector(loadUnloadImages)]; 39 | 40 | self.navigationItem.rightBarButtonItem = loadUnloadButton; 41 | self.navigationItem.title = @"Images"; 42 | } 43 | 44 | - (void)refreshView 45 | { 46 | //refresh table 47 | [self.tableView reloadData]; 48 | 49 | //update button state 50 | if ([[RequestQueue mainQueue] requestCount]) 51 | { 52 | //loading 53 | loadUnloadButton.enabled = NO; 54 | loadUnloadButton.title = @"Wait"; 55 | } 56 | else if ([urlStrings count]) 57 | { 58 | //finished 59 | loadUnloadButton.enabled = YES; 60 | loadUnloadButton.title = @"Clear"; 61 | } 62 | else 63 | { 64 | //idle 65 | loadUnloadButton.enabled = YES; 66 | loadUnloadButton.title = @"Load"; 67 | } 68 | } 69 | 70 | - (void)loadUnloadImages 71 | { 72 | //select action 73 | if ([urlStrings count]) 74 | { 75 | //clear images 76 | self.urlStrings = nil; 77 | self.images = nil; 78 | self.progressStatuses = nil; 79 | 80 | //refresh view 81 | [self refreshView]; 82 | } 83 | else 84 | { 85 | //reset data source 86 | NSString *path = [[NSBundle mainBundle] pathForResource:@"Images" ofType:@"plist"]; 87 | self.urlStrings = [NSMutableArray arrayWithContentsOfFile:path]; 88 | self.images = [NSMutableDictionary dictionary]; 89 | self.progressStatuses = [NSMutableDictionary dictionary]; 90 | [self refreshView]; 91 | 92 | //load images 93 | for (NSString *urlString in urlStrings) 94 | { 95 | //create operation 96 | NSURL *URL = [NSURL URLWithString:urlString]; 97 | NSURLCacheStoragePolicy policy = NSURLCacheStorageNotAllowed; 98 | NSURLRequest *request = [NSURLRequest requestWithURL:URL cachePolicy:policy timeoutInterval:15.0]; 99 | RQOperation *operation = [RQOperation operationWithRequest:request]; 100 | 101 | //completion handler 102 | operation.completionHandler = ^(__unused NSURLResponse *response, NSData *data, NSError *error) { 103 | 104 | if (!error) 105 | { 106 | //image downloaded 107 | UIImage *image = [UIImage imageWithData:data]; 108 | if (image) 109 | { 110 | images[urlString] = image; 111 | } 112 | else 113 | { 114 | //image error 115 | NSInteger index = [urlStrings indexOfObject:urlString]; 116 | urlStrings[index] = @"Image was missing or corrupt"; 117 | } 118 | } 119 | else 120 | { 121 | //loading error 122 | NSInteger index = [urlStrings indexOfObject:urlString]; 123 | urlStrings[index] = [error localizedDescription]; 124 | } 125 | 126 | //refresh view 127 | [self refreshView]; 128 | }; 129 | 130 | //progress handler 131 | operation.downloadProgressHandler = ^(float progress, __unused NSInteger bytesTransferred, __unused NSInteger totalBytes) { 132 | 133 | //update progress 134 | progressStatuses[urlString] = @(progress); 135 | 136 | //refresh view 137 | [self refreshView]; 138 | }; 139 | 140 | //add operation to queue 141 | [[RequestQueue mainQueue] addOperation:operation]; 142 | } 143 | 144 | } 145 | } 146 | 147 | #pragma mark Table view data source 148 | 149 | - (NSInteger)tableView:(__unused UITableView *)tableView numberOfRowsInSection:(__unused NSInteger)section 150 | { 151 | return [urlStrings count]; 152 | } 153 | 154 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 155 | { 156 | static NSString *CellIdentifier = @"Cell"; 157 | 158 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 159 | if (cell == nil) 160 | { 161 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 162 | 163 | UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar]; 164 | progressView.frame = CGRectMake(80.0f, 16.0f, 220.0f, progressView.frame.size.height); 165 | progressView.tag = 99; 166 | [cell addSubview:progressView]; 167 | } 168 | 169 | NSString *urlString = urlStrings[indexPath.row]; 170 | cell.imageView.image = images[urlString]; 171 | UIProgressView *progressView = (UIProgressView *)[cell viewWithTag:99]; 172 | progressView.progress = [progressStatuses[urlString] floatValue]; 173 | 174 | return cell; 175 | } 176 | 177 | #pragma mark Table view delegate 178 | 179 | - (void)tableView:(__unused UITableView *)tableView didSelectRowAtIndexPath:(__unused NSIndexPath *)indexPath 180 | { 181 | //create view controller 182 | UIViewController *viewController = [[UIViewController alloc] init]; 183 | 184 | //set view 185 | NSString *urlString = urlStrings[indexPath.row]; 186 | UIImage *image = images[urlString]; 187 | UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 188 | viewController.view = imageView; 189 | 190 | //pass the selected object to the new view controller. 191 | [self.navigationController pushViewController:viewController animated:YES]; 192 | } 193 | 194 | #pragma mark Memory management 195 | 196 | - (void)viewDidUnload 197 | { 198 | self.loadUnloadButton = nil; 199 | [super viewDidUnload]; 200 | } 201 | 202 | 203 | 204 | @end 205 | 206 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicklockwood/RequestQueue/6a15aeafaccf765d27cf60342ff36ca0766185c6/Examples/ProgressLoader/Default-568h@2x.png -------------------------------------------------------------------------------- /Examples/ProgressLoader/ImageLoader_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'ImageLoader' target in the 'ImageLoader' project 3 | // 4 | #import 5 | 6 | #ifndef __IPHONE_3_0 7 | #warning "This project uses features only available in iPhone SDK 3.0 and later." 8 | #endif 9 | 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/Images.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0351.JPG 6 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0355.JPG 7 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0356.JPG 8 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0357.JPG 9 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0358.JPG 10 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0361.JPG 11 | http://charcoaldesign.co.uk/RequestQueue/Forest/IMG_0362.JPG 12 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0150.jpg 13 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0154.jpg 14 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0163.jpg 15 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0169.jpg 16 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0170.jpg 17 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0173.jpg 18 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0174.jpg 19 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0180.jpg 20 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0181.jpg 21 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0184.jpg 22 | http://charcoaldesign.co.uk/RequestQueue/Lake/IMG_0197.jpg 23 | 24 | 25 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 800 5 | 10D541 6 | 760 7 | 1038.29 8 | 460.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 81 12 | 13 | 14 | YES 15 | 16 | 17 | 18 | YES 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | YES 23 | 24 | YES 25 | 26 | 27 | YES 28 | 29 | 30 | 31 | YES 32 | 33 | IBFilesOwner 34 | IBCocoaTouchFramework 35 | 36 | 37 | IBFirstResponder 38 | IBCocoaTouchFramework 39 | 40 | 41 | IBCocoaTouchFramework 42 | 43 | 44 | 45 | 1316 46 | 47 | {320, 480} 48 | 49 | 1 50 | MSAxIDEAA 51 | 52 | NO 53 | NO 54 | 55 | IBCocoaTouchFramework 56 | YES 57 | 58 | 59 | 60 | IBCocoaTouchFramework 61 | 62 | 63 | 256 64 | {0, 0} 65 | NO 66 | YES 67 | YES 68 | IBCocoaTouchFramework 69 | 70 | 71 | YES 72 | 73 | 74 | 75 | IBCocoaTouchFramework 76 | 77 | 78 | RootViewController 79 | 80 | IBCocoaTouchFramework 81 | 82 | 83 | 84 | 85 | 86 | 87 | YES 88 | 89 | 90 | delegate 91 | 92 | 93 | 94 | 4 95 | 96 | 97 | 98 | window 99 | 100 | 101 | 102 | 5 103 | 104 | 105 | 106 | navigationController 107 | 108 | 109 | 110 | 15 111 | 112 | 113 | 114 | 115 | YES 116 | 117 | 0 118 | 119 | 120 | 121 | 122 | 123 | 2 124 | 125 | 126 | YES 127 | 128 | 129 | 130 | 131 | -1 132 | 133 | 134 | File's Owner 135 | 136 | 137 | 3 138 | 139 | 140 | 141 | 142 | -2 143 | 144 | 145 | 146 | 147 | 9 148 | 149 | 150 | YES 151 | 152 | 153 | 154 | 155 | 156 | 157 | 11 158 | 159 | 160 | 161 | 162 | 13 163 | 164 | 165 | YES 166 | 167 | 168 | 169 | 170 | 171 | 14 172 | 173 | 174 | 175 | 176 | 177 | 178 | YES 179 | 180 | YES 181 | -1.CustomClassName 182 | -2.CustomClassName 183 | 11.IBPluginDependency 184 | 13.CustomClassName 185 | 13.IBPluginDependency 186 | 2.IBAttributePlaceholdersKey 187 | 2.IBEditorWindowLastContentRect 188 | 2.IBPluginDependency 189 | 3.CustomClassName 190 | 3.IBPluginDependency 191 | 9.IBEditorWindowLastContentRect 192 | 9.IBPluginDependency 193 | 194 | 195 | YES 196 | UIApplication 197 | UIResponder 198 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 199 | RootViewController 200 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 201 | 202 | YES 203 | 204 | 205 | YES 206 | 207 | 208 | {{673, 376}, {320, 480}} 209 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 210 | ImageLoaderAppDelegate 211 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 212 | {{186, 376}, {320, 480}} 213 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 214 | 215 | 216 | 217 | YES 218 | 219 | 220 | YES 221 | 222 | 223 | 224 | 225 | YES 226 | 227 | 228 | YES 229 | 230 | 231 | 232 | 15 233 | 234 | 235 | 236 | YES 237 | 238 | RootViewController 239 | UITableViewController 240 | 241 | IBProjectSource 242 | Classes/RootViewController.h 243 | 244 | 245 | 246 | ImageLoaderAppDelegate 247 | NSObject 248 | 249 | YES 250 | 251 | YES 252 | navigationController 253 | window 254 | 255 | 256 | YES 257 | UINavigationController 258 | UIWindow 259 | 260 | 261 | 262 | IBProjectSource 263 | Classes/ImageLoaderAppDelegate.h 264 | 265 | 266 | 267 | 268 | 0 269 | IBCocoaTouchFramework 270 | 271 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 272 | 273 | 274 | YES 275 | ImageLoader.xcodeproj 276 | 3 277 | 81 278 | 279 | 280 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFile 12 | 13 | CFBundleIdentifier 14 | com.yourcompany.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | NSMainNibFile 28 | MainWindow 29 | 30 | 31 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/nick.lockwood.pbxuser: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | 01C29DAA119AEFA6009D0C64 /* ImageLoader.h */ = { 4 | uiCtxt = { 5 | sepNavIntBoundsRect = "{{0, 0}, {795, 494}}"; 6 | sepNavSelRange = "{0, 0}"; 7 | sepNavVisRange = "{0, 681}"; 8 | }; 9 | }; 10 | 01C29DAB119AEFA6009D0C64 /* ImageLoader.m */ = { 11 | uiCtxt = { 12 | sepNavIntBoundsRect = "{{0, 0}, {1167, 1079}}"; 13 | sepNavSelRange = "{717, 1}"; 14 | sepNavVisRange = "{273, 966}"; 15 | }; 16 | }; 17 | 01E9A41211A5280E00AF5133 /* SyncronousLoader.h */ = { 18 | uiCtxt = { 19 | sepNavIntBoundsRect = "{{0, 0}, {795, 471}}"; 20 | sepNavSelRange = "{0, 0}"; 21 | sepNavVisRange = "{0, 257}"; 22 | }; 23 | }; 24 | 01E9A41311A5280E00AF5133 /* SyncronousLoader.m */ = { 25 | uiCtxt = { 26 | sepNavIntBoundsRect = "{{0, 0}, {798, 574}}"; 27 | sepNavSelRange = "{160, 0}"; 28 | sepNavVisRange = "{0, 1158}"; 29 | }; 30 | }; 31 | 01E9A49C11A5397200AF5133 /* SingleThreadedLoader.h */ = { 32 | uiCtxt = { 33 | sepNavIntBoundsRect = "{{0, 0}, {798, 574}}"; 34 | sepNavSelRange = "{0, 0}"; 35 | sepNavVisRange = "{0, 253}"; 36 | }; 37 | }; 38 | 01E9A49D11A5397200AF5133 /* SingleThreadedLoader.m */ = { 39 | uiCtxt = { 40 | sepNavIntBoundsRect = "{{0, 0}, {798, 728}}"; 41 | sepNavSelRange = "{1140, 27}"; 42 | sepNavVisRange = "{133, 1254}"; 43 | }; 44 | }; 45 | 01E9A4B211A5452200AF5133 /* MultiThreadedLoader.h */ = { 46 | uiCtxt = { 47 | sepNavIntBoundsRect = "{{0, 0}, {798, 448}}"; 48 | sepNavSelRange = "{250, 26}"; 49 | sepNavVisRange = "{0, 285}"; 50 | }; 51 | }; 52 | 01E9A4B311A5452200AF5133 /* MultiThreadedLoader.m */ = { 53 | uiCtxt = { 54 | sepNavIntBoundsRect = "{{0, 0}, {698, 819}}"; 55 | sepNavSelRange = "{0, 0}"; 56 | sepNavVisRange = "{0, 1208}"; 57 | }; 58 | }; 59 | 01E9A5A111A56FF000AF5133 /* NSOperationLoader.h */ = { 60 | uiCtxt = { 61 | sepNavIntBoundsRect = "{{0, 0}, {798, 574}}"; 62 | sepNavSelRange = "{287, 0}"; 63 | sepNavVisRange = "{0, 344}"; 64 | }; 65 | }; 66 | 01E9A5A211A56FF000AF5133 /* NSOperationLoader.m */ = { 67 | uiCtxt = { 68 | sepNavIntBoundsRect = "{{0, 0}, {795, 1729}}"; 69 | sepNavSelRange = "{1301, 3}"; 70 | sepNavVisRange = "{582, 838}"; 71 | }; 72 | }; 73 | 01E9A73211A5789600AF5133 /* NSURLConnectionLoader.h */ = { 74 | uiCtxt = { 75 | sepNavIntBoundsRect = "{{0, 0}, {798, 425}}"; 76 | sepNavSelRange = "{0, 0}"; 77 | sepNavVisRange = "{0, 348}"; 78 | }; 79 | }; 80 | 01E9A73311A5789600AF5133 /* NSURLConnectionLoader.m */ = { 81 | uiCtxt = { 82 | sepNavIntBoundsRect = "{{0, 0}, {798, 1235}}"; 83 | sepNavSelRange = "{1362, 15}"; 84 | sepNavVisRange = "{634, 1002}"; 85 | }; 86 | }; 87 | 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */ = { 88 | uiCtxt = { 89 | sepNavIntBoundsRect = "{{0, 0}, {810, 624}}"; 90 | sepNavSelRange = "{0, 0}"; 91 | sepNavVisRange = "{0, 780}"; 92 | }; 93 | }; 94 | 1D6058900D05DD3D006BFB54 /* ImageLoader */ = { 95 | activeExec = 0; 96 | executables = ( 97 | B2DBE92111E60DAF006CC7F5 /* ImageLoader */, 98 | ); 99 | }; 100 | 28C286E00D94DF7D0034E888 /* RootViewController.m */ = { 101 | uiCtxt = { 102 | sepNavIntBoundsRect = "{{0, 0}, {1076, 1846}}"; 103 | sepNavSelRange = "{1494, 30}"; 104 | sepNavVisRange = "{233, 999}"; 105 | }; 106 | }; 107 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 108 | activeBuildConfigurationName = Debug; 109 | activeExecutable = B2DBE92111E60DAF006CC7F5 /* ImageLoader */; 110 | activeSDKPreference = iphonesimulator4.0; 111 | activeTarget = 1D6058900D05DD3D006BFB54 /* ImageLoader */; 112 | addToTargets = ( 113 | 1D6058900D05DD3D006BFB54 /* ImageLoader */, 114 | ); 115 | codeSenseManager = B2DBE92A11E60DCE006CC7F5 /* Code sense */; 116 | executables = ( 117 | B2DBE92111E60DAF006CC7F5 /* ImageLoader */, 118 | ); 119 | perUserDictionary = { 120 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { 121 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 122 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 123 | PBXFileTableDataSourceColumnWidthsKey = ( 124 | 20, 125 | 617, 126 | 20, 127 | 48, 128 | 43, 129 | 43, 130 | 20, 131 | ); 132 | PBXFileTableDataSourceColumnsKey = ( 133 | PBXFileDataSource_FiletypeID, 134 | PBXFileDataSource_Filename_ColumnID, 135 | PBXFileDataSource_Built_ColumnID, 136 | PBXFileDataSource_ObjectSize_ColumnID, 137 | PBXFileDataSource_Errors_ColumnID, 138 | PBXFileDataSource_Warnings_ColumnID, 139 | PBXFileDataSource_Target_ColumnID, 140 | ); 141 | }; 142 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { 143 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; 144 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; 145 | PBXFileTableDataSourceColumnWidthsKey = ( 146 | 20, 147 | 580, 148 | 60, 149 | 20, 150 | 48, 151 | 43, 152 | 43, 153 | ); 154 | PBXFileTableDataSourceColumnsKey = ( 155 | PBXFileDataSource_FiletypeID, 156 | PBXFileDataSource_Filename_ColumnID, 157 | PBXTargetDataSource_PrimaryAttribute, 158 | PBXFileDataSource_Built_ColumnID, 159 | PBXFileDataSource_ObjectSize_ColumnID, 160 | PBXFileDataSource_Errors_ColumnID, 161 | PBXFileDataSource_Warnings_ColumnID, 162 | ); 163 | }; 164 | PBXPerProjectTemplateStateSaveDate = 316025697; 165 | PBXWorkspaceStateSaveDate = 316025697; 166 | }; 167 | perUserProjectItems = { 168 | B26D32BD11F89AF100963471 /* PBXTextBookmark */ = B26D32BD11F89AF100963471 /* PBXTextBookmark */; 169 | B28BB4E4120B0F0C00A31E5A /* PBXTextBookmark */ = B28BB4E4120B0F0C00A31E5A /* PBXTextBookmark */; 170 | B28BB4E5120B0F0C00A31E5A /* PBXTextBookmark */ = B28BB4E5120B0F0C00A31E5A /* PBXTextBookmark */; 171 | B28BB4E6120B0F0C00A31E5A /* PBXTextBookmark */ = B28BB4E6120B0F0C00A31E5A /* PBXTextBookmark */; 172 | B28BB4E7120B0F0C00A31E5A /* PBXTextBookmark */ = B28BB4E7120B0F0C00A31E5A /* PBXTextBookmark */; 173 | B2DBE9C311E62762006CC7F5 /* PBXTextBookmark */ = B2DBE9C311E62762006CC7F5 /* PBXTextBookmark */; 174 | B2DEBA8611F0869100B4E775 /* PBXTextBookmark */ = B2DEBA8611F0869100B4E775 /* PBXTextBookmark */; 175 | B2E332F512D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F512D62BF1000CFCDF /* PBXTextBookmark */; 176 | B2E332F612D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F612D62BF1000CFCDF /* PBXTextBookmark */; 177 | B2E332F712D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F712D62BF1000CFCDF /* PBXTextBookmark */; 178 | B2E332F812D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F812D62BF1000CFCDF /* PBXTextBookmark */; 179 | B2E332F912D62BF1000CFCDF /* PBXTextBookmark */ = B2E332F912D62BF1000CFCDF /* PBXTextBookmark */; 180 | B2E332FA12D62BF1000CFCDF /* PBXTextBookmark */ = B2E332FA12D62BF1000CFCDF /* PBXTextBookmark */; 181 | B2E332FB12D62BF1000CFCDF /* PBXTextBookmark */ = B2E332FB12D62BF1000CFCDF /* PBXTextBookmark */; 182 | B2E332FC12D62BF1000CFCDF /* PBXTextBookmark */ = B2E332FC12D62BF1000CFCDF /* PBXTextBookmark */; 183 | }; 184 | sourceControlManager = B2DBE92911E60DCE006CC7F5 /* Source Control */; 185 | userBuildSettings = { 186 | }; 187 | }; 188 | B26D32BD11F89AF100963471 /* PBXTextBookmark */ = { 189 | isa = PBXTextBookmark; 190 | fRef = 01E9A73311A5789600AF5133 /* NSURLConnectionLoader.m */; 191 | name = "NSURLConnectionLoader.m: 57"; 192 | rLen = 0; 193 | rLoc = 1484; 194 | rType = 0; 195 | vrLen = 1282; 196 | vrLoc = 555; 197 | }; 198 | B28BB4E4120B0F0C00A31E5A /* PBXTextBookmark */ = { 199 | isa = PBXTextBookmark; 200 | fRef = 01E9A41311A5280E00AF5133 /* SyncronousLoader.m */; 201 | name = "SyncronousLoader.m: 9"; 202 | rLen = 0; 203 | rLoc = 160; 204 | rType = 0; 205 | vrLen = 1158; 206 | vrLoc = 0; 207 | }; 208 | B28BB4E5120B0F0C00A31E5A /* PBXTextBookmark */ = { 209 | isa = PBXTextBookmark; 210 | fRef = 01E9A49C11A5397200AF5133 /* SingleThreadedLoader.h */; 211 | name = "SingleThreadedLoader.h: 1"; 212 | rLen = 0; 213 | rLoc = 0; 214 | rType = 0; 215 | vrLen = 253; 216 | vrLoc = 0; 217 | }; 218 | B28BB4E6120B0F0C00A31E5A /* PBXTextBookmark */ = { 219 | isa = PBXTextBookmark; 220 | fRef = 01E9A49D11A5397200AF5133 /* SingleThreadedLoader.m */; 221 | name = "SingleThreadedLoader.m: 42"; 222 | rLen = 27; 223 | rLoc = 1140; 224 | rType = 0; 225 | vrLen = 1254; 226 | vrLoc = 133; 227 | }; 228 | B28BB4E7120B0F0C00A31E5A /* PBXTextBookmark */ = { 229 | isa = PBXTextBookmark; 230 | fRef = 01E9A5A111A56FF000AF5133 /* NSOperationLoader.h */; 231 | name = "NSOperationLoader.h: 15"; 232 | rLen = 0; 233 | rLoc = 287; 234 | rType = 0; 235 | vrLen = 344; 236 | vrLoc = 0; 237 | }; 238 | B2DBE92111E60DAF006CC7F5 /* ImageLoader */ = { 239 | isa = PBXExecutable; 240 | activeArgIndices = ( 241 | ); 242 | argumentStrings = ( 243 | ); 244 | autoAttachOnCrash = 1; 245 | breakpointsEnabled = 0; 246 | configStateDict = { 247 | }; 248 | customDataFormattersEnabled = 1; 249 | dataTipCustomDataFormattersEnabled = 1; 250 | dataTipShowTypeColumn = 1; 251 | dataTipSortType = 0; 252 | debuggerPlugin = GDBDebugging; 253 | disassemblyDisplayState = 0; 254 | dylibVariantSuffix = ""; 255 | enableDebugStr = 1; 256 | environmentEntries = ( 257 | ); 258 | executableSystemSymbolLevel = 0; 259 | executableUserSymbolLevel = 0; 260 | libgmallocEnabled = 0; 261 | name = ImageLoader; 262 | savedGlobals = { 263 | }; 264 | showTypeColumn = 0; 265 | sourceDirectories = ( 266 | ); 267 | }; 268 | B2DBE92911E60DCE006CC7F5 /* Source Control */ = { 269 | isa = PBXSourceControlManager; 270 | fallbackIsa = XCSourceControlManager; 271 | isSCMEnabled = 0; 272 | scmConfiguration = { 273 | repositoryNamesForRoots = { 274 | "" = ""; 275 | }; 276 | }; 277 | }; 278 | B2DBE92A11E60DCE006CC7F5 /* Code sense */ = { 279 | isa = PBXCodeSenseManager; 280 | indexTemplatePath = ""; 281 | }; 282 | B2DBE94311E60FC0006CC7F5 /* BlockLoader.h */ = { 283 | uiCtxt = { 284 | sepNavIntBoundsRect = "{{0, 0}, {663, 569}}"; 285 | sepNavSelRange = "{204, 0}"; 286 | sepNavVisRange = "{0, 346}"; 287 | }; 288 | }; 289 | B2DBE94411E60FC0006CC7F5 /* BlockLoader.m */ = { 290 | uiCtxt = { 291 | sepNavIntBoundsRect = "{{0, 0}, {803, 1001}}"; 292 | sepNavSelRange = "{945, 0}"; 293 | sepNavVisRange = "{199, 1378}"; 294 | }; 295 | }; 296 | B2DBE9C311E62762006CC7F5 /* PBXTextBookmark */ = { 297 | isa = PBXTextBookmark; 298 | fRef = 01E9A4B211A5452200AF5133 /* MultiThreadedLoader.h */; 299 | name = "MultiThreadedLoader.h: 14"; 300 | rLen = 26; 301 | rLoc = 250; 302 | rType = 0; 303 | vrLen = 285; 304 | vrLoc = 0; 305 | }; 306 | B2DEBA8611F0869100B4E775 /* PBXTextBookmark */ = { 307 | isa = PBXTextBookmark; 308 | fRef = 01E9A73211A5789600AF5133 /* NSURLConnectionLoader.h */; 309 | name = "NSURLConnectionLoader.h: 1"; 310 | rLen = 0; 311 | rLoc = 0; 312 | rType = 0; 313 | vrLen = 348; 314 | vrLoc = 0; 315 | }; 316 | B2E332F512D62BF1000CFCDF /* PBXTextBookmark */ = { 317 | isa = PBXTextBookmark; 318 | fRef = 01E9A5A211A56FF000AF5133 /* NSOperationLoader.m */; 319 | name = "NSOperationLoader.m: 53"; 320 | rLen = 3; 321 | rLoc = 1301; 322 | rType = 0; 323 | vrLen = 838; 324 | vrLoc = 582; 325 | }; 326 | B2E332F612D62BF1000CFCDF /* PBXTextBookmark */ = { 327 | isa = PBXTextBookmark; 328 | fRef = B2DBE94411E60FC0006CC7F5 /* BlockLoader.m */; 329 | name = "BlockLoader.m: 36"; 330 | rLen = 0; 331 | rLoc = 945; 332 | rType = 0; 333 | vrLen = 1378; 334 | vrLoc = 199; 335 | }; 336 | B2E332F712D62BF1000CFCDF /* PBXTextBookmark */ = { 337 | isa = PBXTextBookmark; 338 | fRef = 01C29DAA119AEFA6009D0C64 /* ImageLoader.h */; 339 | name = "ImageLoader.h: 1"; 340 | rLen = 0; 341 | rLoc = 0; 342 | rType = 0; 343 | vrLen = 681; 344 | vrLoc = 0; 345 | }; 346 | B2E332F812D62BF1000CFCDF /* PBXTextBookmark */ = { 347 | isa = PBXTextBookmark; 348 | fRef = 01E9A41211A5280E00AF5133 /* SyncronousLoader.h */; 349 | name = "SyncronousLoader.h: 1"; 350 | rLen = 0; 351 | rLoc = 0; 352 | rType = 0; 353 | vrLen = 257; 354 | vrLoc = 0; 355 | }; 356 | B2E332F912D62BF1000CFCDF /* PBXTextBookmark */ = { 357 | isa = PBXTextBookmark; 358 | fRef = 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */; 359 | name = "ImageLoaderAppDelegate.m: 1"; 360 | rLen = 0; 361 | rLoc = 0; 362 | rType = 0; 363 | vrLen = 780; 364 | vrLoc = 0; 365 | }; 366 | B2E332FA12D62BF1000CFCDF /* PBXTextBookmark */ = { 367 | isa = PBXTextBookmark; 368 | fRef = 28C286E00D94DF7D0034E888 /* RootViewController.m */; 369 | name = "RootViewController.m: 63"; 370 | rLen = 30; 371 | rLoc = 1494; 372 | rType = 0; 373 | vrLen = 999; 374 | vrLoc = 233; 375 | }; 376 | B2E332FB12D62BF1000CFCDF /* PBXTextBookmark */ = { 377 | isa = PBXTextBookmark; 378 | fRef = 01C29DAB119AEFA6009D0C64 /* ImageLoader.m */; 379 | name = "ImageLoader.m: 60"; 380 | rLen = 0; 381 | rLoc = 1450; 382 | rType = 0; 383 | vrLen = 1060; 384 | vrLoc = 558; 385 | }; 386 | B2E332FC12D62BF1000CFCDF /* PBXTextBookmark */ = { 387 | isa = PBXTextBookmark; 388 | fRef = 01C29DAB119AEFA6009D0C64 /* ImageLoader.m */; 389 | name = "ImageLoader.m: 32"; 390 | rLen = 1; 391 | rLoc = 717; 392 | rType = 0; 393 | vrLen = 966; 394 | vrLoc = 273; 395 | }; 396 | } 397 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 01E9A41011A5261A00AF5133 /* Images.plist in Resources */ = {isa = PBXBuildFile; fileRef = 01E9A40F11A5261A00AF5133 /* Images.plist */; }; 11 | 01FDC2A916811B48001E49A6 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 01FDC2A816811B48001E49A6 /* Default-568h@2x.png */; }; 12 | 1D3623260D0F684500981E51 /* ImageLoaderAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */; }; 13 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 14 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 15 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 16 | 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */; }; 17 | 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD735F0D9D9599002E5188 /* MainWindow.xib */; }; 18 | 28C286E10D94DF7D0034E888 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28C286E00D94DF7D0034E888 /* RootViewController.m */; }; 19 | 28F335F11007B36200424DE2 /* RootViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28F335F01007B36200424DE2 /* RootViewController.xib */; }; 20 | B21F427814C6DFE400A39BFD /* RequestQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = B21F427714C6DFE400A39BFD /* RequestQueue.m */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXFileReference section */ 24 | 01E9A40F11A5261A00AF5133 /* Images.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Images.plist; sourceTree = ""; }; 25 | 01FDC2A816811B48001E49A6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 26 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 27 | 1D3623240D0F684500981E51 /* ImageLoaderAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = ImageLoaderAppDelegate.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 28 | 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ImageLoaderAppDelegate.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 29 | 1D6058910D05DD3D006BFB54 /* ProgressLoader.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ProgressLoader.app; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 31 | 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 32 | 28A0AAE50D9B0CCF005BE974 /* ImageLoader_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageLoader_Prefix.pch; sourceTree = ""; }; 33 | 28AD735F0D9D9599002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 34 | 28C286DF0D94DF7D0034E888 /* RootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = RootViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 35 | 28C286E00D94DF7D0034E888 /* RootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = RootViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 36 | 28F335F01007B36200424DE2 /* RootViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RootViewController.xib; sourceTree = ""; }; 37 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = main.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 38 | 8D1107310486CEB800E47090 /* ProgressLoader-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "ProgressLoader-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 39 | B21F427614C6DFE400A39BFD /* RequestQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RequestQueue.h; sourceTree = ""; }; 40 | B21F427714C6DFE400A39BFD /* RequestQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RequestQueue.m; sourceTree = ""; }; 41 | /* End PBXFileReference section */ 42 | 43 | /* Begin PBXFrameworksBuildPhase section */ 44 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 45 | isa = PBXFrameworksBuildPhase; 46 | buildActionMask = 2147483647; 47 | files = ( 48 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 49 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 50 | 2892E4100DC94CBA00A64D0F /* CoreGraphics.framework in Frameworks */, 51 | ); 52 | runOnlyForDeploymentPostprocessing = 0; 53 | }; 54 | /* End PBXFrameworksBuildPhase section */ 55 | 56 | /* Begin PBXGroup section */ 57 | 080E96DDFE201D6D7F000001 /* Classes */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | 1D3623240D0F684500981E51 /* ImageLoaderAppDelegate.h */, 61 | 1D3623250D0F684500981E51 /* ImageLoaderAppDelegate.m */, 62 | 28C286DF0D94DF7D0034E888 /* RootViewController.h */, 63 | 28C286E00D94DF7D0034E888 /* RootViewController.m */, 64 | ); 65 | path = Classes; 66 | sourceTree = ""; 67 | }; 68 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 1D6058910D05DD3D006BFB54 /* ProgressLoader.app */, 72 | ); 73 | name = Products; 74 | sourceTree = ""; 75 | }; 76 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | B21F427514C6DFE400A39BFD /* RequestQueue */, 80 | 080E96DDFE201D6D7F000001 /* Classes */, 81 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 82 | 29B97317FDCFA39411CA2CEA /* Resources */, 83 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 84 | 19C28FACFE9D520D11CA2CBB /* Products */, 85 | ); 86 | name = CustomTemplate; 87 | sourceTree = ""; 88 | }; 89 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 28A0AAE50D9B0CCF005BE974 /* ImageLoader_Prefix.pch */, 93 | 29B97316FDCFA39411CA2CEA /* main.m */, 94 | ); 95 | name = "Other Sources"; 96 | sourceTree = ""; 97 | }; 98 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 01FDC2A816811B48001E49A6 /* Default-568h@2x.png */, 102 | 28F335F01007B36200424DE2 /* RootViewController.xib */, 103 | 28AD735F0D9D9599002E5188 /* MainWindow.xib */, 104 | 8D1107310486CEB800E47090 /* ProgressLoader-Info.plist */, 105 | 01E9A40F11A5261A00AF5133 /* Images.plist */, 106 | ); 107 | name = Resources; 108 | sourceTree = ""; 109 | }; 110 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 114 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 115 | 2892E40F0DC94CBA00A64D0F /* CoreGraphics.framework */, 116 | ); 117 | name = Frameworks; 118 | sourceTree = ""; 119 | }; 120 | B21F427514C6DFE400A39BFD /* RequestQueue */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | B21F427614C6DFE400A39BFD /* RequestQueue.h */, 124 | B21F427714C6DFE400A39BFD /* RequestQueue.m */, 125 | ); 126 | name = RequestQueue; 127 | path = ../../RequestQueue; 128 | sourceTree = ""; 129 | }; 130 | /* End PBXGroup section */ 131 | 132 | /* Begin PBXNativeTarget section */ 133 | 1D6058900D05DD3D006BFB54 /* ProgressLoader */ = { 134 | isa = PBXNativeTarget; 135 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "ProgressLoader" */; 136 | buildPhases = ( 137 | 1D60588D0D05DD3D006BFB54 /* Resources */, 138 | 1D60588E0D05DD3D006BFB54 /* Sources */, 139 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 140 | ); 141 | buildRules = ( 142 | ); 143 | dependencies = ( 144 | ); 145 | name = ProgressLoader; 146 | productName = ImageLoader; 147 | productReference = 1D6058910D05DD3D006BFB54 /* ProgressLoader.app */; 148 | productType = "com.apple.product-type.application"; 149 | }; 150 | /* End PBXNativeTarget section */ 151 | 152 | /* Begin PBXProject section */ 153 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 154 | isa = PBXProject; 155 | attributes = { 156 | LastUpgradeCheck = 0500; 157 | }; 158 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ProgressLoader" */; 159 | compatibilityVersion = "Xcode 3.2"; 160 | developmentRegion = English; 161 | hasScannedForEncodings = 1; 162 | knownRegions = ( 163 | English, 164 | Japanese, 165 | French, 166 | German, 167 | en, 168 | ); 169 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 170 | projectDirPath = ""; 171 | projectRoot = ""; 172 | targets = ( 173 | 1D6058900D05DD3D006BFB54 /* ProgressLoader */, 174 | ); 175 | }; 176 | /* End PBXProject section */ 177 | 178 | /* Begin PBXResourcesBuildPhase section */ 179 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 180 | isa = PBXResourcesBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | 28AD73600D9D9599002E5188 /* MainWindow.xib in Resources */, 184 | 28F335F11007B36200424DE2 /* RootViewController.xib in Resources */, 185 | 01E9A41011A5261A00AF5133 /* Images.plist in Resources */, 186 | 01FDC2A916811B48001E49A6 /* Default-568h@2x.png in Resources */, 187 | ); 188 | runOnlyForDeploymentPostprocessing = 0; 189 | }; 190 | /* End PBXResourcesBuildPhase section */ 191 | 192 | /* Begin PBXSourcesBuildPhase section */ 193 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 194 | isa = PBXSourcesBuildPhase; 195 | buildActionMask = 2147483647; 196 | files = ( 197 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 198 | 1D3623260D0F684500981E51 /* ImageLoaderAppDelegate.m in Sources */, 199 | 28C286E10D94DF7D0034E888 /* RootViewController.m in Sources */, 200 | B21F427814C6DFE400A39BFD /* RequestQueue.m in Sources */, 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | }; 204 | /* End PBXSourcesBuildPhase section */ 205 | 206 | /* Begin XCBuildConfiguration section */ 207 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 208 | isa = XCBuildConfiguration; 209 | buildSettings = { 210 | ALWAYS_SEARCH_USER_PATHS = NO; 211 | CLANG_ENABLE_OBJC_ARC = YES; 212 | COPY_PHASE_STRIP = NO; 213 | GCC_DYNAMIC_NO_PIC = NO; 214 | GCC_OPTIMIZATION_LEVEL = 0; 215 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 216 | GCC_PREFIX_HEADER = ImageLoader_Prefix.pch; 217 | INFOPLIST_FILE = "ProgressLoader-Info.plist"; 218 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 219 | PRODUCT_NAME = ProgressLoader; 220 | SDKROOT = iphoneos; 221 | TARGETED_DEVICE_FAMILY = 1; 222 | }; 223 | name = Debug; 224 | }; 225 | 1D6058950D05DD3E006BFB54 /* Release */ = { 226 | isa = XCBuildConfiguration; 227 | buildSettings = { 228 | ALWAYS_SEARCH_USER_PATHS = NO; 229 | CLANG_ENABLE_OBJC_ARC = YES; 230 | COPY_PHASE_STRIP = YES; 231 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 232 | GCC_PREFIX_HEADER = ImageLoader_Prefix.pch; 233 | INFOPLIST_FILE = "ProgressLoader-Info.plist"; 234 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 235 | PRODUCT_NAME = ProgressLoader; 236 | SDKROOT = iphoneos; 237 | TARGETED_DEVICE_FAMILY = 1; 238 | VALIDATE_PRODUCT = YES; 239 | }; 240 | name = Release; 241 | }; 242 | C01FCF4F08A954540054247B /* Debug */ = { 243 | isa = XCBuildConfiguration; 244 | buildSettings = { 245 | CLANG_WARN_OBJCPP_ARC_ABI = YES; 246 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 247 | GCC_C_LANGUAGE_STANDARD = c99; 248 | GCC_TREAT_WARNINGS_AS_ERRORS = YES; 249 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 250 | GCC_WARN_UNUSED_VARIABLE = YES; 251 | ONLY_ACTIVE_ARCH = YES; 252 | RUN_CLANG_STATIC_ANALYZER = YES; 253 | SDKROOT = iphoneos; 254 | WARNING_CFLAGS = ( 255 | "-Wall", 256 | "-Wextra", 257 | ); 258 | }; 259 | name = Debug; 260 | }; 261 | C01FCF5008A954540054247B /* Release */ = { 262 | isa = XCBuildConfiguration; 263 | buildSettings = { 264 | CLANG_WARN_OBJCPP_ARC_ABI = YES; 265 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 266 | GCC_C_LANGUAGE_STANDARD = c99; 267 | GCC_TREAT_WARNINGS_AS_ERRORS = YES; 268 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 269 | GCC_WARN_UNUSED_VARIABLE = YES; 270 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 271 | RUN_CLANG_STATIC_ANALYZER = YES; 272 | SDKROOT = iphoneos; 273 | WARNING_CFLAGS = ( 274 | "-Wall", 275 | "-Wextra", 276 | ); 277 | }; 278 | name = Release; 279 | }; 280 | /* End XCBuildConfiguration section */ 281 | 282 | /* Begin XCConfigurationList section */ 283 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "ProgressLoader" */ = { 284 | isa = XCConfigurationList; 285 | buildConfigurations = ( 286 | 1D6058940D05DD3E006BFB54 /* Debug */, 287 | 1D6058950D05DD3E006BFB54 /* Release */, 288 | ); 289 | defaultConfigurationIsVisible = 0; 290 | defaultConfigurationName = Release; 291 | }; 292 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ProgressLoader" */ = { 293 | isa = XCConfigurationList; 294 | buildConfigurations = ( 295 | C01FCF4F08A954540054247B /* Debug */, 296 | C01FCF5008A954540054247B /* Release */, 297 | ); 298 | defaultConfigurationIsVisible = 0; 299 | defaultConfigurationName = Release; 300 | }; 301 | /* End XCConfigurationList section */ 302 | }; 303 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 304 | } 305 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/project.xcworkspace/xcuserdata/nick.lockwood.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceUserSettings_BuildLocationStyle 6 | 0 7 | IDEWorkspaceUserSettings_BuildSubfolderNameStyle 8 | 0 9 | IDEWorkspaceUserSettings_DerivedDataLocationStyle 10 | 0 11 | IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 12 | 13 | IDEWorkspaceUserSettings_IssueFilterStyle 14 | 0 15 | IDEWorkspaceUserSettings_LiveSourceIssuesEnabled 16 | 17 | IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges 18 | 19 | IDEWorkspaceUserSettings_SnapshotLocationStyle 20 | 0 21 | 22 | 23 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/project.xcworkspace/xcuserdata/nick.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/xcshareddata/xcschemes/ProgressLoader.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/xcuserdata/nick.lockwood.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/xcuserdata/nick.lockwood.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ProgressLoader.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1D6058900D05DD3D006BFB54 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/xcuserdata/nick.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/ProgressLoader.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | SuppressBuildableAutocreation 8 | 9 | 1D6058900D05DD3D006BFB54 10 | 11 | primary 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/RootViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1280 5 | 11C74 6 | 1938 7 | 1138.23 8 | 567.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 933 12 | 13 | 14 | YES 15 | IBProxyObject 16 | IBUITableView 17 | 18 | 19 | YES 20 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 21 | 22 | 23 | PluginDependencyRecalculationVersion 24 | 25 | 26 | 27 | YES 28 | 29 | IBFilesOwner 30 | IBCocoaTouchFramework 31 | 32 | 33 | IBFirstResponder 34 | IBCocoaTouchFramework 35 | 36 | 37 | 38 | 274 39 | {320, 247} 40 | 41 | 42 | 43 | 1 44 | MSAxIDEAA 45 | 46 | 1 47 | 48 | 49 | NO 50 | YES 51 | NO 52 | 53 | 3 54 | 3 55 | 56 | IBCocoaTouchFramework 57 | NO 58 | 1 59 | 0 60 | YES 61 | 44 62 | 22 63 | 22 64 | 65 | 66 | 67 | 68 | YES 69 | 70 | 71 | view 72 | 73 | 74 | 75 | 3 76 | 77 | 78 | 79 | dataSource 80 | 81 | 82 | 83 | 4 84 | 85 | 86 | 87 | delegate 88 | 89 | 90 | 91 | 5 92 | 93 | 94 | 95 | 96 | YES 97 | 98 | 0 99 | 100 | YES 101 | 102 | 103 | 104 | 105 | 106 | -1 107 | 108 | 109 | File's Owner 110 | 111 | 112 | -2 113 | 114 | 115 | 116 | 117 | 2 118 | 119 | 120 | 121 | 122 | 123 | 124 | YES 125 | 126 | YES 127 | -1.CustomClassName 128 | -1.IBPluginDependency 129 | -2.CustomClassName 130 | -2.IBPluginDependency 131 | 2.IBPluginDependency 132 | 133 | 134 | YES 135 | RootViewController 136 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 137 | UIResponder 138 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 139 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 140 | 141 | 142 | 143 | YES 144 | 145 | 146 | 147 | 148 | 149 | YES 150 | 151 | 152 | 153 | 154 | 5 155 | 156 | 157 | 158 | YES 159 | 160 | RootViewController 161 | UITableViewController 162 | 163 | loadUnloadImages 164 | id 165 | 166 | 167 | loadUnloadImages 168 | 169 | loadUnloadImages 170 | id 171 | 172 | 173 | 174 | IBProjectSource 175 | ./Classes/RootViewController.h 176 | 177 | 178 | 179 | 180 | 0 181 | IBCocoaTouchFramework 182 | 183 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 184 | 185 | 186 | 187 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 188 | 189 | 190 | YES 191 | 3 192 | 933 193 | 194 | 195 | -------------------------------------------------------------------------------- /Examples/ProgressLoader/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ImageLoader 4 | // 5 | // Created by Nick Lockwood on 18/01/2012. 6 | // Copyright Charcoal Design 2012 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, char *argv[]) { 12 | 13 | @autoreleasepool { 14 | int retVal = UIApplicationMain(argc, argv, nil, nil); 15 | return retVal; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /LICENCE.md: -------------------------------------------------------------------------------- 1 | RequestQueue 2 | 3 | Version 1.5.4, October 1st, 2014 4 | 5 | Copyright (C) 2012 Charcoal Design 6 | 7 | This software is provided 'as-is', without any express or implied 8 | warranty. In no event will the authors be held liable for any damages 9 | arising from the use of this software. 10 | 11 | Permission is granted to anyone to use this software for any purpose, 12 | including commercial applications, and to alter it and redistribute it 13 | freely, subject to the following restrictions: 14 | 15 | 1. The origin of this software must not be misrepresented; you must not 16 | claim that you wrote the original software. If you use this software 17 | in a product, an acknowledgment in the product documentation would be 18 | appreciated but is not required. 19 | 20 | 2. Altered source versions must be plainly marked as such, and must not be 21 | misrepresented as being the original software. 22 | 23 | 3. This notice may not be removed or altered from any source distribution. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | *************** 2 | WARNING: THIS PROJECT IS DEPRECATED 3 | ==================================== 4 | It will not receive any future updates or bug fixes. If you are using it, please migrate to another solution. 5 | *************** 6 | 7 | 8 | Purpose 9 | -------------- 10 | 11 | RequestQueue is a simple class for managing multiple concurrent asynchronous URL requests in your applications. 12 | 13 | 14 | Supported OS & SDK Versions 15 | ----------------------------- 16 | 17 | * Supported build target - iOS 8.0 / Mac OS 10.9 (Xcode 6.0, Apple LLVM compiler 6.0) 18 | * Earliest supported deployment target - iOS 5.0 / Mac OS 10.8 19 | * Earliest compatible deployment target - iOS 4.3 / Mac OS 10.7 20 | 21 | NOTE: 'Supported' means that the library has been tested with this version. 'Compatible' means that the library should work on this OS version (i.e. it doesn't rely on any unavailable SDK features) but is no longer being tested for compatibility and may require tweaking or bug fixes to run correctly. 22 | 23 | 24 | ARC Compatibility 25 | ------------------ 26 | 27 | As of version 1.5, RequestQueue requires ARC. If you wish to use RequestQueue in a non-ARC project, just add the -fobjc-arc compiler flag to the RequestQueue.m class. To do this, go to the Build Phases tab in your target settings, open the Compile Sources group, double-click RequestQueue.m in the list and type -fobjc-arc into the popover. 28 | 29 | If you wish to convert your whole project to ARC, comment out the #error line in RequestQueue.m, then run the Edit > Refactor > Convert to Objective-C ARC... tool in Xcode and make sure all files that you wish to use ARC for (including RequestQueue.m) are checked. 30 | 31 | 32 | Thread Safety 33 | -------------- 34 | 35 | You can create RQOperation and RequestQueue instances on any thread, but the methods of each instance should only be called from a single thread. Additionally, the mainQueue shared instance should only be used on the main thread. 36 | 37 | 38 | Installation 39 | -------------- 40 | 41 | To use RequestQueue in an app, just drag the RequestQueue class files into your project. RequestQueue has no dependencies. 42 | 43 | 44 | Classes 45 | ----------- 46 | 47 | The RequestQueue library consists of two main classes, the RQOperation and the RequestQueue itself. 48 | 49 | The RQOperation is an NSOperation subclass that wraps a single, asynchronous NSURLConnection. You can use the RQOperation on its own to make a standalone asynchronous request, or you can add it to any ordinary NSOperationQueue. 50 | 51 | The RequestQueue simplifies managing a queue of RQOperations and allows for features that are not possible with an ordinary NSOperationQueue, such as LIFO (Last-In, First-Out) queueing (see below for details). 52 | 53 | 54 | RQOperation Properties 55 | ---------------------------- 56 | 57 | @property (nonatomic, strong, readonly) NSURLRequest *request; 58 | 59 | The original NSURLRequest used to initialise the operation. This is deep-copied by the NSURLConnection, so making changes to this request after creating the RQOperation will have no effect on the RQOperation, however it can be useful to retain a reference to it for the purposes of identifying the RQOperation later on. 60 | 61 | @property (nonatomic, copy) RQCompletionHandler completionHandler; 62 | 63 | This is a block that will be called when the request either completes, fails or is cancelled. For details of the callback parameters, check the Callbacks section below. 64 | 65 | @property (nonatomic, copy) RQProgressHandler uploadProgressHandler; 66 | 67 | This is a block that will be called periodically as upload data is sent by the NSURLConnection. This is mainly useful when transmitting large files to a server where you would wish to display a progress bar, and is generally not applicable for most requests. For details of the callback parameters, check the Callbacks section below. 68 | 69 | @property (nonatomic, copy) RQProgressHandler downloadProgressHandler; 70 | 71 | This is a block that will be called periodically as data is downloaded by the NSURLConnection. This is mainly useful when downloading large files from a server where you would wish to display a progress bar. For details of the callback parameters, check the Callbacks section below. 72 | 73 | @property (nonatomic, copy) RQAuthenticationChallengeHandler authenticationChallengeHandler; 74 | 75 | This is a block that will be called in the event of the server returning an authentication challenge. 76 | 77 | @property (nonatomic, copy) NSSet *autoRetryErrorCodes; 78 | 79 | A set of error codes to compare against when deciding if the request should automatically retry or not. By default this set includes any NSURLError types that relate to poor or unavailable connections. This means that the operation will retry if the Internet is down or the connection times out, but won't retry if the UL is malformed or the resource doesn't exist (which would be pointless). You can customise this set to meet the specific needs of your application if required. 80 | 81 | @property (nonatomic) NSTimeInterval autoRetryDelay; 82 | 83 | If autoRetry is enabled, this is the delay before the request will be retried after a failed connection. Defaults to 5 seconds. 84 | 85 | @property (nonatomic) BOOL autoRetry; 86 | 87 | If set to `YES`, the operation will automatically retry if there is a connection failure instead of terminating and calling the completionHandler. The operation will compare the error code against the autoRetryErrorCodes set, and will only retry if the code is in that set. Defaults to `NO`. 88 | 89 | 90 | RQOperation Methods 91 | ---------------------------- 92 | 93 | + (RQOperation *)operationWithRequest:(NSURLRequest *)request; 94 | - (RQOperation *)initWithRequest:(NSURLRequest *)request; 95 | 96 | These methods are used to create a new request operation. RQOperations are single-use, meaning that the request cannot be changed after the operation is created, and the operation can only be used to send a single instance of the request, after which is should be discarded. 97 | 98 | 99 | RequestQueue Properties 100 | ------------------------- 101 | 102 | @property (nonatomic) NSUInteger maxConcurrentRequestCount; 103 | 104 | This is the maximum number of concurrent requests. If more requests than this are added to the queue, they will be queued until the previous requests have completed. A value of 0 means that there is no limit to the number of concurrent requests. A value of 1 means that only one request will be active at a time, and will ensure that requests are completed in the same order that they are added (assuming `queueMode` is `RequestQueueModeFirstInFirstOut`). The default value is 2. 105 | 106 | @property (nonatomic, getter = isSuspended) BOOL suspended; 107 | 108 | This property toggles whether the queued requests should be started or not. Requests that are already in progress will not be affected by toggling this property, but if suspended = YES, no new requests will be started until it is set to NO again. Setting this property to NO will immediately start the next queued requests downloading. 109 | 110 | @property (nonatomic, readonly) NSUInteger requestCount; 111 | 112 | The number of requests in the queue. This includes both active requests and pending requests. 113 | 114 | @property (nonatomic, copy, readonly) NSArray *requests; 115 | 116 | The requests in the queue. This includes both active requests and pending requests. 117 | 118 | @property (nonatomic) RequestQueueMode queueMode; 119 | 120 | The queueMode property controls whether new request are added at the front or the back of the queue. The default value of `RequestQueueModeFirstInFirstOut` puts new requests at the back of the queue and the `RequestQueueModeLastInFirstOut` value puts them at the front. Last-in-first-out means that the more recent request is given priority. Requests that are already active will still finish first, but if a large backlog of requests builds up in the queue, newer requests will not be forced to wait until the backlog is cleared before they are dealt with. 121 | 122 | @property (nonatomic) BOOL allowDuplicateRequests; 123 | 124 | This property controls whether the request queue allows multiple identical requests to be queued. If set to `NO` (the default), adding a duplicate request (i.e. a request with identical parameters to another request already in the queue) will result in the previously added request being cancelled. The completion handler for the cancelled request will be called with the NSURLErrorCancelled error as normal. 125 | 126 | 127 | RequestQueue Methods 128 | ---------------------- 129 | 130 | The RequestQueue class has the following methods: 131 | 132 | + (RequestQueue *)mainQueue; 133 | 134 | This returns a singleton shared instance of the request queue that can be used anywhere in your app (not thread safe, should only be called from the main thread). It is also perfectly acceptable to create your own queue instance for more finely-grained control over concurrency (for example, you could create a low-priority queue instance and a high priority queue so that your app can perform high-priority requests without them getting stuck behind a low priority request, waiting for it to finish). 135 | 136 | - (void)addOperation:(RQOperation *)operation; 137 | 138 | This adds a new RQOperation to the queue. If there are fewer than `maxConcurrentRequestCount` operations already in the queue, this will start immediately. It is not valid to add the same RQOperation to the queue more than once (this will throw an exception), however you can add the same request to a given queue multiple times using different RQOperation instances. Note that although RQOperations are initiated in the order in which they were added (first in, first out), there is no guarantee that they will complete in the same order, unless the `maxConcurrentRequestCount` is set to 1. 139 | 140 | - (void)addRequest:(NSURLRequest *)request completionHandler:(RQCompletionHandler)completionHandler; 141 | 142 | This creates a new RQOperation with the specified completion handler and adds it to the queue. Note that the same request can be added to the queue multiple times and will be downloaded multiple times. If you want to avoid adding identical requests to the queue more than once, check if the `requests` property of the queue already contains an identical request before adding it by using the `contains:` method of NSArray. 143 | 144 | - (void)cancelRequest:(NSURLRequest *)request; 145 | 146 | This method will cancel the request if it is in progress and remove it from the queue. Regardless of whether the request has started or not, the completion handler block will receive the error `NSURLErrorCancelled`. *Note:* To cancel an RQOperation, you can just call the cancel method of the operation directly and it will automatically be removed from any queue to which it has been added. 147 | 148 | - (void)cancelAllRequests; 149 | 150 | This method will cancel all active and queued requests and remove them from the queue. 151 | 152 | 153 | Callbacks 154 | ------------ 155 | 156 | RequestQueue defines the following callback block functions that you can use to be notified about the request status and progress. 157 | 158 | typedef void (^RQCompletionHandler)(NSURLResponse *response, NSData *data, NSError *error); 159 | 160 | Upon completion of a request download, your callback will be called with these arguments. If the request was successful, the error parameter will be nil. In the event of an error, response and data may be nil or may not, depending on the nature of the error. If the request was cancelled, the error code will be `NSURLErrorCancelled`. 161 | 162 | typedef void (^RQProgressHandler)(float progress, NSInteger bytesTransferred, NSInteger totalBytes); 163 | 164 | This callback is used to track the progress of a request upload or download. The progress parameter is a floating point value between 0.0 and 1.0, useful for updating a progress bar or other visual progress indicator. The bytesTransferred and totalBytes parameters indicate the number of bytes that have been transferred and the expected total number of bytes to be transferred, respectively. Note: totalBytes is often an estimate and may sometimes be incorrect, or unavailable (in which case the value may be zero or -1). In these cases, the progress value is meaningless, and you should display an indeterminate progress indicator such as a spinner (UIActivityIndicatorView) or barber pole. 165 | 166 | 167 | Release Notes 168 | ---------------- 169 | 170 | Version 1.5.4 171 | 172 | - Fixed warnings in Xcode 6 173 | 174 | Version 1.5.3 175 | 176 | - Fixed conversion warnings under arm64 177 | - Now conforms to -Weverything warning level 178 | 179 | Version 1.5.2 180 | 181 | - Fixed KVO error 182 | - Now conforms to -Wextra warning level 183 | - Added Podspec 184 | 185 | Version 1.5.1 186 | 187 | - Fixed a potential issue where cancelling a request during the autoRetry delay period would not work correctly 188 | 189 | Version 1.5 190 | 191 | - Now requires ARC (see README for details) 192 | - Fixed bug that prevented autoRetry from working correctly 193 | - You can now specify the autoRetry delay period 194 | 195 | Version 1.4.1 196 | 197 | - Fixed issue where RQOperation would not work if added to NSOperationQueue other than mainQueue 198 | - Updated ARC Helper library 199 | 200 | Version 1.4 201 | 202 | - HTTP status codes >= 400 are now treated as errors 203 | - Added RQAuthenticationChallengeHandler for handling HTTP basic auth 204 | - Renamed RequestOperation to RQOperation 205 | - Name-spaced the request handler block function signatures 206 | - Added BasicAuth example project 207 | 208 | Version 1.3 209 | 210 | - Added `autoRetry` property to RequestOperation class 211 | - Added `allowDuplicateRequests` property to RequestQueue class 212 | - If a duplicate request is added to the queue, the previous duplicate is now cancelled by default 213 | 214 | Version 1.2 215 | 216 | - Major internal rewrite using NSOperations 217 | - Added new RequestOperation class for individual requests 218 | - Added upload and download progress callbacks 219 | - Renamed all instances of 'Connection' to 'Request' for consistency 220 | - Fixed leak of finished requests 221 | - Simplified image loader example 222 | - Added progress loader example 223 | 224 | Version 1.1.1 225 | 226 | - Now handles case where expectedContentLength returns -1 227 | 228 | Version 1.1 229 | 230 | - Added mode property to control queuing 231 | - Fixed some memory leaks when not running under ARC 232 | - Eliminated analyzer warnings 233 | 234 | Version 1.0 235 | 236 | - Initial release 237 | -------------------------------------------------------------------------------- /RequestQueue.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "RequestQueue", 3 | "version": "1.5.4", 4 | "license": "zlib", 5 | "summary": "RequestQueue is a simple class for managing multiple concurrent asynchronous URL requests in your applications.", 6 | "homepage": "https://github.com/nicklockwood/RequestQueue.git", 7 | "authors": { 8 | "nicklockwood": "support@charcoaldesign.co.uk" 9 | }, 10 | "source": { 11 | "git": "https://github.com/nicklockwood/RequestQueue.git", 12 | "tag": "1.5.4" 13 | }, 14 | "source_files": "RequestQueue", 15 | "requires_arc": true, 16 | "platforms": { 17 | "ios": "4.3", 18 | "osx": "10.6" 19 | } 20 | } -------------------------------------------------------------------------------- /RequestQueue/RequestQueue.h: -------------------------------------------------------------------------------- 1 | // 2 | // RequestQueue.h 3 | // 4 | // Version 1.5.4 5 | // 6 | // Created by Nick Lockwood on 22/12/2011. 7 | // Copyright (C) 2011 Charcoal Design 8 | // 9 | // Distributed under the permissive zlib License 10 | // Get the latest version from here: 11 | // 12 | // https://github.com/nicklockwood/RequestQueue 13 | // 14 | // This software is provided 'as-is', without any express or implied 15 | // warranty. In no event will the authors be held liable for any damages 16 | // arising from the use of this software. 17 | // 18 | // Permission is granted to anyone to use this software for any purpose, 19 | // including commercial applications, and to alter it and redistribute it 20 | // freely, subject to the following restrictions: 21 | // 22 | // 1. The origin of this software must not be misrepresented; you must not 23 | // claim that you wrote the original software. If you use this software 24 | // in a product, an acknowledgment in the product documentation would be 25 | // appreciated but is not required. 26 | // 27 | // 2. Altered source versions must be plainly marked as such, and must not be 28 | // misrepresented as being the original software. 29 | // 30 | // 3. This notice may not be removed or altered from any source distribution. 31 | // 32 | 33 | 34 | #pragma GCC diagnostic push 35 | #pragma GCC diagnostic ignored "-Wobjc-missing-property-synthesis" 36 | #import 37 | 38 | 39 | extern NSString *const HTTPResponseErrorDomain; 40 | 41 | 42 | typedef void (^RQCompletionHandler)(NSURLResponse *response, NSData *data, NSError *error); 43 | typedef void (^RQProgressHandler)(float progress, NSInteger bytesTransferred, NSInteger totalBytes); 44 | typedef void (^RQAuthenticationChallengeHandler)(NSURLAuthenticationChallenge *challenge); 45 | 46 | 47 | typedef enum 48 | { 49 | RequestQueueModeFirstInFirstOut = 0, 50 | RequestQueueModeLastInFirstOut 51 | } 52 | RequestQueueMode; 53 | 54 | 55 | @interface RQOperation : NSOperation 56 | 57 | @property (nonatomic, readonly) NSURLRequest *request; 58 | @property (nonatomic, copy) RQCompletionHandler completionHandler; 59 | @property (nonatomic, copy) RQProgressHandler uploadProgressHandler; 60 | @property (nonatomic, copy) RQProgressHandler downloadProgressHandler; 61 | @property (nonatomic, copy) RQAuthenticationChallengeHandler authenticationChallengeHandler; 62 | @property (nonatomic, copy) NSSet *autoRetryErrorCodes; 63 | @property (nonatomic) NSTimeInterval autoRetryDelay; 64 | @property (nonatomic) BOOL autoRetry; 65 | 66 | + (instancetype)operationWithRequest:(NSURLRequest *)request; 67 | - (instancetype)initWithRequest:(NSURLRequest *)request; 68 | 69 | @end 70 | 71 | 72 | @interface RequestQueue : NSObject 73 | 74 | @property (nonatomic) NSUInteger maxConcurrentRequestCount; 75 | @property (nonatomic, getter = isSuspended) BOOL suspended; 76 | @property (nonatomic, readonly) NSUInteger requestCount; 77 | @property (nonatomic, copy, readonly) NSArray *requests; 78 | @property (nonatomic) RequestQueueMode queueMode; 79 | @property (nonatomic) BOOL allowDuplicateRequests; 80 | 81 | + (instancetype)mainQueue; 82 | 83 | - (void)addOperation:(RQOperation *)operation; 84 | - (void)addRequest:(NSURLRequest *)request completionHandler:(RQCompletionHandler)completionHandler; 85 | - (void)cancelRequest:(NSURLRequest *)request; 86 | - (void)cancelAllRequests; 87 | 88 | @end 89 | 90 | 91 | #pragma GCC diagnostic pop 92 | 93 | -------------------------------------------------------------------------------- /RequestQueue/RequestQueue.m: -------------------------------------------------------------------------------- 1 | // 2 | // RequestQueue.h 3 | // 4 | // Version 1.5.4 5 | // 6 | // Created by Nick Lockwood on 22/12/2011. 7 | // Copyright (C) 2011 Charcoal Design 8 | // 9 | // Distributed under the permissive zlib License 10 | // Get the latest version from here: 11 | // 12 | // https://github.com/nicklockwood/RequestQueue 13 | // 14 | // This software is provided 'as-is', without any express or implied 15 | // warranty. In no event will the authors be held liable for any damages 16 | // arising from the use of this software. 17 | // 18 | // Permission is granted to anyone to use this software for any purpose, 19 | // including commercial applications, and to alter it and redistribute it 20 | // freely, subject to the following restrictions: 21 | // 22 | // 1. The origin of this software must not be misrepresented; you must not 23 | // claim that you wrote the original software. If you use this software 24 | // in a product, an acknowledgment in the product documentation would be 25 | // appreciated but is not required. 26 | // 27 | // 2. Altered source versions must be plainly marked as such, and must not be 28 | // misrepresented as being the original software. 29 | // 30 | // 3. This notice may not be removed or altered from any source distribution. 31 | // 32 | 33 | 34 | #import "RequestQueue.h" 35 | 36 | 37 | #import 38 | #if !__has_feature(objc_arc) 39 | #error This class requires automatic reference counting 40 | #endif 41 | 42 | 43 | #pragma GCC diagnostic ignored "-Wobjc-missing-property-synthesis" 44 | #pragma GCC diagnostic ignored "-Wconversion" 45 | #pragma GCC diagnostic ignored "-Wgnu" 46 | 47 | 48 | NSString *const HTTPResponseErrorDomain = @"HTTPResponseErrorDomain"; 49 | 50 | 51 | @interface RQOperation () 52 | 53 | @property (nonatomic, strong) NSURLConnection *connection; 54 | @property (nonatomic, strong) NSURLResponse *responseReceived; 55 | @property (nonatomic, strong) NSMutableData *accumulatedData; 56 | @property (nonatomic, getter = isExecuting) BOOL executing; 57 | @property (nonatomic, getter = isFinished) BOOL finished; 58 | @property (nonatomic, getter = isCancelled) BOOL cancelled; 59 | 60 | @end 61 | 62 | 63 | @implementation RQOperation 64 | 65 | @synthesize executing = _executing; 66 | @synthesize finished = _finished; 67 | @synthesize cancelled = _cancelled; 68 | 69 | + (instancetype)operationWithRequest:(NSURLRequest *)request 70 | { 71 | return [[self alloc] initWithRequest:request]; 72 | } 73 | 74 | - (instancetype)initWithRequest:(NSURLRequest *)request 75 | { 76 | if ((self = [self init])) 77 | { 78 | _request = request; 79 | _autoRetryDelay = 5.0; 80 | _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 81 | } 82 | return self; 83 | } 84 | 85 | - (BOOL)isConcurrent 86 | { 87 | return YES; 88 | } 89 | 90 | - (void)start 91 | { 92 | @synchronized (self) 93 | { 94 | if (!self.executing && !self.cancelled) 95 | { 96 | [self willChangeValueForKey:@"isExecuting"]; 97 | self.executing = YES; 98 | [self.connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 99 | [self.connection start]; 100 | [self didChangeValueForKey:@"isExecuting"]; 101 | } 102 | } 103 | } 104 | 105 | - (void)cancel 106 | { 107 | @synchronized (self) 108 | { 109 | if (!self.cancelled) 110 | { 111 | [self willChangeValueForKey:@"isCancelled"]; 112 | self.cancelled = YES; 113 | [self.connection cancel]; 114 | [self didChangeValueForKey:@"isCancelled"]; 115 | 116 | //call callback 117 | NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCancelled userInfo:nil]; 118 | [self connection:self.connection didFailWithError:error]; 119 | } 120 | } 121 | } 122 | 123 | - (void)finish 124 | { 125 | @synchronized (self) 126 | { 127 | if (self.executing && !self.finished) 128 | { 129 | [self willChangeValueForKey:@"isExecuting"]; 130 | [self willChangeValueForKey:@"isFinished"]; 131 | self.executing = NO; 132 | self.finished = YES; 133 | [self didChangeValueForKey:@"isFinished"]; 134 | [self didChangeValueForKey:@"isExecuting"]; 135 | } 136 | } 137 | } 138 | 139 | - (NSSet *)autoRetryErrorCodes 140 | { 141 | if (!_autoRetryErrorCodes) 142 | { 143 | static NSSet *codes = nil; 144 | if (!codes) 145 | { 146 | codes = [NSSet setWithObjects: 147 | @(NSURLErrorTimedOut), 148 | @(NSURLErrorCannotFindHost), 149 | @(NSURLErrorCannotConnectToHost), 150 | @(NSURLErrorDNSLookupFailed), 151 | @(NSURLErrorNotConnectedToInternet), 152 | @(NSURLErrorNetworkConnectionLost), 153 | nil]; 154 | } 155 | return codes; 156 | } 157 | return _autoRetryErrorCodes; 158 | } 159 | 160 | #pragma mark NSURLConnectionDelegate 161 | 162 | - (void)connection:(__unused NSURLConnection *)connection didFailWithError:(NSError *)error 163 | { 164 | if (self.autoRetry && [self.autoRetryErrorCodes containsObject:@(error.code)]) 165 | { 166 | self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; 167 | [self.connection performSelector:@selector(start) withObject:nil afterDelay:self.autoRetryDelay]; 168 | } 169 | else 170 | { 171 | [self finish]; 172 | if (self.completionHandler) self.completionHandler(self.responseReceived, self.accumulatedData, error); 173 | } 174 | } 175 | 176 | - (void)connection:(__unused NSURLConnection *)_connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 177 | { 178 | if (self.authenticationChallengeHandler) 179 | { 180 | self.authenticationChallengeHandler(challenge); 181 | } 182 | else 183 | { 184 | [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 185 | } 186 | } 187 | 188 | - (void)connection:(__unused NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 189 | { 190 | self.responseReceived = response; 191 | } 192 | 193 | - (void)connection:(__unused NSURLConnection *)connection didSendBodyData:(__unused NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 194 | { 195 | if (self.uploadProgressHandler) 196 | { 197 | float progress = (float)totalBytesWritten / (float)totalBytesExpectedToWrite; 198 | self.uploadProgressHandler(progress, totalBytesWritten, totalBytesExpectedToWrite); 199 | } 200 | } 201 | 202 | - (void)connection:(__unused NSURLConnection *)connection didReceiveData:(NSData *)data 203 | { 204 | if (self.accumulatedData == nil) 205 | { 206 | self.accumulatedData = [[NSMutableData alloc] initWithCapacity:MAX(0, self.responseReceived.expectedContentLength)]; 207 | } 208 | [self.accumulatedData appendData:data]; 209 | if (self.downloadProgressHandler) 210 | { 211 | NSInteger bytesTransferred = [self.accumulatedData length]; 212 | NSInteger totalBytes = MAX(0, self.responseReceived.expectedContentLength); 213 | self.downloadProgressHandler((float)bytesTransferred / (float)totalBytes, bytesTransferred, totalBytes); 214 | } 215 | } 216 | 217 | - (void)connectionDidFinishLoading:(__unused NSURLConnection *)_connection 218 | { 219 | [self finish]; 220 | 221 | NSError *error = nil; 222 | if ([self.responseReceived respondsToSelector:@selector(statusCode)]) 223 | { 224 | //treat status codes >= 400 as an error 225 | NSInteger statusCode = [(NSHTTPURLResponse *)self.responseReceived statusCode]; 226 | if (statusCode / 100 >= 4) 227 | { 228 | NSString *message = [NSString stringWithFormat:NSLocalizedString(@"The server returned a %i error", @"RequestQueue HTTPResponse error message format"), statusCode]; 229 | NSDictionary *infoDict = @{NSLocalizedDescriptionKey: message}; 230 | error = [NSError errorWithDomain:HTTPResponseErrorDomain 231 | code:statusCode 232 | userInfo:infoDict]; 233 | } 234 | } 235 | 236 | if (self.completionHandler) self.completionHandler(self.responseReceived, self.accumulatedData, error); 237 | } 238 | 239 | @end 240 | 241 | 242 | @interface RequestQueue () 243 | 244 | @property (strong, nonatomic) NSMutableArray *operations; 245 | 246 | @end 247 | 248 | 249 | @implementation RequestQueue 250 | 251 | + (instancetype)mainQueue 252 | { 253 | static RequestQueue *mainQueue = nil; 254 | if (mainQueue == nil) 255 | { 256 | mainQueue = [[RequestQueue alloc] init]; 257 | } 258 | return mainQueue; 259 | } 260 | 261 | - (id)init 262 | { 263 | if ((self = [super init])) 264 | { 265 | _queueMode = RequestQueueModeFirstInFirstOut; 266 | _operations = [[NSMutableArray alloc] init]; 267 | _maxConcurrentRequestCount = 2; 268 | _allowDuplicateRequests = NO; 269 | } 270 | return self; 271 | } 272 | 273 | - (NSUInteger)requestCount 274 | { 275 | return [self.operations count]; 276 | } 277 | 278 | - (NSArray *)requests 279 | { 280 | return [self.operations valueForKeyPath:@"request"]; 281 | } 282 | 283 | - (void)dequeueOperations 284 | { 285 | if (!self.suspended) 286 | { 287 | NSInteger count = MIN([self.operations count], self.maxConcurrentRequestCount ?: INT_MAX); 288 | for (int i = 0; i < count; i++) 289 | { 290 | [(RQOperation *)self.operations[i] start]; 291 | } 292 | } 293 | } 294 | 295 | #pragma mark Public methods 296 | 297 | - (void)setSuspended:(BOOL)suspended 298 | { 299 | _suspended = suspended; 300 | [self dequeueOperations]; 301 | } 302 | 303 | - (void)addOperation:(RQOperation *)operation 304 | { 305 | if (!self.allowDuplicateRequests) 306 | { 307 | for (RQOperation *op in [self.operations reverseObjectEnumerator]) 308 | { 309 | if ([op.request isEqual:operation.request]) 310 | { 311 | [op cancel]; 312 | } 313 | } 314 | } 315 | 316 | NSUInteger index = 0; 317 | if (self.queueMode == RequestQueueModeFirstInFirstOut) 318 | { 319 | index = [self.operations count]; 320 | } 321 | else 322 | { 323 | for (RQOperation *op in self.operations) 324 | { 325 | if (![op isExecuting]) 326 | { 327 | break; 328 | } 329 | index ++; 330 | } 331 | } 332 | if (index < [self.operations count]) 333 | { 334 | [self.operations insertObject:operation atIndex:index]; 335 | } 336 | else 337 | { 338 | [self.operations addObject:operation]; 339 | } 340 | 341 | [operation addObserver:self forKeyPath:@"isExecuting" options:NSKeyValueObservingOptionNew context:NULL]; 342 | [self dequeueOperations]; 343 | } 344 | 345 | - (void)addRequest:(NSURLRequest *)request completionHandler:(RQCompletionHandler)completionHandler 346 | { 347 | RQOperation *operation = [RQOperation operationWithRequest:request]; 348 | operation.completionHandler = completionHandler; 349 | [self addOperation:operation]; 350 | } 351 | 352 | - (void)cancelRequest:(NSURLRequest *)request 353 | { 354 | for (RQOperation *op in [self.operations reverseObjectEnumerator]) 355 | { 356 | if (op.request == request) 357 | { 358 | [op cancel]; 359 | } 360 | } 361 | } 362 | 363 | - (void)cancelAllRequests 364 | { 365 | NSArray *operationsCopy = self.operations; 366 | self.operations = [NSMutableArray array]; 367 | [operationsCopy makeObjectsPerformSelector:@selector(cancel)]; 368 | } 369 | 370 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(__unused NSDictionary *)change context:(__unused void *)context 371 | { 372 | if ([keyPath isEqualToString:@"isExecuting"]) 373 | { 374 | RQOperation *operation = object; 375 | if (!operation.executing) 376 | { 377 | [operation removeObserver:self forKeyPath:keyPath]; 378 | [self.operations removeObject:operation]; 379 | [self dequeueOperations]; 380 | } 381 | } 382 | } 383 | 384 | @end 385 | --------------------------------------------------------------------------------