惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
博客园 - 聂微东
V
Visual Studio Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
L
LangChain Blog
I
InfoQ
T
Tailwind CSS Blog
博客园 - 【当耐特】
V
V2EX
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
Vercel News
Vercel News
雷峰网
雷峰网
量子位
A
About on SuperTechFans
Martin Fowler
Martin Fowler
H
Help Net Security

Swift

都 vibe coding 了,为啥不把 Rust 项目 rewrite 到 Swift ? 应该怎么解读 swiftui 的崩溃报告? FoundationModels 框架实践 Swift DocC 构建的博客 Swift server 要支棱起来了 求问贴,如果在 swiftUI 中接入 MySQL C client Swift 萌新, DispatchQueue 的一个问题 分享一下一个 Web 前端刚学习 Swift 时候的心得博文 5 分钟用 Swift 写个 ripripgrep Swift 操作 plist 文件 使用 SwiftUI + TCA 重构 Instagram Clone:从 Flutter 到 SwiftUI 的迁移实践 激发编程激情,轻松掌握 Swift SwiftUI 分享个基于 UICollectionView 封装的数据驱动和声明式组件库 ListKit 问一个关于 CALayer 的资源释放问题 SwiftUI 的 TextEditor 在 macOS Sequoia 15.0 上输入中文时又会这样一跳一跳的了 Swift 中系统 API delegate 参数一定要在当前类实现传 self 吗 ScreenCaptureKit 里面的 SCStreamOutput 没有被顺利触发,是那个步骤错了,求解惑 似乎 SwiftUI app 在 macOS 15 上启动速度变快很多? 请教一个关于 Swift 的基础小问题 离线 iOS app 也需要 ICP ? 请教 SwiftUI 布局的问题 ios 17 widget 无法正确更新 core data 有没有 Swift ui 版本的 tailwind css? swiftui 里,这里用 hstack,为什么是垂直布局,而不是水平布局? 大家觉得 Swift 的参数必须按序提供怎么样? Swift 开源的组件库好像不是很多啊 Swift 如何像 Python 那样 崩溃了输出 backtrace 或者至少是哪行出错了。。。 请教一下各位 iOSer 巨佬们一个 SwiftUI sheet 组件的问题 请教一下各位 iOSer 巨佬们一个 SwiftUI 中 HStack 的布局问题 swiftui 有好用的组件库吗?
Swift 如何优化数据加载方式?
0littleboy · 2023-04-13 · via Swift

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

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
    }

如何解决?