Initial implementation of network reachability callbacks

This commit is contained in:
Mattt Thompson 2012-01-10 12:20:30 -08:00
parent 2c4a643d7d
commit 95442be7b3
2 changed files with 59 additions and 2 deletions

View file

@ -35,6 +35,13 @@ typedef enum {
AFPropertyListParameterEncoding,
} AFHTTPClientParameterEncoding;
/**
*/
typedef enum {
AFNetworkNotReachable,
AFNetworkReachable,
} AFNetworkReachabilityStatus;
/**
Returns a string, replacing certain characters with the equivalent percent escape sequence based on the specified encoding.
@ -157,9 +164,17 @@ extern NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *paramete
*/
- (id)initWithBaseURL:(NSURL *)url;
///----------------------------------
///-----------------------------------
/// @name Managing Reachability Status
///-----------------------------------
/**
*/
- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus reachabilityStatus))block;
///-------------------------------
/// @name Managing HTTP Operations
///----------------------------------
///-------------------------------
/**
Attempts to register a subclass of `AFHTTPRequestOperation`, adding it to a chain to automatically generate request operations from a URL request.

View file

@ -27,6 +27,7 @@
#import "AFJSONUtilities.h"
#import <Availability.h>
#import <SystemConfiguration/SystemConfiguration.h>
#if __IPHONE_OS_VERSION_MIN_REQUIRED
#import <UIKit/UIKit.h>
@ -49,6 +50,16 @@ static NSString * const kAFMultipartFormBoundary = @"Boundary+0xAbCdEfGbOuNdArY"
#pragma mark -
typedef void (^AFNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus reachabilityStatus);
static AFNetworkReachabilityStatus AFNetworkReachabilityStatusFromFlags(SCNetworkReachabilityFlags flags) {
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) {
return AFNetworkNotReachable;
} else {
return AFNetworkReachable;
}
}
static NSUInteger const kAFHTTPClientDefaultMaxConcurrentOperationCount = 4;
static NSString * AFBase64EncodedStringFromString(NSString *string) {
@ -124,6 +135,8 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) {
@property (readwrite, nonatomic, retain) NSMutableArray *registeredHTTPOperationClassNames;
@property (readwrite, nonatomic, retain) NSMutableDictionary *defaultHeaders;
@property (readwrite, nonatomic, retain) NSOperationQueue *operationQueue;
@property (readwrite, nonatomic, assign) SCNetworkReachabilityRef networkReachability;
@property (readwrite, nonatomic, copy) AFNetworkReachabilityStatusBlock networkReachabilityStatusBlock;
@end
@implementation AFHTTPClient
@ -133,6 +146,8 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) {
@synthesize registeredHTTPOperationClassNames = _registeredHTTPOperationClassNames;
@synthesize defaultHeaders = _defaultHeaders;
@synthesize operationQueue = _operationQueue;
@synthesize networkReachability = _networkReachability;
@synthesize networkReachabilityStatusBlock = _networkReachabilityStatusBlock;
+ (AFHTTPClient *)clientWithBaseURL:(NSURL *)url {
return [[[self alloc] initWithBaseURL:url] autorelease];
@ -178,11 +193,38 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) {
[_registeredHTTPOperationClassNames release];
[_defaultHeaders release];
[_operationQueue release];
[_networkReachabilityStatusBlock release];
if (_networkReachability) {
CFRelease(_networkReachability);
}
[super dealloc];
}
#pragma mark -
static void AFReachabilityCallback(SCNetworkReachabilityRef __unused target, SCNetworkReachabilityFlags flags, void *info) {
if (info) {
AFNetworkReachabilityStatusBlock block = (AFNetworkReachabilityStatusBlock)info;
block(AFNetworkReachabilityStatusFromFlags(flags));
}
}
- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus reachabilityStatus))block {
if (_networkReachability) {
SCNetworkReachabilityUnscheduleFromRunLoop(_networkReachability, CFRunLoopGetMain(), (CFStringRef)NSRunLoopCommonModes);
CFRelease(_networkReachability);
}
self.networkReachabilityStatusBlock = block;
self.networkReachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [[self.baseURL host] UTF8String]);
SCNetworkReachabilityContext context = {0, self.networkReachabilityStatusBlock, NULL, NULL, NULL};
SCNetworkReachabilitySetCallback(self.networkReachability, AFReachabilityCallback, &context);
SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), (CFStringRef)NSRunLoopCommonModes);
}
#pragma mark -
- (BOOL)registerHTTPOperationClass:(Class)operationClass {
if (![operationClass isSubclassOfClass:[AFHTTPRequestOperation class]]) {
return NO;