3

I am parsing JSON data from HERE.

for that I have used this code.

DataManager.swift

import Foundation

let TopAppURL = "http://api.feedzilla.com/v1/categories.json"

class DataManager {

class func getTopAppsDataFromItunesWithSuccess(success: ((iTunesData: NSData!) -> Void)) {
    //1
    loadDataFromURL(NSURL(string: TopAppURL)!, completion:{(data, error) -> Void in
        //2
        if let urlData = data {
            //3
            success(iTunesData: urlData)
        }
    })
}

class func loadDataFromURL(url: NSURL, completion:(data: NSData?, error: NSError?) -> Void) {
var session = NSURLSession.sharedSession()

// Use NSURLSession to get data from an NSURL
let loadDataTask = session.dataTaskWithURL(url, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
  if let responseError = error {
    completion(data: nil, error: responseError)
  } else if let httpResponse = response as? NSHTTPURLResponse {
    if httpResponse.statusCode != 200 {
      var statusError = NSError(domain:"com.raywenderlich", code:httpResponse.statusCode, userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
      completion(data: nil, error: statusError)
    } else {
      completion(data: data, error: nil)
    }
  }
})

loadDataTask.resume()
 }
}

and ViewController.swift

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

var i = 0
var detailid = [Int]()
var detailCat = [String]()
var tableData = ["1","2","3"]

@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()

DataManager.getTopAppsDataFromItunesWithSuccess { (iTunesData) -> Void in
    
    let json = JSON(data: iTunesData)
    
    if let array = json.arrayValue{

        for Dict in array{
            var id : Int = array[self.i]["category_id"].integerValue!
            var category : String = array[self.i]["english_category_name"].stringValue!
            self.detailid.append(id)
            self.detailCat.append(category)
            
            self.i++
            
        }
        println(self.detailid)
        println(self.detailCat)
    }
}


}

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


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
    cell.textLabel.text = self.detailCat[indexPath.row]
    return cell
    
   }

}

In console I am getting data like:

[1314, 13, 21, 22, 5, 588, 6, 17, 25, 1168, 11, 14, 2, 28, 15, 33, 591, 20, 29, 36, 3, 10, 16, 18, 8, 34, 4, 27, 30, 31, 26, 23, 12, 7, 590, 9, 19]
[Sports, Art, Blogs, Business, Celebrities, Columnists, Entertainment, Events, Fun Stuff, General, Health, Hobbies, Industry, Internet, IT, Jobs, Law, Life Style, Music, Oddly Enough, Politics, Products, Programming, Religion And Spirituality, Science, Shopping, Society, Sports, Technology, Top Blogs, Top News, Travel, Universities, USA, Video, Video Games, World News]

but It is not printing it into tableView.

what I am missing? please help me for this.

2 Answers 2

5

After your for loop in viewDidLoad is finished, and you got your data, you have to call :

tableView.reloadData()
Sign up to request clarification or add additional context in comments.

Comments

0

I also follow Ray's tutorial for my iOS apps and found that data manager cannot pass data outside the for loop. So I use another way to parse swiftyJSON. It took me a day to figure this out. So share with you my solution. I call a url to get json data with list of hospital coordinates in json and add locations to mapKit after parsing the data.

let locationURL = NSURL(string: "http: your url") var request = NSURLRequest(URL:locationURL!) var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)

    let json = JSON(data: data!)

    if let appArray = json.array {

            for appDict in appArray {
                var appName: String? = appDict["title"].string
                var appLocation: String? = appDict["locationName"].string
                var dLatitude: Double? = appDict["latitude"].doubleValue
                var dLongitude: Double? = appDict["longitude"].doubleValue
                var coordinate: CLLocationCoordinate2D? = CLLocationCoordinate2D(latitude: dLatitude!, longitude: dLongitude!)


                hospital = HospitalModel(title: appName!,
                    locationName: appLocation!,
                    coordinate: CLLocationCoordinate2D(latitude: dLatitude!, longitude: dLongitude!))

                hoslist.append(hospital)

            }
            mapView.addAnnotations(hoslist)

        }

    mapView.addAnnotations(hoslist)

    }

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.