Ios 我如何阻止FetchRequest观察关系中的变化?

Ios 我如何阻止FetchRequest观察关系中的变化?,ios,swift,core-data,swiftui,Ios,Swift,Core Data,Swiftui,在我的应用程序中,我有两个CoreData实体,它们之间的关系为一对多:人物->主题 我正在使用一个列表呈现人们的名字 struct PeopleListView:视图{ @获取请求( 实体:People.entity(), sortDescriptors:[NSSortDescriptor(密钥路径:\People.updatedAt,升序:false)] )var人员:获取结果 var body:一些观点{ 导航视图{ 名单{ ForEach(people){person in 导航链接(目

在我的应用程序中,我有两个CoreData实体,它们之间的关系为一对多:人物->主题

我正在使用一个列表呈现人们的名字

struct PeopleListView:视图{
@获取请求(
实体:People.entity(),
sortDescriptors:[NSSortDescriptor(密钥路径:\People.updatedAt,升序:false)]
)var人员:获取结果
var body:一些观点{
导航视图{
名单{
ForEach(people){person in
导航链接(目的地:PersonView(个人:个人)){
文本(person.name)
}
}
}
}
}
然后在PersonView上:

struct PersonView:View{
个人:个人
@环境(\.managedObjectContext)变量上下文;
var body:一些观点{
名单{
按钮(操作:{
self.person.subjects.insert(Subject(上下文:self.context))
},标签:{Text(“添加主题”)})
ForEach(数组(person.subjects)){subject在
文本(主题名称)
}
}
}
}
只要我点击“添加主题”按钮,我就会收到以下警告:

[TableView] Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window). This may cause bugs by forcing views inside the table view to load and perform layout without accurate information (e.g. table view bounds, trait collection, layout margins, safe area insets, etc), and will also cause unnecessary performance overhead due to extra layout passes. Make a symbolic breakpoint at UITableViewAlertForLayoutOutsideViewHierarchy to catch this in the debugger and see what caused this to occur, so you can avoid this action altogether if possible, or defer it until the table view has been added to a window. Table view: <_TtC7SwiftUIP33_BFB370BA5F1BADDC9D83021565761A4925UpdateCoalescingTableView: 0x7f8e0e822800; baseClass = UITableView; frame = (0 0; 414 896); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600003f0ed30>; layer = <CALayer: 0x60000315a720>; contentOffset: {0, -140}; contentSize: {414, 748}; adjustedContentInset: {140, 0, 34, 0}; dataSource: <_TtGC7SwiftUIP13$7fff2c9c8ad419ListCoreCoordinatorGVS_20SystemListDataSourceOs5Never_GOS_19SelectionManagerBoxS2___: 0x7f8e0cc0e070>>
[TableView]仅警告一次:UITableView被告知布局其可见单元格和其他内容,而不在视图层次结构中(尚未将表视图或其中一个超级视图添加到窗口中)。这可能会导致错误,因为强制加载表视图中的视图并在没有准确信息的情况下执行布局(例如,表视图边界、特征集合、布局边距、安全区域插入等),还将由于额外的布局传递而导致不必要的性能开销。请在UITableViewAlertForLayoutOutsideViewHierarchy处创建一个符号断点,以便在调试器中捕获此问题,并查看导致此问题的原因,以便尽可能完全避免此操作,或将其推迟到将表视图添加到窗口中。表视图: 
我认为我的问题实际上是,当我在
PersonView
上时,只要我向某人添加一个主题,FetchRequest就会“收到通知”并重新绘制
PeopleListView

对于这个问题,我真的很感激有一个合适的解决方案,我想应该有一种方法可以告诉我,
FetchRequest
不要监听关系上的更改,但我找不到

我也考虑过其他解决方案,比如代理主题列表,当我返回PeopleListView时只“注入它们”,但这听起来很糟糕


谢谢!

我遇到的真正问题是,人们内部的一些记录没有id(我使用该id使他们可以识别),默认情况下,如果没有定义id,我只分配一个新id

因此,每次我添加一个主题时,SwiftUI都会重新渲染视图,并发现人们已经改变了(因为他们有不同的id)导致了观察到的问题


因此,解决我所面临的具体问题的方法是拥有一个合适的id(或者在ForEach视图的id参数上指定一个)

如果在获取主实体期间仍然需要避免获取关系,那么可以使用custom
NSFetchRequest
和SwiftUI
FetchRequest
结合使用

使用Xcode 12/iOS 14进行测试

struct PeopleListView: View {

    @FetchRequest
    var people: FetchedResults<People>

    init() {
        let request: NSFetchRequest<People> = People.fetchRequest()
        request.sortDescriptors = []
        request.includesSubentities = false             // << here !!

        _people = FetchRequest(fetchRequest: request)
    }

    // ... other code
struct PeopleListView:视图{
@获取请求
var人员:获取结果
init(){
let请求:NSFetchRequest=People.fetchRequest()
request.sortDescriptors=[]

request.includesSubentities=false//您的代码中没有UITableView,因此错误的来源尚不清楚,但有一个想法是不要使用属性包装器
@FetchRequest
,而是手动使用您的提取请求。据我所知,UITableView是在SwiftUI上后台生成的,作为列表视图。我刚刚发现FetchRequest有一个构造函数FetchRequest(withRequest:),您可以在其中指定一个自定义NSRequest,但到目前为止,没有发现主题。谢谢!我选择了这一个作为正确答案,因为它满足了问题的要求。但我的问题的实际解决方案是我编写的答案。