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

后端 未结 4 846
南方客
南方客 2020-12-04 23:44

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?

<
相关标签:
4条回答
  • 2020-12-04 23:59

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

    0 讨论(0)
  • 2020-12-05 00:01

    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];
    
    0 讨论(0)
  • 2020-12-05 00:08

    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;
    
    0 讨论(0)
  • 2020-12-05 00:21

    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);
                });
            }
        }
    };
    
    0 讨论(0)
提交回复
热议问题