Are AFNetworking success/failure blocks invoked on the main thread?
They are invoked on the main queue, unless you explictly sets the queue on AFHTTPRequestOperation
, as shown in setCompletionBlockWithSuccess:failure
from AFHTTPRequestOperation.m
self.completionBlock = ^{ if (self.error) { if (failure) { dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{ failure(self, self.error); }); } } else { if (success) { dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{ success(self, self.responseData); }); } }};
In AFNetworking 2, AFHTTPRequestOperationManager
has a completionQueue
property.
The dispatch queue for the
completionBlock
of request operations. IfNULL
(default), the main queue is used.
#if OS_OBJECT_USE_OBJC @property (nonatomic, strong, nullable) dispatch_queue_t completionQueue; #else @property (nonatomic, assign, nullable) dispatch_queue_t completionQueue; #endif
In AFNetworking 3, the completionQueue
property has been moved to AFURLSessionManager
(which AFHTTPSessionManager
extends).
The dispatch queue for
completionBlock
. IfNULL
(default), the main queue is used.
@property (nonatomic, strong) dispatch_queue_t completionQueue;@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue;
As everyone explained, it's in the source code of the AFNetworking, as for the way to do it,
AFNetworking 2.xx:
// Create dispatch_queue_t with your name and DISPATCH_QUEUE_SERIAL as for the flagdispatch_queue_t myQueue = dispatch_queue_create("com.CompanyName.AppName.methodTest", DISPATCH_QUEUE_SERIAL);// init AFHTTPRequestOperation of AFNetworkingoperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];// Set the FMDB property to run off the main thread[operation setCompletionQueue:myQueue];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];[self setCompletionQueue:myQueue];