执行自动搜索

时间:2018-08-11 03:39:57

标签: ios swift segue uistoryboardsegue

我正在下载远程JSON数据,并希望我的加载屏幕一直显示到下载完成为止。一旦我的parse方法运行完毕,就应该调用segue来自动移至下一个视图。

我已验证我的数据已正确下载和解析。当我抛出一个断点时,我的performSegue函数甚至被调用。但是该应用程序仍未移至下一个视图。

在这里我要调用我的parse方法,然后立即调用所需的segue:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    downloadSources(atURL: "https://newsapi.org/v1/sources?language=en")
    performSegue(withIdentifier: "loadingFinished", sender: self)
}

作为参考,如果需要的话,以下是我完整的解析方法:

func downloadSources(atURL urlString: String) {
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    if let validURL = URL(string: urlString) {
        var request = URLRequest(url: validURL)
        request.setValue("49fcb8e0fa604e7aa461ee4f22124177", forHTTPHeaderField: "X-Api-Key")
        request.httpMethod = "GET"

        let task = session.dataTask(with: request) { (data, response, error) in
            if error != nil {
                assertionFailure()
                return
            }

            guard let response = response as? HTTPURLResponse,
            response.statusCode == 200,
            let data = data

                else {
                    assertionFailure()
                    return
            }

            do {
                if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                    guard let sources = json["sources"] as? [[String: Any]]

                        else {
                            assertionFailure()
                            return
                    }

                    for source in sources {
                        guard let id = source["id"] as? String,
                        let name = source["name"] as? String,
                        let description = source["description"] as? String

                            else {
                                assertionFailure()
                                return
                        }

                        self.sources.append(Source(id: id, name: name, description: description))
                    }
                }
            }

            catch {
                print(error.localizedDescription)
                assertionFailure()
            }
        }

        task.resume()
    }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

您想要的是听起来像闭包回调的声音。 希望这对您有用。

typealias CompletionHandler = ((_ success:Bool) -> Void)?

override func viewDidLoad() {
    super.viewDidLoad()
        downloadSources(atURL: "www.example.com", completion: {
            if success {
                performSegue(withIdentifier: "loadingFinished", sender: self)
                return
            }
            // otherwise deal with failure
    })
}

func downloadSources(atURL urlString: String, completion: CompletionHandler) {
    if error != nil {
        completion?(false)
        return
    }
    // finish downlaod
    completion?(true)
}

快乐编码!