Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Populating tableview cells from JSON with Alamofire (Swift 2)

I have the following code.

import UIKit
import Alamofire

class CheHappyTableViewController: UITableViewController, NSURLConnectionDelegate {

    var happyHours = [HappyHour]()

    override func viewDidLoad() {
        super.viewDidLoad()

        //Load the cell elements
        loadHappyHourElements()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func loadHappyHourElements(){

        let testhappyhour:HappyHour = HappyHour(title: "TEST", image: "TESST", description: "TEST", postedDate: "TEST")
        self.happyHours.append(testhappyhour)

        let url:String = "https://gist.githubusercontent.com/arianitp/036133ebb5af317a595c/raw/f134ec241ec3126bedd6debe5de371e3e01d225b/happyhours.json"
        Alamofire.request(.GET, url, encoding:.JSON).responseJSON
            { response in switch response.result {
            case .Success(let JSON):
                let response = JSON as! NSArray
                for item in response { // loop through data items
                    let obj = item as! NSDictionary
                    let happyhour = HappyHour(title:obj["title"] as! String, image:obj["image"] as! String, description:obj["description"] as! String, postedDate:obj["date"] as! String)
                    self.happyHours.append(happyhour)
                }

            case .Failure(let error):
                print("Request failed with error: \(error)")
                }
        }
        self.tableView.reloadData()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return happyHours.count
    }

    //Displays the cells in the table
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        self.tableView.rowHeight = UIScreen.mainScreen().bounds.size.width
        let cellIdentifier = "CheHappyTableViewCellController"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CheHappyTableViewCellController

        let happyHour = happyHours[indexPath.row]
        cell.lblTitle.text = happyHour.title
        //cell.cheHappyImage = happyHour.photo

        // Configure the cell...
        return cell
    }
}

The table cells don't get updated even though I included the self.tableView.reloadData() in the Alamofire request complete function. I have defined also one Sample Object with Title and all Properties set to "TEST", this does get loaded, however the JSON file doesn't populate the table. I can see the file is being downloaded correctly and read, but I think the elements are either not being added to the Property Variable happyHours or somehow the elements are not being reloaded.

I tried many solutions from here but without success. What am I doing wrong?

like image 433
Rinor Bytyçi Avatar asked Feb 19 '16 13:02

Rinor Bytyçi


1 Answers

Your self.tableView.reloadData() line is outside the callback, meaning that it gets called straight away, before the data has been loaded. Try this:

func loadHappyHourElements(){

    let testhappyhour:HappyHour = HappyHour(title: "TEST", image: "TESST", description: "TEST", postedDate: "TEST")
    self.happyHours.append(testhappyhour)

    let url:String = "https://gist.githubusercontent.com/arianitp/036133ebb5af317a595c/raw/f134ec241ec3126bedd6debe5de371e3e01d225b/happyhours.json"
    Alamofire.request(.GET, url, encoding:.JSON).responseJSON
        { response in switch response.result {
        case .Success(let JSON):
            let response = JSON as! NSArray
            for item in response { // loop through data items
                let obj = item as! NSDictionary
                let happyhour = HappyHour(title:obj["title"] as! String, image:obj["image"] as! String, description:obj["description"] as! String, postedDate:obj["date"] as! String)
                self.happyHours.append(happyhour)
            }
            self.tableView.reloadData()

        case .Failure(let error):
            print("Request failed with error: \(error)")
            }
    }
}
like image 61
Tometoyou Avatar answered Nov 08 '22 18:11

Tometoyou