Initial implementation of network reachability callbacks
This commit is contained in:
parent
2c4a643d7d
commit
95442be7b3
2 changed files with 59 additions and 2 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue