【发布时间】:2021-08-06 02:34:36
【问题描述】:
作为 Swift 新手,我正在尝试获取 JSON 对象列表,将它们保存到 Core Data,然后显示在 SwiftUI 列表中:
JSON 对象有一个唯一的数字 uid(在我的 PostgreSQL 后端中充当 PRIMARY KEY)。
我将它们映射到我的TopModel.swift 中的id:
struct Top: Codable, Identifiable {
var id: Int { uid }
let uid: Int
let elo: Int
let given: String
let photo: String?
let motto: String?
let avg_score: Double?
let avg_time: String?
}
然后我有一个单例DownloadManager.swift,它会下载 JSON 列表并将对象存储到核心数据中:
func getTopsCombine() {
guard let url = URL(string: "https://slova.de/ws/top") else { return }
URLSession.shared.dataTaskPublisher(for: url)
.subscribe(on: DispatchQueue.global(qos: .background))
.receive(on: DispatchQueue.main)
.tryMap(handleOutput)
.decode(type: TopResponse.self, decoder: JSONDecoder())
.sink{ ( completion ) in
print(completion)
} receiveValue: { [weak self] (returnedTops) in
for top in returnedTops.data {
print(top)
let topEntity = TopEntity(context: PersistenceController.shared.container.viewContext)
topEntity.uid = Int32(top.id)
topEntity.elo = Int32(top.elo)
topEntity.given = top.given
topEntity.motto = top.motto
topEntity.photo = top.photo
topEntity.avg_score = top.avg_score ?? 0.0
topEntity.avg_time = top.avg_time
}
self?.save()
}
.store(in: &cancellables)
}
不幸的是,这导致 Core Data 中保存了多个相同的记录(正如您在上面的屏幕截图中看到的那样)。
这里的标准 iOS 解决方案是什么?
如何强制执行唯一性(在我原来的 Android/Room 应用程序中,我为此使用 @PrimaryKey public int uid;)?我在 Xcode 中没有看到这样的选项:
以及如何合并获取的 JSON 对象列表(在我的 Android 应用中我使用 DiffUtils)?
【问题讨论】:
标签: ios swift core-data swiftui primary-key