Swift 如何优化数据加载方式?

2023-04-13 09:53:52 +08:00
 0littleboy

我有一个用于记录全局数据的类

class GlobalData {
//    static let shared = GlobalData()
    // 不使用单例模式,没有实例,直接调用类
    static var allProblems: [Problem] = getAllProblems()
    static var allContests: [Contest] = getAllContests()
}

问题其一是使用 static 加载速度太慢了,必须等其加载完才能显示 APP 的内容

给出其中一个调用 GlobalData 的样例

struct HistoryContestsView: View {
    @State var contests: [Contest] = GlobalData.allContests
    @State var allProblems: [Problem] = GlobalData.allProblems
    
    var body: some View {
        NavigationView {
            // ...
        }
        .refreshable {
            reloadHistoryContests()
        }
    }
    
    private func reloadHistoryContests() {
        GlobalData.allProblems = getAllProblems()
        allProblems = GlobalData.allProblems
        GlobalData.allContests = getAllContests()
        contests = GlobalData.allContests
        print("Successfully reload history contests")
    }
}

其二是 reloadHistoryContests 内容显得十分冗余

目前想到的策略是定义一个 ObservableObject 类 HistoryContestsView 就可以直接订阅 GlobalData 类 并且在 .task 中异步加载数据,也能解决性能问题

class GlobalData: ObservableObject {
    @Published var allProblems: [Problem] = []
    @Published var allContests: [Contest] = []

    func loadData() {
        // 加载数据的代码
        // ...
        self.allProblems = getAllProblems()
        self.allContests = getAllContests()
    }
}

但又出现了个问题,在其他 model 文件中,原本调用 GlobalData.allContests 的函数,都无法使用了

func getPredictiveContestList(by userid: String) -> [User.AttendedContest] {
        let predictiveContests = Global.allContests.filter {
            $0.avgRatingOfProblems == nil
        }
    //    print(predictiveContests)
        var res: [User.AttendedContest] = []
        for contest in predictiveContests {
            /// 参加了且有了预测结果
            // TODO - 后面统计参加了还没有结果的
            if let tmp = predictRatingOfUser(by: contest.titleSlug, userid: userid) {
                res.append(tmp)
            }
        }
        
        return res
    }

如何解决?

897 次点击
所在节点    Swift
1 条回复
gfreezy
2023-04-13 12:17:48 +08:00
getPredictiveContestList 这个应该是个 publisher

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/932146

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX