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