在 AFNetworking 故障块中弹出 UINavigationController

Posted

技术标签:

【中文标题】在 AFNetworking 故障块中弹出 UINavigationController【英文标题】:Pop UINavigationController in AFNetworking failure block 【发布时间】:2014-08-14 04:21:54 【问题描述】:

如何在 AFNetworking 2 故障块中弹出 UINavigationController?我的代码如下:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSDictionary *params = @@"request": @"get_sth";
[manager POST:API_URL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) 
   // success block here, omitted
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    // how can I pop UINavigationController here?
    // method 1
    [self.navigationController popViewControllerAnimated:YES];
    // method 2
    [self.navigationController performperformSelectorOnMainThread:@selector(popViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES] waitUntilDone:NO];
];

方法 1 和方法 2 均未响应(无错误、无警告、无崩溃、无延迟)。我认为方法 1 不起作用,因为故障块在后台线程中运行。所以我使用方法2。与方法1相同的响应。

我的目标很简单:当网络操作失败时,弹回上一页。

在上面的案例中我错过了什么?

附言self.navigationController 不为空

【问题讨论】:

你试过dispatch_async(dispatch_get_main_queue(), ^ // do pop ); - 作为一个远射,理论上这应该和performperformSelectorOnMainThread:一样做 【参考方案1】:

我尝试了您的代码并且能够毫无问题地弹出视图控制器。在AFHTTPRequestOperation 中,除非您在AFHTTPRequestOperation 上显式设置队列,否则在主队列上调用块。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
NSDictionary *params = @@“key”: @“value”;
[manager POST:URL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) 
   // success code
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
  // failure code
    [self.navigationController popViewControllerAnimated:YES];
];

还要确保您没有在导航转换完成之前推动和弹出控制器,这会产生意外的转换状态。

【讨论】:

以上是关于在 AFNetworking 故障块中弹出 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

从堆栈中弹出导航控制器/创建双视图

AFNetworking 2.0 从故障块中的代码 400 获取 JSON

在 AFNetworking 2 的失败块中访问 JSON 响应

AFNetworking 识别失败原因:用户取消请求或网络故障

iOS AFNetworking 发生故障

Jquery EasyUI的Dialog 怎么在iframe中弹出和不在iframe中弹出一样在窗口最顶层?