重新加载数据但 ObservableObject 不工作

Posted

技术标签:

【中文标题】重新加载数据但 ObservableObject 不工作【英文标题】:Reload data but the ObservableObject is not working 【发布时间】:2020-12-21 19:14:07 【问题描述】:

使用 SwiftUI,我在数据库中创建 Favorite 对象时尝试更新数据。创建成功,调用reload函数时,可以得到正确的信息。

但是,当我更改视图时,它不会在视图中重新加载。

我的数据代码:

// Favorite
struct  Favorite: Decodable, Identifiable 
    var id:Int?
    public var id: Int?
    public var name: String?
    public var type: String?
    var addres: String?



class Favorite: ObservableObject 
    var userID = userViews().id
    @Published var favorites = [Favorite]()
    
    init()
        load()
    
    
    func load() 
        let url = URL(string: "https://***********/getFavoriteApi/")

        URLSession.shared.dataTask(with: url) (data, response, error) in
            do 
                if let d = data 
                    let decodedLists = try JSONDecoder().decode([Favorite].self, from: d)
                    DispatchQueue.main.async 
                        self.favorites= decodedLists
                        print(self.favorites)
                    
                else 
                    print("No Data")
                
             catch 
                print ("Error")
            
            
        .resume()
         
    

如果我打印(self.favorites)它可以在创建收藏夹后看到新的可选,但视图不会重新加载它。

我的查看代码:

struct FavoriteView: View 
    @ObservedObject var favorites = Favorite()
    
    var name = UserDefaults.standard.value(forKey: "name")as? String ?? "null"
    var userID = userViews().id
    
    
    var body: some View 
        VStack
            Text("My Favorite")
                .font(.title)
            GeometryReadermainView in
                ScrollView(.vertical, showsIndicators: false) 
                    
                    VStack
                        
                        ForEach(favorites.posts)post in
                            
                            NavigationLink(destination: FavoriteDetail(post: post)) 
                                
                                GeometryReaderitem in
                                    
                                    rentView1(post: post)
                                        // scaling effect from bottom....
                                        .scaleEffect(scaleValue(mainFrame: mainView.frame(in: .global).minY, minY: item.frame(in: .global).minY),anchor: .bottom)
                                        // adding opacity effect...
                                        .opacity(Double(scaleValue(mainFrame: mainView.frame(in: .global).minY, minY: item.frame(in: .global).minY)))
                                
                                .frame(height: 100)
                                
                                                
                        
                    
                    .padding(.horizontal)
                    .padding(.top,25)
                    
                
                .zIndex(1)
                
            
        
    

恐怕我做错了什么,或者我不明白 ObservedObjects 如何与 JSONDecoder 一起工作。

欢迎任何帮助或解释!谢谢。

【问题讨论】:

Fetcher 是什么? 对不起,我错了,这是我的最爱,而不是 Fetcher 【参考方案1】:

当我在ScrollView 中使用ForEach 时遇到了同样的问题

查看this讨论,它可能会帮助您找到解决此问题的技巧

【讨论】:

以上是关于重新加载数据但 ObservableObject 不工作的主要内容,如果未能解决你的问题,请参考以下文章

切换选项卡后 UI 会随 ObservableObject 发生变化

我们如何在 SwiftUI 中读取和写入相同的 ObservableObject?

具有已发布枚举的用户默认值

NSTableView 加载数据,但无法重新加载

如何确认 AppDelegate 的 ObservableObject?

ObservableObject 不更新视图