我想在Table View上显示从服务器获取的JSON数据。问题是,我无法让它显示出来。我已经尝试了几种不同的方法并进行了大量搜索以找到解决方案,但我不能。
我的代码(所有内容)如下所示,我希望有人可以帮助我。提前谢谢。
import UIKit
import Alamofire
import SwiftyJSON
class MasterViewController: UITableViewController {
var tableTitle = [String]()
var tableBody = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
getJSON()
}
func getJSON(){
Alamofire.request(.GET, "http://announcement.vassy.net/api/AnnouncementAPI/Get/").responseJSON { (Response) -> Void in
// checking if result has value
if let value = Response.result.value {
let json = JSON(value)
for anItem in json.array! {
let title: String? = anItem["Title"].stringValue
let body: String? = anItem["Body"].stringValue
self.tableTitle.append(title!)
self.tableBody.append(body!)
}
}
}
self.tableView.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Table View Stuff
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tableTitle.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell
// cell config
cell.title!.text = tableTitle[indexPath.row]
cell.body!.text = tableBody[indexPath.row]
return cell
}
}
答案 0 :(得分:8)
Alamofire网络请求是异步的,这意味着当结果返回时,您无法知道。
这里的问题是您在Alamofire请求的范围之外重新加载tableView ,因此它会在数据返回之前执行。
重新加载应该在相同的范围内,并在主线程上,例如:
func getJSON(){
Alamofire.request(.GET, "http://announcement.vassy.net/api/AnnouncementAPI/Get/").responseJSON { (Response) -> Void in
// checking if result has value
if let value = Response.result.value {
let json = JSON(value)
for anItem in json.array! {
let title: String? = anItem["Title"].stringValue
let body: String? = anItem["Body"].stringValue
self.tableTitle.append(title!)
self.tableBody.append(body!)
}
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
}
}
答案 1 :(得分:0)
我认为@Eric在他的回答中说了几乎所有内容,然而,不是它在设计中做出了一个很好的决定,保持代码使网络请求在同一个Section
这两个事物之间保持一致是独立的,因不同的原因而改变。
我的建议是将代码的两个部分分开来解耦两个层之间的依赖关系。这样,当您需要更改与您的网络请求处理程序相关的任何内容时,您不需要在您提出相同请求的任何地方更改它,这是一个建议!
如果你想这样做,你可以使用闭包来处理Alamofire passgin的异步行为你在处理网络请求的包装器中的UITableViewController
,例如,让我们定义一个使用单例模式的简单包装器(它仅用于解释样本,您可以根据需要处理它)。
completionHandler
然后在你的import AlamofireImage
import SwiftyJSON
class NetworkHandler {
/// The shared instance to define the singleton.
static let sharedInstance = RequestManager()
/**
Private initializer to create the singleton instance.
*/
private init() { }
func getJSON(completionHandler: (json: JSON?, error: NSError?) -> Void) {
Alamofire.request(.GET, http://announcement.vassy.net/api/AnnouncementAPI/Get/).responseJSON { response in
switch(response.result) {
case .Success(let value):
let json = JSON(value)
completionHandler(json: json, error: nil)
case .Failure(let error):
completionHandler(json: nil, error: error)
}
}
}
}
中,你可以用这种方式给Alamofire打电话给新包装:
UITableViewController
以上述方式保持代码分离,这是一个很好的设计。
我希望这可以帮到你