Ios 如何获取数据并在viewdidload中使用它…而不是在函数内部?
我想打印从Ios 如何获取数据并在viewdidload中使用它…而不是在函数内部?,ios,swift,Ios,Swift,我想打印从viewDidLoad获取的数据。 我不想从自定义函数本身打印它。 当我在viewDidLoad中调用fetch函数时,它应该获取所有数据。 在那之后,我应该能够从viewDidLoad本身或任何地方访问或打印数据 class ContactViewController: UIViewController { @IBOutlet var lblEmail: UILabel! @IBOutlet var lblLocation: UILabel! @IBOutlet var mapU
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()
方法执行所有代码行
因此,您最好在fetchData()
方法中的DispatchQueue.main.async
中打印数据
您可以尝试使用回调函数。这可能是实现你想要的目标的一种可能的方式。试试这样的
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)
}
}
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
}
}
}
}
相关:为什么您坚持在
viewDidLoad
返回之前获取所有数据?从互联网获取数据需要时间。