我正在解析来自HERE的JSON数据。
因为我使用了这段代码。
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()
}
}
和 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
}
}
在控制台中我得到的数据如下:
[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]
但它没有将其打印到tableView
。
答案 0 :(得分:5)
在viewDidLoad
中的 for loop 完成后,您获得了数据,您必须致电:
tableView.reloadData()
答案 1 :(得分:0)
我也关注我的iOS应用程序的Ray教程,发现数据管理器无法在for循环之外传递数据。所以我用另一种方法来解析swiftyJSON。我花了一天时间搞清楚这一点。所以与我分享我的解决方案。我调用一个url来获取json数据和json中的医院坐标列表,并在解析数据后将位置添加到mapKit。
让locationURL = NSURL(字符串:" http:你的网址") 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)
}