ios - ViewModel 获取新数据时视图未更新
问题描述
我有一个应用程序会每天调用一次 API 来检索新数据。
当应用程序启动时,它将检查新数据是否可用,将新数据保存到核心数据,调用核心数据以在视图中显示数据。
问题
将新数据保存到核心数据后,我的视图将不会显示新保存的数据,而是显示我模型中的默认虚拟数据。重新启动应用程序后将显示新数据。
问题
如何在视图中显示新保存的数据而无需重新启动应用程序?我正在使用 MVVM 模式。下面是我的代码,其中包含指向我的代码的链接。
class UVIndexNowModel: ObservableObject
{
@Published var uvIndex: Int
@Published var dateTime: Date
init(uvIndex: Int = 0, dateTime: Date = Date())
{
self.uvIndex = uvIndex
self.dateTime = dateTime
}
}
class UVIndexNowViewModel: NSObject, ObservableObject
{
private var isFirstAppearance = true
private let moc = PersistentStore.shared.context
private let nowController: NSFetchedResultsController<UVHour>
@Published var data: UVIndexNowModel = UVIndexNowModel()
@Published var coreDateError: Bool = false
override init()
{
nowController = NSFetchedResultsController(fetchRequest: UVHour.uvIndexNowRequest,
managedObjectContext: moc,
sectionNameKeyPath: nil, cacheName: nil)
super.init()
nowController.delegate = self
do {
try nowController.performFetch()
let results = nowController.fetchedObjects ?? []
setUVIndex(from: results)
} catch {
print("failed to fetch items!")
}
}
func setUVIndex(from hours: [UVHour])
{
let date = Date()
let formatter = DateFormatter()
formatter.timeZone = .current
formatter.dateFormat = "MMM/d/yyyy hh a"
let todaystr = formatter.string(from: date)
print("UVIndexNowVM.setUVIndex() size of UVHour array: \(hours.count)")
for i in hours
{
let tempDateStr = formatter.string(from: i.wrappedDateTime)
if todaystr == tempDateStr
{
print("UV Now VM Date matches! \(tempDateStr)")
self.data.uvIndex = i.wrappedUVIndex
self.data.dateTime = i.wrappedDateTime
break
}
}
}
}
extension UVIndexNowViewModel: NSFetchedResultsControllerDelegate
{
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>)
{
print("UVIndexNowViewModel controllerDidChangeContent was called. New Stuff in DB")
guard let results = controller.fetchedObjects as? [UVHour] else { return }
setUVIndex(from: results)
}
}
struct UVIndexNowView: View {
@ObservedObject var vm = UVIndexNowViewModel()
var body: some View {
VStack {
Text("\(vm.data.dateTime)")
Text("UV Index: \(vm.data.uvIndex)")
}
}
}
解决方案
作为您的UVIndexNowModel
is-a ObservableObject
,您需要在单独的视图中观察它,例如
struct UVIndexNowView: View {
@ObservedObject var vm = UVIndexNowViewModel()
var body: some View {
UVIndexNowDataView(data: vm.data) // << here !!
}
}
和
struct UVIndexNowDataView: View {
@ObservedObject var data: UVIndexNowModel
var body: some View {
VStack {
Text("\(data.dateTime)")
Text("UV Index: \(data.uvIndex)")
}
}
}
推荐阅读
- python - 如何绘制具有不同颜色的直方图和具有这些颜色的图例
- javascript - 同一数组上的嵌套地图在每次渲染时翻倍
- javascript - 选择多个类名时事件更改不起作用
- python - 如何使用 Python 只搜索图像?(网络浏览器模块)
- php - PHP将数组插入MySQL数据库从复选框获取数据
- google-search - Google Search Console (SC) HTTP 响应错误
- docker - 修剪(不同的,同步的)备份分区上的 Docker 配置
- javascript - 在 ReCharts 中的 X 轴上显示 24 小时时间
- c++ - GCC 需要为等待对象移动 ctor,即使它是左值
- powershell - 让 PowerShell 根据当前月份名称读取对象名称的语法