【问题标题】:Why does PopViewControllerAnimated crash unless I use dispatch main queue?除非我使用调度主队列,否则为什么 PopViewController Animated 会崩溃?
【发布时间】:2014-02-20 00:32:11
【问题描述】:

为了提供一些上下文,我有一个简单的 UITableViewController,它用数据填充 UITableView。选择一行后,我会通过创建自定义 UIViewController 的新实例并将其推送到导航控制器上来进入详细信息屏幕:

-(void)tableView:(UITableView *)itemTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [itemTableView deselectRowAtIndexPath:indexPath animated:NO];

    NSDictionary *mydata = [self.dataRows objectAtIndex:indexPath.row];

    NameDetailViewController *NDVC = [[NameDetailViewController alloc] initWithName:[mydata objectForKey:@"Name"]
    AndEmail:[mydata objectForKey:@"Email"]
    AndID:[mydata objectForKey:@"Id"]];

    [self.navigationController pushViewController:NDVC animated:YES];
}

细节控制器本身有几个文本字段和一个更新按钮。当按下更新按钮时,我会更新我的模型,然后尝试使用以下命令导航回之前的 UITableViewController:

[self.navigationController popViewControllerAnimated:YES];

当我这样做时,应用程序崩溃了,我收到一个错误,就像尼克在之前的 SO 帖子中遇到的错误一样:Error when dismissing view controller - 关于 -[UIKeyboardTaskQueue waitUntilAllTask​​sAreFinished] 中的断言失败(我可以提供更多详细信息)如果需要)。

在调用 pop 来解决这个问题之前,我尝试做一些事情

[self.view endEditing:YES];

以及在每个 UITextfield 上使用 resignFirstResponder。两者都没有做任何事情。

但是,我发现如果我使用主线程:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.navigationController popViewControllerAnimated:YES];
});

它似乎工作得很好。我不知道为什么会这样,并且对它为什么会崩溃没有非常明确的理解。我假设它与我的细节控制器在从堆栈中删除后尝试做某事有关。

无论如何,我希望这里有人可以帮助我理解为什么这似乎有效,以及这是否是我解决此问题的合理方法。

【问题讨论】:

  • 代码当时是否在后台线程上运行?在 pop 周围显示更多代码。
  • 从代码中不清楚 - 但是看起来代码以某种方式在后台线程上运行。任何 UI 更新都必须始终在主线程上完成。
  • @Wain 我不这么认为,但老实说我并不完全确定(为我的无知道歉)。在弹出之前我所做的就是向 salesforce API 发送请求,以使用详细信息屏幕上的文本字段中的数据进行更新。详细控制器被设置为 API 调用的委托,因此当我尝试弹出控制器时,更新成功。这能解释吗?还是您希望我也将原始问题中的所有代码都转储?

标签: ios iphone objective-c uitableview uinavigationcontroller


【解决方案1】:

有时异步 API 请求不会回调到主线程上的委托。这可能有几个原因,但如果回调不在主线程上,那么您需要确保在对 UI 进行 any 更新之前切换到主线程。

作为检查,您可以确定您当前是否在主线程上运行:

if ([NSThread isMainThread]) {
    NSLog(@"Yay!");
} else {
    NSLog(@"Humph, switching to main");
    dispatch...
}

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多