【发布时间】:2018-11-08 17:38:53
【问题描述】:
我的原始 json 数据可能会误导你。键数组并不总是在同一索引处匹配其值。所以我重写了我的数据以反映我的意图。
假设我们有一个表格视图来显示带有其 json 的歌曲:
{
"albums": [
{
"title": "A",
"id": "174172",
"artistName": "Person X"
},
{
"title": "B",
"id": "19201827",
"artistName": "Person Y"
},
{
"title": "C",
"id": "1927",
"artistName": "Person Z"
}
],
"songs": [
{
"name": "Song A",
"albumName": "A",
"albumId": "174172",
"duration": 180
},
{
"name": "Song B",
"albumName": "A",
"albumId": "174172",
"duration": 200
},
{
"name": "Song C",
"albumName": "B",
"albumId": "19201827",
"duration": 216
},
{
"name": "Song D",
"albumName": "C",
"albumId": "1927",
"duration": 216
}
]
}
我的架构是这样的:
struct Album: Decodable {
let title: String
let id: String
let artistName: String
}
struct Song: Decodable {
let name: String
let albumName: String
let albumId: String
let duration: Int
}
视图控制器伪代码如下:
class ViewController: UIViewController {
var songs: [Song] = []
var albums: [Album] = []
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return songs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableview.dequeueReusableCell(withIdentifier: "SongCell", for: indexPath) as! SongCell
let song = songs[indexPath.row]
let album = albums.first { $0.id == song.albumId }
cell.updateUI(withSong: song, album: album)
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let song = songs[indexPath.row]
let album = albums.first { $0.id == song.albumId }
pushDetailSongViewController(song, album)
}
func pushDetailSongViewController(_ song: Song, _ album: Album?) {
}
}
当我们的专辑歌曲太多时,let album = albums.first { $0.id == song.albumId } 会出现严重的性能问题。
那么我们应该在这里使用什么数据结构来处理更新性能?
【问题讨论】:
-
@LinusGeffarth 感谢您的回答。我认为我的原始问题可能会误导我现在更新所有 json。你会再读一遍吗?
-
我更新了我的答案。它和以前完全一样,除了我必须重命名几个字段。但是请注意,这将只匹配每张专辑的一首歌曲。您必须执行
[Album: [Song]],以获取专辑字典以及属于每个专辑的所有歌曲。 -
所以,我还在我的答案中添加了
[Album: [Song]]功能。
标签: ios json swift algorithm uitableview