【发布时间】:2019-12-13 20:03:25
【问题描述】:
我有一个 SwiftUI 日历应用程序,其 UI 类似于内置的 Calendar.app。每当我尝试删除事件时,我都会崩溃。我的应用的整个生命周期如下:
- 从服务器下载日历数据并填充模型([Events]、[Users]、[Responses] 等)
- 将源数据转换为更结构化的格式(参见https://stackoverflow.com/a/58583601/2282313)
- 渲染事件列表视图,每个事件链接到详细视图和编辑模式(非常类似于 calendar.app)
- 当一个事件被删除时,我告诉服务器删除该事件(如果是重复事件,服务器将删除多个事件),然后通过重新下载数据从服务器刷新我的数据,重新填充模型并重新生成结构化数据(这会导致列表刷新)。
执行此操作时,我的计算值会导致崩溃,因为详细视图中显示的事件数据不再可用。比如我得到一个用户的RSVP的数组索引如下:
var responseIndex: Int {
userData.responses.firstIndex(where: { $0.user == response.user && $0.occurrence == response.occurrence })!
}
我以为这是因为我在更新数据之前没有关闭显示已删除事件的视图,但即使我延迟数据刷新直到视图不再显示,我仍然会崩溃(SwiftUI 似乎保持这些视图在内存中)。
处理数据删除的正确方法是什么?我是否需要在我的 UserData EnvironmentObject 中保留已删除的事件并将它们标记为“已删除/隐藏”以避免此问题,还是有更好的方法来处理它?
这涉及到相当多的代码,所以提供一个示例很棘手,如果被问到我很乐意添加相关位。
【问题讨论】:
-
我遇到了类似的问题,似乎没有任何效果。
-
@SybrSyn 我正在重写我的代码,这样我就不会删除任何用户数据,而是找到已删除的事件并将它们标记为这样。我还必须重新调整一些东西,以便我始终使用结构化数据作为事实来源(这很好!)。一旦我让它工作,我会分享我所做的,但可能有更好的方法来做,我还没有想出来。