首页 > 解决方案 > 调用函数将 Json 从视图控制器解析到其他视图

问题描述

我会从其他视图控制器中的视图控制器调用一个函数。此函数将解析 json 并将数据放入结构中的全局数组中,问题是如果我将函数放入 ViewDidAppear 它将向 Web 服务发出大量请求,如果我将函数放入 ViewDidLoad它不会下载数据,这是我要调用的函数

@objc func pazienti(completionHandler: @escaping () -> Void) {

    let endpoint = MyStruct.endpointpazienti()
    ArrayGlobale.listapazienti.removeAll()
    guard let url = URL(string: endpoint) else {
        print("Error: cannot create URL")
        let error = BackendError.urlError(reason: "Could not construct URL")
        completionHandler()
        //
        return
    }
    let urlRequest = URLRequest(url: url)

    let session = URLSession.shared

    let task = session.dataTask(with: urlRequest) {
        (data, response, error) in
        guard data != nil else {
            //self.updateUserInterface()
            print("Error: did not receive data")
            completionHandler()
            return
        }
        guard error == nil else {
            completionHandler()
            return
        }

        //            let decoder = JSONDecoder()
        //            do {
        //                let todos = try decoder.decode([MyStruct].self, from: responseData)
        //                completionHandler(todos, nil)
        //            } catch {
        //                print("error trying to convert data to JSON")
        //                print(error)
        //                completionHandler(nil, error)
        //            }
        do
        {
            let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [[String:Any]] ?? []
            print(json)
            for x in json
            {
                print(x["nome"]!)
                 ArrayGlobale.listapazienti.append(ListaPazienti(nome: x["nome"] as! String, cognome: x["cognome"] as! String, id : x["id"] as! String, data : x["data"] as! String, sesso : x["sesso"] as! String))

                //print(ArrayGlobale.listapazienti)
                //sleep(4)
            }

        }catch
        {

        }
    }
    task.resume()
    ArrayGlobale.action = completionHandler

}

调用此函数是 self.pazienti { } 但我尝试使用全局函数创建一个扩展类,这将发出一些阻塞服务器的请求。

标签: jsonswiftfunction

解决方案


您没有向我们展示任何会导致问题的代码。如果你去,viewDidAppear你可能需要引入一些状态,以便知道请求是否已经在进行中(dataTask如果是,则不要安排另一个)。另一方面,你viewDidLoad应该做你需要的,它应该只被调用一次。

然而,除非真的没有其他解决方案,否则将您的 completionHandler 存储在某种全局变量中很可能不仅是一个坏主意,而且是一个非常糟糕的主意。据我从您的设计中可以看出,它似乎位于“错误”对象内。但是,您提供很少的代码来真正判断这一点。请至少将您的回调代码添加到问题中,以便我修改答案。func pazienti


推荐阅读