如何从网络请求中提取数据后重新加载视图控制器?

如何从网络请求中提取数据后重新加载视图控制器?

问题描述:

我有一个问题,似乎无法修复后,在网上看到的教程和其他SO问题与类似的问题,这让我觉得我做了一些错误/在我的代码相关的不良做法。如何从网络请求中提取数据后重新加载视图控制器?

我有2个表视图控制器。

第一个TableViewController从数据库中填充,所有这些工作正常。当我点击其中一个单元时,它会继续到第二个TableViewController,它也应该从数据库中填充(取决于您在第一个VC中选择的内容)。

目前,如果我点击TVC1中的一个单元格,它会转到TVC2并且它是空的,然后我在导航控制器内点击并选择其他内容,它会返回到TVC2并向我显示我的第一个选择。这表明TVC2在网络从数据库返回数据之前正在加载....所以,我尝试在不同的地方使用tableView.reloadData(),如viewDidLoad和viewDidAppear,但我似乎无法得到它工作。

下面是TVC的。我坚持使用MVC设计模式,并没有在每个TVC中包含模型和severConnection代码,因为我不想过度使帖子复杂化,但是如果您希望看到我将更新。

在此先感谢您的帮助。

TableViewController1

class MenuTypeTableViewController: UITableViewController, MenuTypeServerProtocol { 

//Properties 
var cellItems: NSArray = NSArray() 
var selectedItem = String() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let menuTypeServer = MenuTypeServer() 
    menuTypeServer.delegate = self 
    menuTypeServer.downloadItems() 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cellIdentifier: String = "cellType" 
    let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)! 
    let item: MenuTypeModel = cellItems[indexPath.row] as! MenuTypeModel 
    myCell.textLabel?.text = item.type 
    return myCell 
} 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let selectedCell = tableView.cellForRow(at: indexPath) 
    selectedItem = (selectedCell?.textLabel?.text)! 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "typeItems" { 
     let destinationVC = segue.destination as? TypeItemsTableViewController 
     destinationVC?.selectedItem = self.selectedItem 
    } 
} 
} 

TableViewController2:

class TypeItemsTableViewController: UITableViewController, TypeItemsServerProtocol { 

//Properties 
var cellItems: NSArray = NSArray() 
var selectedItem: String = String() 
let typeItemsServer = TypeItemsServer() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    typeItemsServer.delegate = self 
    self.typeItemsServer.foodType = self.selectedItem 
    self.typeItemsServer.downloadItems() 
    self.tableView.reloadData() 
} 

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cellIdentifier: String = "cellTypeItem" 
    let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)! 
    let item: TypeItemsModel = cellItems[indexPath.row] as! TypeItemsModel 
    myCell.textLabel?.text = item.name! 
    return myCell 
} 

} 
+0

请尽量减少您的代码到基本部分。像'didReceiveMemoryWarning()'这样的东西没有任何帮助,但是这个问题很混乱。 – LinusGeffarth

+0

我很抱歉,让我更新 –

+0

您可以添加一个回调到您的下载项目,所以当你完成刷新你的数据。另一种可能是你创建了一个委托,你订阅了这个委托,当你的项目被下载时,你调用了委托并在你的tableviewcontroller中实现了该委托被调用时应该做什么,在你的情况下重新加载数据。 –

尝试增加这TypeItemsTableViewController

override func viewDidLoad() { 
    super.viewDidLoad() 
    cellItems = NSArray()//make sure you have the empty array at the start 
    typeItemsServer.delegate = self 
    self.typeItemsServer.foodType = self.selectedItem 
    self.typeItemsServer.downloadItems() 
    self.tableView.reloadData() 
} 

override func viewDidDisappear(_ animated: Bool) { 
    super.viewDidDisappear(animated) 

    typeItemsServer.delegate = nil 
} 

顶部

var cellItems: NSArray = NSArray() { 
    didSet { 
     tableview.reloadData() 
    } 
} 

添加这个现在你可以删除其他tableview.reloadData()电话,因为一旦cellItems设置就会自动被调用......

+0

感谢您的回复,我添加了这两个,不幸的是我得到了相同的结果。 ( –

+0

)仍然不起作用,我现在假设我在其他地方有一个问题,也许在我的TypeItemsServer类中,现在我将调查那些我已经做出的更改,谢谢你的时间和精力。这是正确的答案。 –

+0

当然,如果你有任何其他问题,请告诉我 – Ladislav

我认为你有一个时机的问题。您在异步数据调用之后立即重新加载。您重新加载,但当时您的数据不存在。尝试使用功能转义或使用“didSet”您的数据,如:

var dataArray: [type] { 
     didSet { 
      tableview.reloadData() 
     } 
    }