Stroi
Stroi

Reputation: 1951

Alamofire download from JSON API

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

Answers (3)

Stroi
Stroi

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

naglerrr
naglerrr

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

Kayla Galway
Kayla Galway

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

Related Questions