所以我一直在尝试使用来自互联网的一些JSON data
来填充TableViewController。 TableViewController只是不显示数据。我已经调试过并试图追踪我的常数& vars尽可能多地查看我是否收到了错误的数据,但数据似乎没问题。
import UIKit
import SwiftyJSON
import Alamofire
class TableController: UITableViewController {
var TableData:Array < Datenstruktur > = Array < Datenstruktur>()
let serverURL = "http://api.androidhive.info/contacts/"
struct Datenstruktur{
var name:String?
var email:String?
init(add: NSDictionary){
name = add["name"] as? String
email = add["email"] as? String
}
}
@IBOutlet var tableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
//tableview.dataSource = self
//tableview.delegate = self
get_data_from_server(serverURL)
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
所以这将是我为我的TableData创建的结构以及我的viewDidLoad(),它基本上只调用函数get_data_from_server(serevrURL)
。
跟进是我的tableView函数
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
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 {
// #warning Incomplete implementation, return the number of rows
return TableData.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) //as! UITableViewCell
let data = TableData[indexPath.row]
cell.textLabel?.text = data.name
cell.detailTextLabel?.text = data.email
return cell
}
在我func get_data_from_server()
我使用最新的Alamofire框架从服务器获取json。由于我也使用SwiftyJSON,所以收到的JSON被解析并在另一个func调用中使用,其中实际应该填充数据extract_json()
func do_table_refresh()
{
dispatch_async(dispatch_get_main_queue(), {
self.tableview.reloadData()
return
})
}
func get_data_from_server(url:String)
{
Alamofire.request(.GET, url).validate().responseJSON { response in
switch response.result {
case .Success:
if let value = response.result.value {
let json = JSON(value)
self.extract_json(json)
}
case .Failure(let error):
print(error)
}
}
}
func extract_json(data:JSON)
{
let jsonData: JSON = data
var namesDictionary: Dictionary<String, String> = [:]
for var i = 0; i < jsonData["contacts"].count ; i++ {
print(i)
namesDictionary["name"] = jsonData["contacts"][i]["name"].stringValue
namesDictionary["email"] = jsonData["contacts"][i]["name"].stringValue
TableData.append(Datenstruktur(add: namesDictionary))
}
//do_table_refresh()
}
}
}
正如您所看到的,我还有一个do_table_refresh()来重新加载tableview的数据 - 但是当我尝试使用它时,我得到了Thread1: EXC_BAD_INSTRUCTION (code=EXC...
我也试过print(TableData)
并且我已经看到里面确实有数据,但是它的可选..我需要打开它还是什么?我觉得我的代码几乎没问题......至少就我能跟踪数据而言:D
仅供参考:我实际上是Swift的新手,我也没有任何ObjectiveC经验 - 但我有C,C ++和Java背景......
非常感谢帮助 谢谢!
编辑:
我修好了!
在我的Alamofire.request(在get_data_from_server()
内)添加此内容后,我的TableView填充了数据。
if self.TableData.count > 0 {
self.tableView.reloadData()
}
所以我的get_data_from_server()
现在看起来像这样:
func get_data_from_server(url:String)
{
Alamofire.request(.GET, url).validate().responseJSON { response in
switch response.result {
case .Success:
if let value = response.result.value {
let json = JSON(value)
self.extract_json(json)
if self.TableData.count > 0 {
self.tableView.reloadData()
}
}
case .Failure(let error):
print(error)
}
}
}
由于我没有使用do_table_refresh()
我想我会删除它。我已经在某处读过我的Alamofire请求无论如何都不会在这个调度队列中结束。所以我的问题是为什么会这样?什么实际上最终在该队列中,所以什么时候使用dispatch_asynch(dispatch_get_main_queue(),{})
?