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