如果我从服务器得到某个响应,我只想执行一个 segue。迅速,我怎么能等到我得到回复才能继续?
问问题
2040 次
1 回答
1
最重要的是,您不会“等待”响应,而是简单地指定响应到来时您希望发生的事情。例如,如果您想在完成某些网络请求时执行 segue,您应该使用完成处理程序模式。
这里的问题是您可能习惯于将您的 UI 控件与 Interface Builder 中的 segue 挂钩。在我们的例子中,我们不想这样做,而是想要执行网络请求,然后让它的完成处理程序以编程方式调用 segue。因此,我们必须创建一个可以以编程方式执行的 segue,然后将您的按钮连接到@IBAction
执行网络请求的按钮上,如果合适的话,以编程方式执行 segue。但是,请注意,不应该直接连接到按钮的 segue。我们将以编程方式进行。
例如:
control通过从第一个场景上方栏中的视图控制器图标拖动到第二个场景,将 segue 定义为两个视图控制器之间:
通过选择 segue 并转到“Attributes Inspector”选项卡,为该 segue 提供故事板标识符:
将按钮(或任何会触发此 segue 的东西)连接到
@IBAction
.编写一个
@IBAction
执行网络请求,并在完成后以编程方式调用该 segue:@IBAction func didTapButton(_ sender: Any) { let request = URLRequest(...). // prepare request however your app requires let waitingView = showWaitingView() // present something so that the user knows some network request is in progress // perform network request let task = URLSession.shared.dataTask(with: request) { data, response, error in // regardless of how we exit this, now that request is done, let's // make sure to remove visual indication that network request was underway defer { DispatchQueue.main.async { waitingView.removeFromSuperview() } } // make sure there wasn't an error; you'll undoubtedly have additional // criteria to apply here, but this is a start guard let data = data, error == nil else { print(error ?? "Unknown error") return } // parse and process the response however is appropriate in your case, e.g., if JSON: // // guard let responseObject = try? JSONSerialization.jsonObject(with data) else { // // handle parsing error here // return // } // // // do whatever you want with the parsed JSON here // do something with response DispatchQueue.main.async { performSegue(withIdentifier: "SegueToSceneTwo", sender: self) } } task.resume() } /// Show some view so user knows network request is underway /// /// You can do whatever you want here, but I'll blur the view and add `UIActivityIndicatorView`. private func showWaitingView() -> UIView { let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .Dark)) effectView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(effectView) NSLayoutConstraint.activateConstraints([ effectView.leadingAnchor.constraintEqualToAnchor(view.leadingAnchor), effectView.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor), effectView.topAnchor.constraintEqualToAnchor(view.topAnchor), effectView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor) ]) let spinner = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge) effectView.addSubview(spinner) spinner.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activateConstraints([ spinner.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor), spinner.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor) ]) spinner.startAnimating() return effectView }
于 2016-07-27T18:15:46.547 回答