簡體   English   中英

當 ViewModel 獲取新數據時,視圖未更新

[英]View not being updated when ViewModel gets new data

我有一個應用程序,它將每天調用一次 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
    }
}

UVIndexNowViewModel

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是一個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)")
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM