【问题标题】:Does it necessary to go back to main thread to update UI?是否需要回到主线程来更新 UI?
【发布时间】:2015-06-09 06:00:54
【问题描述】:

我使用 AFNetworking 来处理 http 请求。这是我的代码:

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 解决所有问题?有人知道吗?提前致谢。

【问题讨论】:

  • AFNetworking 句柄。但是为了线程安全,在主线程上调用 UI 更新方法。
  • AFNetworking 用于调用主线程上的处理程序。不幸的是,这没有很好的记录(或不够好)。为了安全起见,您应该明确地分派到您认为适合您的处理程序的任何执行上下文。

标签: ios objective-c cocoa


【解决方案1】:

一方面,AppKitUIKit 不是线程安全的,所以你必须在主线程上做任何与 UI 相关的工作。

但是对于AFNetworking,它会自动确保回调(successfailure)在主线程上执行(除非您另外设置)。因此,通常您不必显式使用dispatch_get_main_queue 将您的工作分派到主线程。

检查回调是否在主队列中:

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

Documentation

【讨论】:

  • 我已经检查过了,是主队列。非常感谢。
【解决方案2】:

UI 更新总是发生在主线程中。所以你的 tableview 需要在主线程中重新加载。 所以第二个是真的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多