Reputation: 1951
I'm trying to set text on a label from api, but it seems that the function doesn't even get called. Please refer to the snippet below. Is there anything wrong with it?
EDIT: typealias DownloadComplete = () -> ()
var date: String = ""
override func viewDidLoad() {
super.viewDidLoad()
timeLbl.text = date
// Do any additional setup after loading the view.
}
func downloadTimeData(completed: @escaping DownloadComplete) {
//Downloading forecast weather data for TableView
Alamofire.request(APIURL).responseJSON { response in
let result = response.result
if let dict = result.value as? Dictionary<String, AnyObject> {
if let currentDate = dict["fulldate"] as? String {
self.date = currentDate
print(self.date)
print("xxx")
}
}
completed()
}
}
Upvotes: 2
Views: 966
Reputation: 1951
I figured it out with simpler and easier way, through the alamofire documetation.
override func viewDidLoad() {
super.viewDidLoad()
Alamofire.request(APIURL).responseJSON { response in
print(response.result) // result of response serialization
let result = response.result
if let dict = result.value as? Dictionary<String, AnyObject> {
let currentDate = dict["fulldate"] as? String
self.timeLbl.text = currentDate
}
}
}
Upvotes: 1
Reputation: 2854
In the code you posted you are not calling downloadTimeData(completed:)
anywhere.
You can do that in viewDidAppear(_:)
for example:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
downloadTimeData {
// The request has completed
timeLbl.text = date
}
}
Note that you may need to change the call slightly, depending on how DownloadComplete
is defined.
Upvotes: 0
Reputation: 672
You are setting timeLbl.text immediately on page load in viewDidLoad, but you haven't told the app to do anything else.
You have to move downloadTimeData to viewDidLoad, and in the completion, set 'timeLbl.text = date'
You have to set some sort of text place holder or loader while your call is being made, because you can't guarantee that it is instant.
Are we setting one label? Or a whole tableview of labels?
I changed some syntax to be "swiftier"
var date = ""
override func viewDidLoad() {
super.viewDidLoad()
//call downloadTimeData here
downloadTimeData() {
//once we are in completion, this means internet call finished, so set label now
self.timeLbl.text = date
}
}
func downloadTimeData(completed: @escaping DownloadComplete) {
//Downloading forecast weather data for TableView
Alamofire.request(APIURL).responseJSON { response in
guard let dict = response.result.value as? [String: AnyObject], let currentDate = dict["full date"] as? String else {
//handle error here if response fails to give you good data
completed()
return
}
self.date = currentDate
print(self.date)
print("xxx")
completed()
}
}
Upvotes: 0