You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CoreData如何按指定日期过滤获取存在关联Session的Workout

最优实现方案

直接通过CoreData谓词在数据库层完成过滤,不需要全量加载数据后做内存计算,性能和代码简洁度都更高。

实现逻辑说明

利用SUBQUERY谓词直接查询「关联的Session中存在至少一条创建时间在指定日期范围内」的Workout,CoreData会自动返回去重后的结果,无需手动处理映射、去重逻辑。

完整代码示例

import SwiftUI
import CoreData

struct WorkoutListView: View {
    @Environment(\.managedObjectContext) private var viewContext
    
    // 动态查询:仅返回指定日期存在关联Session的Workout
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(key: "name", ascending: true)],
        animation: .default
    ) private var filteredWorkouts: FetchedResults<Workout>
    
    @State private var day = Date()
    
    var body: some View {
        List {
            // 日期选择器
            DatePicker("选择日期", selection: $day, displayedComponents: .date)
                .datePickerStyle(.compact)
            
            // 分组展示Workout
            ForEach(filteredWorkouts) { workout in
                Section(header: Text(workout.name ?? "未命名训练")) {
                    // 你的独立分组视图,自行查询对应Workout当天的Session即可
                    WorkoutSessionGroupView(workout: workout, selectedDate: day)
                }
            }
        }
        .onAppear {
            updateWorkoutPredicate(for: day)
        }
        .onChange(of: day) { newDay in
            updateWorkoutPredicate(for: newDay)
        }
    }
    
    // 更新查询谓词
    private func updateWorkoutPredicate(for date: Date) {
        let dayStart = Calendar.current.startOfDay(for: date)
        let dayEnd = Calendar.current.date(byAdding: .day, value: 1, to: dayStart)!
        filteredWorkouts.nsPredicate = NSPredicate(
            format: "SUBQUERY(sessions, $session, $session.created_at >= %@ AND $session.created_at < %@).@count > 0",
            dayStart as CVarArg,
            dayEnd as CVarArg
        )
    }
}

方案优势

  • 性能更高:过滤逻辑在SQLite层面执行,无需全量加载所有Workout和Session到内存,数据量越大优势越明显
  • 代码更简洁:无需手动做过滤、映射、去重、排序操作,CoreData自动处理所有逻辑
  • 自动同步:FetchRequest会自动监听CoreData数据变化,数据更新时列表自动刷新

内容的提问来源于stack exchange,提问作者andre de waard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:00:01