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

Solution 1:

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);
            });
        }
    }
};

Solution 2:

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;

Solution 3:

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 flag
dispatch_queue_t myQueue = dispatch_queue_create("com.CompanyName.AppName.methodTest", DISPATCH_QUEUE_SERIAL);

// init AFHTTPRequestOperation of AFNetworking
operation = [[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];

Solution 4:

You can set the completion callback queue by specifying completionGroup, completionQueue see the AFNetworking API document