【问题标题】:Async call to WebService segue happens before data comes back在数据返回之前发生对 WebService segue 的异步调用
【发布时间】:2014-10-02 14:18:58
【问题描述】:
背景
我有一个 iOS 应用程序,我正在使用 StoryBoard 构建 UI,AFNetworking 用于后端。在我的UIViewController 上有一些文本框。当用户点击提交UIButton 时,我正在对返回 XML 文件的 Web 服务进行 AFNetworking 调用。
问题
我使用StoryBoard 接口将按钮连接到UITableViewController。最初这很好用,因为我在UITableViewController 中有用于 Web 服务调用的代码。问题是,如果 Web 服务没有返回任何内容,我会得到一个空白的 UITableView。因此,我将 Web 服务调用移到了 UIViewController 中,以便在按下按钮时调用。哎呀!我进行了 Web 服务调用,并在 Web 服务返回数据之前调用了 prepareForSegue,因为它的 Asynchronous。
我的问题
- 在使用情节提要时,从 Web 服务获取数据的最佳方法是什么。如果没有数据或服务返回错误,我是否应该在 UITableViewController 中进行调用,然后返回
UIViewController。如果是这样我怎么回来。我已经尝试过self.navigationController popViewController,但它在控制台中出现了一个警告,即删除视图控制器可能会弄乱堆栈。
- 有没有一种方法可以控制何时调用 segue,并且仅在我从 Web 服务返回数据后才执行此操作?
【问题讨论】:
标签:
ios
uistoryboard
uistoryboardsegue
【解决方案1】:
发布此分步答案以帮助其他可能需要帮助的人:
Connect the two ViewControllers in Storyboard which will create a segue.
您只需选择第一个视图控制器(确保 viewController 用蓝线突出显示,并且您没有像图像视图或导航项那样选择。然后 CTRL 并单击目标视图控制器(您要转换到的位置) ).
中间的圆圈称为segue。如果您单击它并转到右侧的属性面板,您将看到:
在标识符中输入您要调用此转换的名称:例如 myNewPage。
只要您准备好呼叫下一个场景。使用此委托方法将数据从一个控制器传递到另一个控制器或执行任何特殊操作:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NameOfDestinationController *dataViewController;
dataViewController = segue.destinationViewController;
if ([segue.identifier isEqualToString:@"nameOfYourSegueIdentifier"]) {
dataViewController.variable1 = self.variable1;
...
}
}
然后在我的情况下,我需要在 AFNetworking Web 服务调用成功后触发 segue。所以在 Success 块中我添加了这一行:
[self performSegueWithIdentifier:@"nameOfYourSegueIdentifier" sender:self];
现在完美运行!!!