Во-первых, наименование структур довольно запутанно. Назовите корневой объект чем-то не связанным, например Response
или Root
.
И мы собираемся декодировать метки времени как Date
struct Root: Decodable {
var oldest: Date
var activities: [Activity]
}
struct Activity: Decodable {
var message: String
var amount: Float
var userId: Int
var timestamp: Date
}
Во-вторых, поскольку данные получены при всем соответствии с UITableViewDataSourcePrefetching
, это бессмысленно. Удалите его и удалите также метод prefetchRowsAt
.
Объявите только один массив источника данных и назовите его activities
var activities = [Activity]()
и удалить
var activityList: Activities!
В обработчике завершения задачи данных декодируйте Root
и присвойте массив действий массиву источника данных
do {
// Activities
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let result = try decoder.decode(Root.self, from: data)
self.activities = result.activities
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print("Error serializing json: ", error)
}
Методы источника данных табличного представления:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return activities.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ActivityCell", for: indexPath) as! MainTableViewCell
let activity = activities[indexPath.row]
// assign the activity data to the UI for example
// cell.someLabel = activity.amount
return cell
}