AFNetworkingはメインスレッドで完了ブロックを呼び出しますか?または、バックグラウンドで呼び出され、メインスレッドにUIの更新を手動でディスパッチする必要がありますか?
単語の代わりにコードを使用すると、これは AFNetworking documentation のサンプルコードであり、NSLog
への呼び出しがUI更新に置き換えられます。
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];
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;
setCompletionBlockWithSuccess:failure
from AFHTTPRequestOperation.m
に示されているように、明示的にAFHTTPRequestOperation
にキューを設定しない限り、これらはメインキューで呼び出されます。
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);
});
}
}
};
みんなが説明したように、それは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];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init];
[self setCompletionQueue:myQueue];
CompletionGroup、completionQueueを指定して完了コールバックキューを設定できます AFNetworking APIドキュメントを参照