问题描述
我遇到了FetchRequests的一个奇怪问题,该问题使用从传递的值生成的动态谓词。问题是FetchRequest更新正确,但FetchedResults保持不变。
This guy似乎遇到了类似的问题,但是该解决方案对我不起作用。
意图和方法
- 我的核心数据模型每天有0或1个“天” 项。
- 我想从自定义日期选择器中选择日期,并获取相应的 Day 条目,以显示其相关数据。
- 因此我创建了一个使用
@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,但这很简单。
结果
- FetchRequest之前的所有内容都可以正常更新(dayOffset,date,startOfDay,startOfNextDay和fetchrequest本身,我通过分离请求和结果并打印请求进行了验证)
- FetchedResults之后的所有内容基本上都是恒定的。无论我做什么,天都永远不会改变。但是,通过
onRecieve()
收听 days.publisher 会每秒打印一次“已接收”,因此CoreData本身发布得很好。 (我在另一个用于写入CoreData的选项卡中有一个计时器),该视图也可以毫无问题地更新。
我尝试了用于动态FetchRequests的其他方法,并且尝试添加State变量以使视图重新呈现(尽管我不确定这样做是否正确),但没有任何效果。该视图仅显示今天的信息,而与 dayOffset 无关,并且永远不会触发“无信息”。
也许这是关于视图更新的简单错误或误解。任何解决方案都是值得欢迎的,即使我已经尝试过。我是SO的新手,所以也欢迎您提供关于SO使用的任何建议。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)