0

So I'm trying to access data from an API that gives me a JSON file with local businesses, I'm using swiftyJSON to get the data from the JSON file and then checking if they are not nil to the assign them to public variables and then create objects(Venues) from said data. But the problem is that I can't append the objects(Venues) to my Venues Array.

Here is my code:

//File Name: ViewController.swift

import UIKit
import QuadratTouch
import SwiftyJSON
import CoreLocation

class ViewController: UITableViewController{

   //Here I create an empty array of Venue Objects  
   var venuesArr = [Venue]()


    override func viewWillAppear(animated: Bool) {

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        callAPI()
        // Do any additional setup after loading the view, typically from a nib.
    }

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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell")! as UITableViewCell

        cell.textLabel?.text = self.venuesArr[indexPath.row].name
        return cell
    }

    func callAPI(){

        let session = Session.sharedSession()
        var parameters = [Parameter.section: "food" ]
        parameters += [Parameter.near:"Massachusetts"]
        parameters += [Parameter.radius:"16093"]
        parameters += [Parameter.limit:"20"]
        let searchTask = session.venues.explore(parameters) {
            (result) -> Void in
            if let response = result.response {
                myJSON = JSON(response)

                let group = myJSON["groups"][0]

                for var i = 0; i < 20;i++ {

                    var items = group["items"][i]
                    var venue = items["venue"]


                    if venue["name"] != nil{
                        venueName = venue["name"].string as String!
                    }

                    if venue["hours"]["status"] != nil{
                        venueHoursStatus = venue["hours"]["status"].string as String!
                    }

                    if venue["hours"]["isOpen"] != nil{
                        venueIsOpen = Bool(venue["hours"]["isOpen"])
                    }

                    let venueRating = venue["rating"].doubleValue

                    if venue["location"]["address"] != nil{
                        venueStreetAddress = venue["location"]["address"].string as String!
                    }

                    if venue["location"]["city"] != nil{
                        venueCity = venue["location"]["city"].string as String!
                    }

                    if  venue["location"]["postalCode"] != nil{
                        venuePostalCode = venue["location"]["postalCode"].string as String!
                    }

                    if venue["location"]["state"] != nil{
                        venueState = venue["location"]["state"].string as String!
                    }

                    if (venue["hasMenu"] != nil){
                        venueHasMenu = Bool(venue["hasMenu"])
                    }

                    if (venue["menu"]["mobileUrl"] != nil){
                        venueMenuURL = venue["menu"]["mobileUrl"].string as String!
                    }


                    let venueObject = Venue(name: venueName, hoursStatus: venueHoursStatus, isOpen: venueIsOpen, streetAddress: venueStreetAddress, city: venueCity, state: venueState, postalCode: venuePostalCode, hasMenu: venueHasMenu, menuURL: venueMenuURL, rating: venueRating)

                    //Here is the PROBLEM ----------
                    self.venuesArr.append(venueObject) //--------> This gets called and stores the objects
                     //Here is the PROBLEM ----------

                }//end of loop

            }
        }
        searchTask.start()


    }




    // Override point for customization after application launch.


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


}

Here is the class definition for Venue

//File Name: Venue.swift
import Foundation

public class Venue{

var name: String
var hoursStatus: String
var hasMenu: Bool
var isOpen: Bool
var streetAddress : String
var city : String
var postalCode : String
var state: String
var menuURL:String
var rating: Double


init(name:String, hoursStatus: String, isOpen: Bool, streetAddress : String, city : String, state: String, postalCode : String, hasMenu: Bool, menuURL:String, rating: Double){

    self.name = name
    self.hoursStatus = hoursStatus
    self.hasMenu = hasMenu
    self.isOpen = isOpen
    self.streetAddress = streetAddress
    self.city = city
    self.postalCode = postalCode
    self.state = state
    self.menuURL = menuURL
    self.rating = rating

  }   
}

The debugger shows me that the objects are stored, but then when I try to access them, they aren't there anymore. Please help! image of debugger enter image description here

Here is my last file that holds some variables:

//File Name: Variables.swift
import Foundation
import SwiftyJSON

//JSON that contains API info
public var myJSON:JSON!

//Venue variables
public var venueName: String!
public var venueHoursStatus: String!
public var venueIsOpen: Bool!
public var venueStreetAddress: String!
public var venueCity: String!
public var venuePostalCode: String!
public var venueState:String!
public var venueHasMenu: Bool!
public var venueMenuURL: String!
4
  • The function callAPI can't possibly compile. The variables venueName, venueHoursStatus, are not declared (with var, let) anywhere. Commented Dec 29, 2015 at 3:15
  • Sorry! I forgot to mention that those are public variables that I declared in another file. So that isn't the problem Commented Dec 29, 2015 at 3:20
  • Okay. How do you 'try to access them'? Commented Dec 29, 2015 at 3:27
  • EX: I have a file called variables.swift that holds "public var venueHasMenu: Bool!" then I go to my view controller, I fetch the data from an API and set the value of venueHasMenue = (data from API). Since they are public vars there isn't an specific way to access them, right? PS: I've added the file that holds the variables to my question, sorry for the confusion. Commented Dec 29, 2015 at 3:49

1 Answer 1

1

Ultimately I was trying to display the data in the array to a tableView, and then I realized I didn't reload the tableview at the end of callAPI() so I simply inserted self.tableView.reloadData() and then it worked!

I thought the objects weren't being appended into the array, but they were. The actual problem was that I wasn't reloading the datasource of my tableview.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.