完成segue后再次加载数据

时间:2016-11-03 13:11:32

标签: ios swift3 segue

我想知道如果我在表视图控制器中有多篇文章,我会如何表现,这些文章是从某些API加载和解析的。然后我想点击一些文章来查看他的详细信息。

我是否应该在启动所有数据时加载所有数据,然后将具体的整篇文章传递给下一个详细信息表控制器,或者只是发送文章ID并在新表控制器中再次加载整个一篇文章并传递id?

我认为这是更好的第二种方法,但不知道如何做到这一点。有帮助吗?非常感谢。

编辑:添加代码

MainTableViewController:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let articleId = articles[indexPath.row].Id
    let destination = DetailTableViewController()
    destination.articleId = articleId

    destination.performSegue(withIdentifier: "Main", sender: self)
}

DetailTableViewController:

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 140

    // Vyzkoušíme jestli jsme připojeni do internetu
    if Helper.hasConnectivity() {
        // Zapneme načítací obrazovku
        setLoadingScreen()

        // Načteme jídla
        loadMainArticles()
    } else {
        promptAlert(title: "Upozornění", message: "Ujistěte se, že Vaše zařízení je připojené k internetu")
    }
}

private func loadMainArticles() {
    ApiService.sharedInstance.fetchArticle(part: "GetArticle", articleId: "brananske-posviceni--spravna-lidova-zabava-s-pecenou-husou") { (articles: [Article]) in
        self.removeLoadingScreen()

        self.tableView.separatorStyle = .singleLine

        if articles.count == 0 {
            self.promptAlert(title: "Upozornění", message: "Žádná data")
        }

        self.selectedArticle = articles[0]
        self.tableView.reloadData()
    }
}

ApiService:

func fetchArticle(part: String, articleId: String, completion: @escaping ([Article]) -> ()) {
    var Id = ""
    var Title = ""
    var Content = ""
    var Picture = ""
    var PublishDate = ""

    let url = NSURL(string: "http://xxx")

    URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in

        if error != nil {
            print(error as Any)
            return
        }

        do {
            let json = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments)

            var articles = [Article]()

            for dictionary in json as! [[String: AnyObject]] {
                .
                .
                .

                let article = Article(Id: Id, Title: Title, Content: Content, Picture: Picture, PublishDate: PublishDate, Categories: Categories)

                articles.append(article!)
            }

            DispatchQueue.main.async(execute: {
                completion(articles)
            })

        }

        }.resume()

}

问题是当我点击行后我做了segue,那么应该是loadMainArticles。该方法被触发,但始终在URLSession行上停止并立即跳转到resume()并且永远不会触发完成块。有什么理由吗?

1 个答案:

答案 0 :(得分:0)

这是一个应该根据文章数据模型大小完成的选择。

您应该注意需要在TableView单个单元格上显示哪些数据以及在文章详细信息页面上显示哪些数据。

我想你要表明:

  • TableView中的标题和发布时间
  • 标题,小时,长描述,也许是详情页面中的一些图片

在这种情况下,我建议您只下载每个文章项目的标题和小时,然后在详细页面中下载单个项目详细信息(避免下载未使用的内容,因为用户无法打开每个项目)。

否则,如果数据量相似,请在第一次连接和打开详细信息页面上下载所有信息,而不进行任何其他网络请求。

  

我认为这是更好的第二种方法,但不知道该怎么做。

您需要从TableView选定的单元格中检索文章ID,并使用prepareForSegue将其传递给DetailPageViewController。在DetailPageViewController中ViewDidLoad将文章ID发送到您的后端api并检索要显示的文章详细信息。