Используются ли блоки успеха успеха/отказа AFNetworking в основном потоке?
Активирует ли AFNetworking блок завершения в основном потоке? или он вызван в фоновом режиме, требуя от меня вручную отправлять обновления моего интерфейса в основной поток?
Использование кода вместо слов, это пример кода из документации AFNetworking с заменой вызова на NSLog
на обновление пользовательского интерфейса:
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
self.label.text = JSON[@"text"];
} failure:nil];
Должно ли это быть написано так?
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];
Ответы
Ответ 1
В AFNetworking 2 AFHTTPRequestOperationManager
имеет свойство completionQueue
.
Очередь отправки для completionBlock
операций запроса. Если NULL
(по умолчанию), используется основная очередь.
#if OS_OBJECT_USE_OBJC
@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue;
#else
@property (nonatomic, assign, nullable) dispatch_queue_t completionQueue;
#endif
В AFNetworking 3 свойство completionQueue
было перенесено на AFURLSessionManager
(который AFHTTPSessionManager
продолжается).
Очередь отправки для completionBlock
. Если NULL
(по умолчанию), используется основная очередь.
@property (nonatomic, strong) dispatch_queue_t completionQueue;
@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue;
Ответ 2
Они вызываются в основной очереди, если вы явно не устанавливаете очередь на AFHTTPRequestOperation
, как показано в 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);
});
}
}
};
Ответ 3
Как объяснили все, он в исходном коде AFNetworking, как и для этого,
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];
Ответ 4
Вы можете установить очередь обратного вызова завершения, указав completeGroup, completeQueue посмотреть документ API AFNetworking