diff --git a/AFNetworking/AFHTTPRequestOperation.m b/AFNetworking/AFHTTPRequestOperation.m index 827844c..caeb05c 100644 --- a/AFNetworking/AFHTTPRequestOperation.m +++ b/AFNetworking/AFHTTPRequestOperation.m @@ -42,7 +42,6 @@ static inline NSString * AFKeyPathFromOperationState(AFHTTPOperationState state) case AFHTTPOperationExecutingState: return @"isExecuting"; case AFHTTPOperationFinishedState: - case AFHTTPOperationCancelledState: return @"isFinished"; default: return @"state"; @@ -58,7 +57,6 @@ static inline BOOL AFHTTPOperationStateTransitionIsValid(AFHTTPOperationState fr case AFHTTPOperationReadyState: switch (to) { case AFHTTPOperationExecutingState: - case AFHTTPOperationCancelledState: return YES; default: return NO; @@ -71,7 +69,6 @@ static inline BOOL AFHTTPOperationStateTransitionIsValid(AFHTTPOperationState fr return YES; } case AFHTTPOperationFinishedState: - case AFHTTPOperationCancelledState: return NO; default: return YES; @@ -80,13 +77,17 @@ static inline BOOL AFHTTPOperationStateTransitionIsValid(AFHTTPOperationState fr @interface AFHTTPRequestOperation () @property (nonatomic, assign) AFHTTPOperationState state; +@property (nonatomic, assign) BOOL isCancelled; @property (readwrite, nonatomic, retain) NSPort *port; @property (readwrite, nonatomic, retain) NSMutableData *dataAccumulator; @property (readwrite, nonatomic, copy) AFHTTPRequestOperationCompletionBlock completion; + +- (void)cleanup; @end @implementation AFHTTPRequestOperation @synthesize state = _state; +@synthesize isCancelled = _isCancelled; @synthesize connection = _connection; @synthesize runLoopModes = _runLoopModes; @synthesize port = _port; @@ -136,6 +137,14 @@ static inline BOOL AFHTTPOperationStateTransitionIsValid(AFHTTPOperationState fr [super dealloc]; } +- (void)cleanup { + for (NSString *runLoopMode in self.runLoopModes) { + [[NSRunLoop currentRunLoop] removePort:self.port forMode:runLoopMode]; + [self.connection unscheduleFromRunLoop:[NSRunLoop currentRunLoop] forMode:runLoopMode]; + } + CFRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]); +} + - (void)setState:(AFHTTPOperationState)state { if (!AFHTTPOperationStateTransitionIsValid(self.state, state)) { return; @@ -156,15 +165,9 @@ static inline BOOL AFHTTPOperationStateTransitionIsValid(AFHTTPOperationState fr [[NSNotificationCenter defaultCenter] postNotificationName:AFHTTPOperationDidStartNotification object:self]; break; case AFHTTPOperationFinishedState: - case AFHTTPOperationCancelledState: [[AFNetworkActivityIndicatorManager sharedManager] stopAnimating]; [[NSNotificationCenter defaultCenter] postNotificationName:AFHTTPOperationDidFinishNotification object:self]; - - for (NSString *runLoopMode in self.runLoopModes) { - [[NSRunLoop currentRunLoop] removePort:self.port forMode:runLoopMode]; - [self.connection unscheduleFromRunLoop:[NSRunLoop currentRunLoop] forMode:runLoopMode]; - } - CFRunLoopStop([[NSRunLoop currentRunLoop] getCFRunLoop]); + [self cleanup]; break; default: break; @@ -186,11 +189,7 @@ static inline BOOL AFHTTPOperationStateTransitionIsValid(AFHTTPOperationState fr } - (BOOL)isFinished { - return self.state == AFHTTPOperationFinishedState || self.isCancelled; -} - -- (BOOL)isCancelled { - return self.state == AFHTTPOperationCancelledState; + return self.state == AFHTTPOperationFinishedState || [self isCancelled]; } - (BOOL)isConcurrent { @@ -218,10 +217,12 @@ static inline BOOL AFHTTPOperationStateTransitionIsValid(AFHTTPOperationState fr [runLoop run]; } -- (void)cancel { - self.state = AFHTTPOperationCancelledState; - +- (void)cancel { + self.isCancelled = YES; + [self.connection cancel]; + + [self cleanup]; } #pragma mark - AFHTTPRequestOperation @@ -266,4 +267,12 @@ static inline BOOL AFHTTPOperationStateTransitionIsValid(AFHTTPOperationState fr [self performSelectorOnMainThread:@selector(finish) withObject:nil waitUntilDone:YES modes:[self.runLoopModes allObjects]]; } +- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { + if ([self isCancelled]) { + return nil; + } + + return cachedResponse; +} + @end diff --git a/AFNetworking/AFJSONRequestOperation.h b/AFNetworking/AFJSONRequestOperation.h index a163aee..1495edc 100644 --- a/AFNetworking/AFJSONRequestOperation.h +++ b/AFNetworking/AFJSONRequestOperation.h @@ -25,16 +25,19 @@ @interface AFJSONRequestOperation : AFHTTPRequestOperation + (id)operationWithRequest:(NSURLRequest *)urlRequest - success:(void (^)(NSDictionary *JSON))success; + success:(void (^)(id JSON))success; + (id)operationWithRequest:(NSURLRequest *)urlRequest - success:(void (^)(NSDictionary *JSON))success + success:(void (^)(id JSON))success failure:(void (^)(NSError *error))failure; + (id)operationWithRequest:(NSURLRequest *)urlRequest acceptableStatusCodes:(NSIndexSet *)acceptableStatusCodes acceptableContentTypes:(NSSet *)acceptableContentTypes - success:(void (^)(NSDictionary *JSON))success + success:(void (^)(id JSON))success failure:(void (^)(NSError *error))failure; ++ (NSIndexSet *)defaultAcceptableStatusCodes; ++ (NSSet *)defaultAcceptableContentTypes; + @end diff --git a/AFNetworking/AFJSONRequestOperation.m b/AFNetworking/AFJSONRequestOperation.m index 9acb579..039b1f8 100644 --- a/AFNetworking/AFJSONRequestOperation.m +++ b/AFNetworking/AFJSONRequestOperation.m @@ -26,25 +26,22 @@ @implementation AFJSONRequestOperation + (id)operationWithRequest:(NSURLRequest *)urlRequest - success:(void (^)(NSDictionary *JSON))success + success:(void (^)(id JSON))success { return [self operationWithRequest:urlRequest success:success failure:nil]; } + (id)operationWithRequest:(NSURLRequest *)urlRequest - success:(void (^)(NSDictionary *JSON))success + success:(void (^)(id JSON))success failure:(void (^)(NSError *error))failure -{ - NSIndexSet *acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)]; - NSSet *acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"application/x-javascript", @"text/javascript", @"text/x-javascript", @"text/x-json", @"text/plain", nil]; - - return [self operationWithRequest:urlRequest acceptableStatusCodes:acceptableStatusCodes acceptableContentTypes:acceptableContentTypes success:success failure:failure]; +{ + return [self operationWithRequest:urlRequest acceptableStatusCodes:[self defaultAcceptableStatusCodes] acceptableContentTypes:[self defaultAcceptableContentTypes] success:success failure:failure]; } + (id)operationWithRequest:(NSURLRequest *)urlRequest acceptableStatusCodes:(NSIndexSet *)acceptableStatusCodes acceptableContentTypes:(NSSet *)acceptableContentTypes - success:(void (^)(NSDictionary *JSON))success + success:(void (^)(id JSON))success failure:(void (^)(NSError *error))failure { return [self operationWithRequest:urlRequest completion:^(NSURLRequest *request, NSHTTPURLResponse *response, NSData *data, NSError *error) { @@ -63,13 +60,34 @@ failure(error); } } else { - NSDictionary *JSON = [[JSONDecoder decoder] objectWithData:data error:&error]; + id JSON = nil; - if (success) { - success(JSON); + Class NSJSONSerialization = NSClassFromString(@"NSJSONSerialization"); + if (NSJSONSerialization) { + JSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; + } else { + JSON = [[JSONDecoder decoder] objectWithData:data error:&error]; + } + + if (error) { + if (failure) { + failure(error); + } + } else { + if (success) { + success(JSON); + } } } }]; } ++ (NSIndexSet *)defaultAcceptableStatusCodes { + return [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 100)]; +} + ++ (NSSet *)defaultAcceptableContentTypes { + return [NSSet setWithObjects:@"application/json", @"application/x-javascript", @"text/javascript", @"text/x-javascript", @"text/x-json", @"text/json", @"text/plain", nil]; +} + @end diff --git a/AFNetworking/AFRestClient.h b/AFNetworking/AFRestClient.h index d586160..04fdfc2 100644 --- a/AFNetworking/AFRestClient.h +++ b/AFNetworking/AFRestClient.h @@ -39,19 +39,19 @@ - (void)clearAuthorizationHeader; - (NSMutableURLRequest *)requestWithMethod:(NSString *)method path:(NSString *)path parameters:(NSDictionary *)parameters; -- (void)enqueueHTTPOperationWithRequest:(NSURLRequest *)request success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure; +- (void)enqueueHTTPOperationWithRequest:(NSURLRequest *)request success:(void (^)(id response))success failure:(void (^)(NSError *error))failure; -- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success; -- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure; +- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success; +- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success failure:(void (^)(NSError *error))failure; -- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success; -- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure; +- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success; +- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success failure:(void (^)(NSError *error))failure; -- (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success; -- (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure; +- (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success; +- (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success failure:(void (^)(NSError *error))failure; -- (void)deletePath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success; -- (void)deletePath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure; +- (void)deletePath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success; +- (void)deletePath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success failure:(void (^)(NSError *error))failure; @end #pragma mark - NSString + AFRestClient diff --git a/AFNetworking/AFRestClient.m b/AFNetworking/AFRestClient.m index 4004df9..c207cab 100644 --- a/AFNetworking/AFRestClient.m +++ b/AFNetworking/AFRestClient.m @@ -29,7 +29,7 @@ static NSStringEncoding const kAFRestClientStringEncoding = NSUTF8StringEncoding @property (readwrite, nonatomic, retain) NSMutableDictionary *defaultHeaders; @property (readwrite, nonatomic, retain) NSOperationQueue *operationQueue; -- (void)enqueueHTTPOperationWithRequest:(NSURLRequest *)request success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure; +- (void)enqueueHTTPOperationWithRequest:(NSURLRequest *)request success:(void (^)(id response))success failure:(void (^)(NSError *error))failure; @end @implementation AFRestClient @@ -128,7 +128,7 @@ static NSStringEncoding const kAFRestClientStringEncoding = NSUTF8StringEncoding return request; } -- (void)enqueueHTTPOperationWithRequest:(NSURLRequest *)request success:(void (^)(NSDictionary *response))success failure:(void (^)(NSError *error))failure { +- (void)enqueueHTTPOperationWithRequest:(NSURLRequest *)request success:(void (^)(id response))success failure:(void (^)(NSError *error))failure { if ([request URL] == nil || [[request URL] isEqual:[NSNull null]]) { return; } @@ -137,38 +137,38 @@ static NSStringEncoding const kAFRestClientStringEncoding = NSUTF8StringEncoding [self.operationQueue addOperation:operation]; } -- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *))success { +- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success { [self getPath:path parameters:parameters success:success failure:nil]; } -- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *))success failure:(void (^)(NSError *error))failure { +- (void)getPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success failure:(void (^)(NSError *error))failure { NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:parameters]; [self enqueueHTTPOperationWithRequest:request success:success failure:failure]; } -- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *))success { +- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success { [self postPath:path parameters:parameters success:success failure:nil]; } -- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *))success failure:(void (^)(NSError *error))failure { +- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success failure:(void (^)(NSError *error))failure { NSURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:parameters]; [self enqueueHTTPOperationWithRequest:request success:success failure:failure]; } -- (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *))success { +- (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success { [self putPath:path parameters:parameters success:success failure:nil]; } -- (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *))success failure:(void (^)(NSError *error))failure { +- (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success failure:(void (^)(NSError *error))failure { NSURLRequest *request = [self requestWithMethod:@"PUT" path:path parameters:parameters]; [self enqueueHTTPOperationWithRequest:request success:success failure:failure]; } -- (void)deletePath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *))success { +- (void)deletePath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success { [self deletePath:path parameters:parameters success:success failure:nil]; } -- (void)deletePath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(NSDictionary *))success failure:(void (^)(NSError *error))failure { +- (void)deletePath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(id response))success failure:(void (^)(NSError *error))failure { NSURLRequest *request = [self requestWithMethod:@"DELETE" path:path parameters:parameters]; [self enqueueHTTPOperationWithRequest:request success:success failure:failure]; }