AFNetworking 2.0成功阻止主线程

时间:2014-02-23 09:45:54

标签: ios objective-c afnetworking

我想在后台使用success块。我使用代码:

[manager POST:URLString parameters:params success:^(AFHTTPRequestOperation *responseHeader, id responseBody) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {

    [self parseResponse:responseHeader and:responseBody forRequest:request];
    });
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"FAIL request: %@", error);
}];

[self parseResponse:responseHeader and:responseBody forRequest:request];

我发送NSNotification来更新用户界面。但它不起作用......为什么?

2 个答案:

答案 0 :(得分:4)

当您发布通知时,同步发送通知,因此您需要切换回主线程,最好在发布之前(尽管您可以在收到回调后切换)。

您可以使用dispatch_asyncperformSelector:onMainThread:切换到主线程。

答案 1 :(得分:0)

必须在主线程上运行UI操作。 在后台线程上执行时 - 您将在调试器中收到有关此问题的警告,并且更新将在几秒钟后发生(当UI线程实际上将进行调用时)。 这就是为什么你必须使用dispatch_async与主线程弹回到主线程并在该线程上执行所有UI操作。

请注意 - 在AFNetworking中 - 无论如何都会在另一个线程上发生异步加载操作,并且完成块在它们退出的同一队列中返回 - 所以理论上 - 如果你所做的只是更新UI - 那么你就不应该也不会在你的代码中处理它。