json - 如何在 swift 上将 JSON 解码的数组传递给另一个 VC
问题描述
好吧,我试图将来自新闻 API 的一系列文章传递给另一个 VC,这样我就可以在我的 TableView 上显示它们,现在的问题是在我更新我的数组之前加载了 tableview,有没有办法在加载 tableview 之前更新数组?
我的代码:我的 NewsViewController 代码:
import UIKit
import Foundation
class NewsViewController: UITableViewController,NewsProtocol {
func didUpdateNewsArr(arr: [Articles]) {
newsArr = arr
print("I'm loaded first!!")
// print(newsArr[0].title)
}
var newsArr = [Articles]()
var newsManager = NewsManager()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.title = "Hot News"
newsManager.newsProtocolDelegate = self
newsManager.performRequest()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
}
}
// MARK: - UITableView Delegate&DataSource Methods:
extension NewsViewController {
// Return the number of rows for the table.
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return newsArr.count
}
// Provide a cell object for each row.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Fetch a cell of the appropriate type.
let cell = tableView.dequeueReusableCell(withIdentifier: "newsCell", for: indexPath)
// Configure the cell’s contents.
cell.textLabel!.text = "Cell text"
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
}
我的网络文件:
import Foundation
import UIKit
protocol NewsProtocol {
func didUpdateNewsArr(arr: [Articles])
}
struct NewsManager {
let newsURL = "https://newsapi.org/v2/everything?q=apple&from=2020-10-19&to=2020-10-19&sortBy=popularity&apiKey=009a08a56d664f1b92986e9cce27767b"
var newsProtocolDelegate: NewsProtocol?
func performRequest() {
if let url = URL(string: newsURL) {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { (data, respone, error) in
if error != nil {
print(error)
return
}
if let safeData = data {
self.parseJSON(newsData: safeData)
}
}
task.resume()
}
}
func parseJSON(newsData: Data) {
let decoder = JSONDecoder()
do {
let decodedData = try decoder.decode(NewsData.self, from: newsData)
let articlesArr = decodedData.articles
newsProtocolDelegate?.didUpdateNewsArr(arr: articlesArr)
} catch {
print("")
}
}
}
解决方案
我已经解决了这个问题:) 谢谢各位,只需要 tableView.reload() 来重新加载单元格,因为 JSON 请求需要一段时间并且 tableView 是在请求之前组成的,我用过调度队列 :)
推荐阅读
- php - 登录到 WordPress 管理员后,网站重定向到主页我尝试了我在网上找到的所有方法
- c++ - how to tell if a character is inside a string c++
- f# - 如何编写 F# Type Provider 来生成 P/Invoke 代码?
- node.js - JSON 保存格式
- jwt - Most efficient way to provide unique Refresh Token
- java - How to filter JUnit5 tests with custom annotation
- css - SVG 元素悬停导致其他 SVG 元素发生变化
- asp.net-core - 使用 Attribute 和 ActionFilters 记录控制器和操作的请求和响应
- linux - linux syscall uname for x86
- elasticsearch - Elastisearch 查询仅返回匹配过滤器