我有一个用于记录全局数据的类
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
}
如何解决?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.