web-dev-qa-db-ja.com

AFNetworkingの成功/失敗ブロックはメインスレッドで呼び出されますか?

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];
47
thomasd

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プロパティが AFURLSessionManagerAFHTTPSessionManagerが拡張する)に移動しました。

completionBlockのディスパッチキュー。 NULL(デフォルト)の場合、メインキューが使用されます。

@property (nonatomic, strong) dispatch_queue_t completionQueue;
@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue;
31
onmyway133

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);
            });
        }
    }
};
42
Marcelo Fabri

みんなが説明したように、それは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];
5
OhadM

CompletionGroup、completionQueueを指定して完了コールバックキューを設定できます AFNetworking APIドキュメントを参照

1
Elaine