Are AFNetworking success/failure blocks invoked on the main thread? Are AFNetworking success/failure blocks invoked on the main thread? ios ios

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. If NULL (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. If NULL (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];

AFNetworking 3.xx:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];[self setCompletionQueue:myQueue];