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. 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;
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