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];
You can set the completion callback queue by specifying completionGroup, completionQueue see the AFNetworking API document
As everyone explained, it's in the source code of the AFNetworking, as for the way to do it,
AFNetworking 2.xx:
AFNetworking 3.xx:
In AFNetworking 2,
AFHTTPRequestOperationManager
has acompletionQueue
property.In AFNetworking 3, the
completionQueue
property has been moved toAFURLSessionManager
(whichAFHTTPSessionManager
extends).They are invoked on the main queue, unless you explictly sets the queue on
AFHTTPRequestOperation
, as shown insetCompletionBlockWithSuccess:failure
fromAFHTTPRequestOperation.m