diff --git a/AFNetworking/AFHTTPRequestOperation.h b/AFNetworking/AFHTTPRequestOperation.h index 350b64a..235cc1a 100644 --- a/AFNetworking/AFHTTPRequestOperation.h +++ b/AFNetworking/AFHTTPRequestOperation.h @@ -31,6 +31,8 @@ NSIndexSet *_acceptableStatusCodes; NSSet *_acceptableContentTypes; NSError *_HTTPError; + dispatch_queue_t _successCallbackQueue; + dispatch_queue_t _failureCallbackQueue; } ///---------------------------------------------- @@ -71,6 +73,17 @@ */ @property (readonly) BOOL hasAcceptableContentType; +/** + The callback dispatch queue on success. If this is NULL (default), the main queue is used. + */ +@property (nonatomic) dispatch_queue_t successCallbackQueue; + +/** + The callback dispatch queue on failure. If this is NULL (default), the main queue is used. + */ +@property (nonatomic) dispatch_queue_t failureCallbackQueue; + + /** A Boolean value determining whether or not the class can process the specified request. For example, `AFJSONRequestOperation` may check to make sure the content type was `application/json` or the URL path extension was `.json`. diff --git a/AFNetworking/AFHTTPRequestOperation.m b/AFNetworking/AFHTTPRequestOperation.m index 38802c1..2fa2326 100644 --- a/AFNetworking/AFHTTPRequestOperation.m +++ b/AFNetworking/AFHTTPRequestOperation.m @@ -30,6 +30,9 @@ @synthesize acceptableStatusCodes = _acceptableStatusCodes; @synthesize acceptableContentTypes = _acceptableContentTypes; @synthesize HTTPError = _HTTPError; +@synthesize successCallbackQueue = _successCallbackQueue; +@synthesize failureCallbackQueue = _failureCallbackQueue; + - (id)initWithRequest:(NSURLRequest *)request { self = [super initWithRequest:request]; @@ -46,6 +49,8 @@ [_acceptableStatusCodes release]; [_acceptableContentTypes release]; [_HTTPError release]; + if (_successCallbackQueue) { dispatch_release(_successCallbackQueue), _successCallbackQueue=NULL;} + if (_failureCallbackQueue) { dispatch_release(_failureCallbackQueue), _failureCallbackQueue=NULL;} [super dealloc]; } @@ -85,6 +90,34 @@ return !self.acceptableContentTypes || [self.acceptableContentTypes containsObject:[self.response MIMEType]]; } +- (void)setSuccessCallbackQueue:(dispatch_queue_t)successCallbackQueue { + if (successCallbackQueue != _successCallbackQueue) { + + if (_successCallbackQueue) { + dispatch_release(_successCallbackQueue); + } + + if (successCallbackQueue) { + dispatch_retain(successCallbackQueue); + _successCallbackQueue = successCallbackQueue; + } + } +} + +- (void)setFailureCallbackQueue:(dispatch_queue_t)failureCallbackQueue { + if (failureCallbackQueue != _failureCallbackQueue) { + + if (_failureCallbackQueue) { + dispatch_release(_failureCallbackQueue); + } + + if (failureCallbackQueue) { + dispatch_retain(failureCallbackQueue); + _failureCallbackQueue = failureCallbackQueue; + } + } +} + - (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure { @@ -95,13 +128,13 @@ if (self.error) { if (failure) { - dispatch_async(dispatch_get_main_queue(), ^(void) { + dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{ failure(self, self.error); }); } } else { if (success) { - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_async(self.successCallbackQueue ? self.successCallbackQueue : dispatch_get_main_queue(), ^{ success(self, self.responseData); }); } diff --git a/AFNetworking/AFImageRequestOperation.m b/AFNetworking/AFImageRequestOperation.m index e004e9d..d1f4d2b 100644 --- a/AFNetworking/AFImageRequestOperation.m +++ b/AFNetworking/AFImageRequestOperation.m @@ -231,13 +231,13 @@ static dispatch_queue_t image_request_operation_processing_queue() { dispatch_async(image_request_operation_processing_queue(), ^(void) { if (self.error) { if (failure) { - dispatch_async(dispatch_get_main_queue(), ^(void) { + dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{ failure(self, self.error); }); } } else { if (success) { - dispatch_async(dispatch_get_main_queue(), ^(void) { + dispatch_async(self.successCallbackQueue ? self.successCallbackQueue : dispatch_get_main_queue(), ^{ success(self, self.responseImage); }); } diff --git a/AFNetworking/AFJSONRequestOperation.m b/AFNetworking/AFJSONRequestOperation.m index 5c651de..cc7d661 100644 --- a/AFNetworking/AFJSONRequestOperation.m +++ b/AFNetworking/AFJSONRequestOperation.m @@ -125,7 +125,7 @@ static dispatch_queue_t json_request_operation_processing_queue() { if (self.error) { if (failure) { - dispatch_async(dispatch_get_main_queue(), ^(void) { + dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{ failure(self, self.error); }); } @@ -133,17 +133,19 @@ static dispatch_queue_t json_request_operation_processing_queue() { dispatch_async(json_request_operation_processing_queue(), ^(void) { id JSON = self.responseJSON; - dispatch_async(dispatch_get_main_queue(), ^(void) { - if (self.JSONError) { - if (failure) { + if (self.JSONError) { + if (failure) { + dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{ failure(self, self.JSONError); - } - } else { - if (success) { - success(self, JSON); - } + }); } - }); + } else { + if (success) { + dispatch_async(self.successCallbackQueue ? self.successCallbackQueue : dispatch_get_main_queue(), ^{ + success(self, JSON); + }); + } + } }); } }; diff --git a/AFNetworking/AFPropertyListRequestOperation.m b/AFNetworking/AFPropertyListRequestOperation.m index bb7a41b..0fcade0 100644 --- a/AFNetworking/AFPropertyListRequestOperation.m +++ b/AFNetworking/AFPropertyListRequestOperation.m @@ -125,7 +125,7 @@ static dispatch_queue_t property_list_request_operation_processing_queue() { if (self.error) { if (failure) { - dispatch_async(dispatch_get_main_queue(), ^(void) { + dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{ failure(self, self.error); }); } @@ -133,7 +133,7 @@ static dispatch_queue_t property_list_request_operation_processing_queue() { dispatch_async(property_list_request_operation_processing_queue(), ^(void) { id propertyList = self.responsePropertyList; - dispatch_async(dispatch_get_main_queue(), ^(void) { + dispatch_async(self.successCallbackQueue ? self.successCallbackQueue : dispatch_get_main_queue(), ^{ if (self.propertyListError) { if (failure) { failure(self, self.propertyListError); diff --git a/AFNetworking/AFXMLRequestOperation.m b/AFNetworking/AFXMLRequestOperation.m index b6b3a2b..ee7865a 100644 --- a/AFNetworking/AFXMLRequestOperation.m +++ b/AFNetworking/AFXMLRequestOperation.m @@ -188,13 +188,15 @@ static dispatch_queue_t xml_request_operation_processing_queue() { if (self.error) { if (failure) { - dispatch_async(dispatch_get_main_queue(), ^(void) { + dispatch_async(self.failureCallbackQueue ? self.failureCallbackQueue : dispatch_get_main_queue(), ^{ failure(self, self.error); }); } } else { if (success) { - success(self, self.responseXMLParser); + dispatch_async(self.successCallbackQueue ? self.successCallbackQueue : dispatch_get_main_queue(), ^{ + success(self, self.responseXMLParser); + }); } } };