带有SwiftUI的CoreData:FetchedResults不会针对动态FetchRequests更新

问题描述

我遇到了FetchRequests的一个奇怪问题,该问题使用从传递的值生成的动态谓词。问题是FetchRequest更新正确,但FetchedResults保持不变。

This guy似乎遇到了类似的问题,但是该解决方案对我不起作用。

意图和方法

  1. 我的核心数据模型每天有0或1个“天” 项。
  2. 我想从自定义日期选择器中选择日期,并获取相应的 Day 条目,以显示其相关数据。
  3. 因此我创建了一个使用@Binding var dateOffset: Int的视图,并根据来自this SO post的Steve的评论,使用了一个自定义的init根据偏移量初始化FetchRequest。

代码

struct DailyStats: View {
    @Binding var dayOffset: Int
    @Environment(\.managedobjectContext) var context
    @FetchRequest<Day> private var days: FetchedResults<Day>
    
    var date: Date
    
    init(dayOffset: Binding<Int>) {
        let date = Calendar.current.date(byAdding: DateComponents(day: dayOffset.wrappedValue),to: Date())!
        let startOfDay = Calendar.current.startOfDay(for: date)
        let startOfNextDay = Calendar.current.date(byAdding: DateComponents(day:  1),to: startOfDay)!

        self._days = FetchRequest<Day>(entity: Day.entity(),sortDescriptors: [],predicate: nspredicate(format: "(date >= %@) AND (date < %@)",startOfDay as NSDate,startOfNextDay as NSDate))
        self.date = date
        self._dayOffset = dayOffset
    }

    
    var body: some View {
        vstack {
            DayListForFetch(days: days)
            if days.first == nil {
                Text("no info")
            } else {
                Text("\(days.first!.wrappedDate,formatter: dateFormat)")
            }

我还有一个同级视图,它实际上修改了dayOffset,但这很简单。

结果

  1. FetchRequest之前的所有内容都可以正常更新(dayOffset,date,startOfDay,startOfNextDay和fetchrequest本身,我通过分离请求和结果并打印请求进行了验证)
  2. FetchedResults之后的所有内容基本上都是恒定的。无论我做什么,都永远不会改变。但是,通过onRecieve()收听 days.publisher 会每秒打印一次“已接收”,因此CoreData本身发布得很好。 (我在另一个用于写入CoreData的选项卡中有一个计时器),该视图也可以毫无问题地更新。

我尝试了用于动态FetchRequests的其他方法,并且尝试添加State变量以使视图重新呈现(尽管我不确定这样做是否正确),但没有任何效果。该视图仅显示今天的信息,而与 dayOffset 无关,并且永远不会触发“无信息”。

也许这是关于视图更新的简单错误或误解。任何解决方案都是值得欢迎的,即使我已经尝试过。我是SO的新手,所以也欢迎您提供关于SO使用的任何建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)