2015-06-09 2 views
0

я использовал AFNetworking, чтобы иметь дело с HTTP request.And здесь мой код:Нужно ли вернуться к основному потоку для обновления интерфейса?

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager POST:URL_LOGIN parameters:parames success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    [self.tableview reloadData]; 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Request failed"); 
}]; 

или:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
[manager POST:URL_LOGIN parameters:parames success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableview reloadData]; 

    }); 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Request failed"); 
}]; 

Кто из них прав, делает необходимым использование dispathc_get_main_queue(), или AFNetworking все исправить? Кто-нибудь знает? Спасибо заранее.

+0

AFNetworking ручки. Но для потоковой безопасности вызывают методы обновления интерфейса пользователя в основном потоке. –

+0

AFNetworking используется для вызова обработчиков на основном потоке. К сожалению, это плохо документировано (или недостаточно хорошо). Чтобы быть в безопасности, вы должны явно отправить в любой контекст выполнения, который, по вашему мнению, подходит для вашего обработчика. – CouchDeveloper

ответ

2

С одной стороны, AppKit и UIKit не являются потокобезопасными, поэтому вам нужно выполнить любую работу, связанную с пользовательским интерфейсом, в основном потоке.

Но что касается AFNetworking, он автоматически гарантирует, что обратные вызовы (success или failure) выполняются в основном потоке (если вы не установили иное). Поэтому обычно вам не нужно явно использовать dispatch_get_main_queue для отправки вашей работы в основной поток.

Чтобы проверить, является ли обратный вызов на главной очереди:

[manager POST:someURL parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    if (operation.completionQueue == NULL) { 
     // is main queue 
    } 
}... 

Documentation

+0

Я проверил это, это главная очередь. Спасибо большое. –

1

Обновление пользовательского интерфейса всегда происходит в основной теме. Так что ваш рабочий стол должен быть перезагружен в основном потоке. Итак, второе верно.

Смежные вопросы