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, AFPropertyListParameterEncoding,
} AFHTTPClientParameterEncoding; } AFHTTPClientParameterEncoding;
/**
*/
typedef enum {
AFNetworkNotReachable,
AFNetworkReachable,
} AFNetworkReachabilityStatus;
/** /**
Returns a string, replacing certain characters with the equivalent percent escape sequence based on the specified encoding. 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; - (id)initWithBaseURL:(NSURL *)url;
///---------------------------------- ///-----------------------------------
/// @name Managing Reachability Status
///-----------------------------------
/**
*/
- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus reachabilityStatus))block;
///-------------------------------
/// @name Managing HTTP Operations /// @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. 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 "AFJSONUtilities.h"
#import <Availability.h> #import <Availability.h>
#import <SystemConfiguration/SystemConfiguration.h>
#if __IPHONE_OS_VERSION_MIN_REQUIRED #if __IPHONE_OS_VERSION_MIN_REQUIRED
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
@ -49,6 +50,16 @@ static NSString * const kAFMultipartFormBoundary = @"Boundary+0xAbCdEfGbOuNdArY"
#pragma mark - #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 NSUInteger const kAFHTTPClientDefaultMaxConcurrentOperationCount = 4;
static NSString * AFBase64EncodedStringFromString(NSString *string) { static NSString * AFBase64EncodedStringFromString(NSString *string) {
@ -124,6 +135,8 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) {
@property (readwrite, nonatomic, retain) NSMutableArray *registeredHTTPOperationClassNames; @property (readwrite, nonatomic, retain) NSMutableArray *registeredHTTPOperationClassNames;
@property (readwrite, nonatomic, retain) NSMutableDictionary *defaultHeaders; @property (readwrite, nonatomic, retain) NSMutableDictionary *defaultHeaders;
@property (readwrite, nonatomic, retain) NSOperationQueue *operationQueue; @property (readwrite, nonatomic, retain) NSOperationQueue *operationQueue;
@property (readwrite, nonatomic, assign) SCNetworkReachabilityRef networkReachability;
@property (readwrite, nonatomic, copy) AFNetworkReachabilityStatusBlock networkReachabilityStatusBlock;
@end @end
@implementation AFHTTPClient @implementation AFHTTPClient
@ -133,6 +146,8 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) {
@synthesize registeredHTTPOperationClassNames = _registeredHTTPOperationClassNames; @synthesize registeredHTTPOperationClassNames = _registeredHTTPOperationClassNames;
@synthesize defaultHeaders = _defaultHeaders; @synthesize defaultHeaders = _defaultHeaders;
@synthesize operationQueue = _operationQueue; @synthesize operationQueue = _operationQueue;
@synthesize networkReachability = _networkReachability;
@synthesize networkReachabilityStatusBlock = _networkReachabilityStatusBlock;
+ (AFHTTPClient *)clientWithBaseURL:(NSURL *)url { + (AFHTTPClient *)clientWithBaseURL:(NSURL *)url {
return [[[self alloc] initWithBaseURL:url] autorelease]; return [[[self alloc] initWithBaseURL:url] autorelease];
@ -178,11 +193,38 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) {
[_registeredHTTPOperationClassNames release]; [_registeredHTTPOperationClassNames release];
[_defaultHeaders release]; [_defaultHeaders release];
[_operationQueue release]; [_operationQueue release];
[_networkReachabilityStatusBlock release];
if (_networkReachability) {
CFRelease(_networkReachability);
}
[super dealloc]; [super dealloc];
} }
#pragma mark - #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 { - (BOOL)registerHTTPOperationClass:(Class)operationClass {
if (![operationClass isSubclassOfClass:[AFHTTPRequestOperation class]]) { if (![operationClass isSubclassOfClass:[AFHTTPRequestOperation class]]) {
return NO; return NO;