如果 URL 无法加载,则取消视图控制器的加载 - Swift 4

Cancelling a view controller from loading if a URL cannot load - Swift 4

加载视图控制器时,它必须通过 URL 获取 JSON 文件。如果互联网中断,我希望它取消加载视图控制器。这是到目前为止的代码,我知道它在捕获中是错误的,但它让您了解我需要做什么。所以总的来说,我是否应该使用与 viewDidLoad() 不同的覆盖,因为它 "did" 加载?

 override func viewDidLoad() {

        var jsonText = ""
        if let url = URL(string: "http://thedomain.com/eventlistjson_r2.asp") {
            do {
                jsonText = try String( contentsOf: url,encoding: .utf8)
            } catch {
                // contents could not be loaded
                print(error)
                super.dismiss(animated: true)
            }
        } else {
            // the URL was bad!
            print("the URL was bad")
        }
}

这个

jsonText = try String( contentsOf: url,encoding: .utf8)

阻塞了主线程,所以当用户点击 vc 上的一个按钮来推动 vc 时,在用户看来应用程序没有运行,你应该做的是在 mainVC

里面
// add loading 
// make the call in a background thread such as URLSession.shared or Alamofire
// then decide inside the callback whether to proceed with push/segue or stay in that mainVC

此外还有一个解雇

self.dismiss(animated: true) // not super 

如果你的视图控制器没有数据就毫无意义,也许你应该考虑先尝试获取数据,然后再决定是否 push/present UIViewController。 在那种情况下,无论谁实例化视图控制器,都会首先尝试检索 JSON,并且只有在成功实例化并将数据传递给提到的视图控制器的情况下。

第二个选项是您的视图控制器自己检查数据,如果 none 找到,在关闭之前向用户提供信息。你可以f.e。通过以下方式实现:

  1. 直接在您的视图控制器视图中显示信息(然后 viewDidLoad() 将是合适的位置)并让用户可以通过按后退按钮导航回来。
  2. 呈现 UIAlertController,您的视图控制器会在按下警报确认按钮时自行关闭。

无论如何,在没有任何反馈的情况下加载和关闭视图控制器会引发糟糕的用户体验或设计。

如果您向我们提供有关背后逻辑和预期行为的更多详细信息,也许我可以尝试提供更好的答案,但我相信上述任何一种方法都是一个好的开始。