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

时间:2019-03-16 20:29:31

标签: swift swift4

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

 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")
        }
}

2 个答案:

答案 0 :(得分:1)

如果没有数据,视图控制器毫无意义,也许您应该考虑先尝试获取数据,然后再决定是否推送/显示UIViewController。 在那种情况下,实例化视图控制器的任何人都将首先尝试检索JSON,只有在成功实例化并将数据传递到所提到的视图控制器的情况下,才进行检索。

第二个选项是您的视图控制器检查数据本身,如果找不到数据,则在解散自身之前向用户提供信息。你可以通过以下方式实现这一目标:

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

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

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

答案 1 :(得分:0)

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