Does AFNetworking call the completion block on the main thread? or is it called in the background, requiring me to manually dispatch my UI updates to the main thread?
Using code instead of words, this is the example code from the AFNetworking documentation with the call to NSLog
replaced by a UI update:
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
self.label.text = JSON[@"text"];
} failure:nil];
Should it be written like this instead?
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
dispatch_async(dispatch_get_main_queue(), ^{
self.label.text = JSON[@"text"];
});
} failure:nil];
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 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];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With