我如何获取数据并在viewdidload中使用它...不在函数内部?

时间:2019-05-10 06:28:34

标签: ios swift

我想打印从viewDidLoad获取的数据。 我不想从自定义函数本身打印它。 当我在viewDidLoad中调用fetch函数时。它应该获取所有数据。 然后,我应该能够从viewDidLoad本身或任何地方访问或打印该数据。

class ContactViewController: UIViewController {


@IBOutlet var lblEmail: UILabel!
@IBOutlet var lblLocation: UILabel!
@IBOutlet var mapUIView: UIView!

var email = String()
var location = String()
var lati = Double()
var long = Double()


override func viewDidLoad() {
    super.viewDidLoad()


    self.fetchData()
    print(email)
    self.lblEmail.text = self.email


}

func fetchData(){

    let manager = APIManager()
    manager.parsingGet(url: BaseURL.contact) { (JSON, Status) in

        if Status {
            let dict = JSON.dictionaryObject
            let data = dict!["data"] as! [String:Any]

           // let lat = data["latitude"] as! Double
           // let lon = data["longitude"] as! Double
            let mail = data["email"] as! String
            let loc = data["location"] as! String

            DispatchQueue.main.async {

                self.email = mail
                self.location = loc
               // self.lati = lat
               //self.long = lon

            }


        }


    }


}


}

2 个答案:

答案 0 :(得分:2)

您无法在viewDidLoad()方法中打印将从API响应中获取的任何数据,因为viewDidLoad()方法中指定的所有代码行都将被背靠背执行,并且不会等待您的API调用即将结束。

即使您拥有快速的服务器,也要花费几毫秒的时间才能访问您的API并获得响应。届时,您的编译器将使用viewDidLoad()方法执行所有代码行。

因此,您最好使用DispatchQueue.main.async方法在fetchData()中打印数据。

您可以尝试使用回调函数。那可能是实现所需目标的一种可能方式。尝试这样的事情...。

override func viewDidLoad() {
    super.viewDidLoad()


    getData(completion:{ result in
    print(email)
    self.lblEmail.text = self.email
})


}

func getData(completion: (Bool)->()) {
    if status{
        let dict = JSON.dictionaryObject
        let data = dict!["data"] as! [String:Any]
        let mail = data["email"] as! String
        let loc = data["location"] as! String

        DispatchQueue.main.async {

            self.email = mail
            self.location = loc
            completion(true)

        }

    } else {
        completion(false)
    }
}

答案 1 :(得分:2)

parsingGet异步工作。解决方案非常简单:在API的完成处理程序中将值分配给标签

override func viewDidLoad() {
    super.viewDidLoad()
    self.fetchData()
}

func fetchData() {

    let manager = APIManager()
    manager.parsingGet(url: BaseURL.contact) { (JSON, status) in

        if status {
            let dict = JSON.dictionaryObject
            let data = dict!["data"] as! [String:Any]

            // let lat = data["latitude"] as! Double
            // let lon = data["longitude"] as! Double
            let mail = data["email"] as! String
            let loc = data["location"] as! String

            self.email = mail
            self.location = loc
            print(mail)

            DispatchQueue.main.async {    
                self.lblEmail.text = mail
            }
        }
    }
}