我想打印从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

            }


        }


    }


}


}

最佳答案

您无法在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)
    }
}

09-25 16:37
查看更多