【问题标题】:How to use @Fetchrequest outside a View如何在视图外使用@Fetchrequest
【发布时间】:2020-05-22 21:44:49
【问题描述】:

我正在尝试将我的 @fetchrequest 属性移动到一个辅助类,它不是 View,但每次我尝试这样做时,都会收到错误的指令错误。

谁能帮帮我?

这是我的代码示例:

视图模型:

class ViewModel {
    @FetchRequest(entity: Teste.entity(), sortDescriptors: []) var teste: FetchedResults<Teste>
}

查看:


struct ContentView: View {

    let viewModel: ViewModel

    init(viewModel: ViewModel) {
        self.viewModel = viewModel
    }

    var body: some View {

        List(viewModel.teste) { item in // error happens in this line
            Text(item.id ?? "")
        }

    }
}

谢谢!

【问题讨论】:

    标签: swift core-data swiftui ios13


    【解决方案1】:

    我在试图弄清楚自己如何获得类似结果时遇到了您的问题。我猜你现在可能已经破解了这个问题,但是为了那些偶然发现相同问题的人的利益,我将尝试回答,或者至少指出可能找到答案的地方:-)

    如前所述,@FetchRequest 属性包装器在 View 组件之外不起作用(这似乎有点奇怪的功能遗漏)

    我发现的最佳替代方案是与Combine 发布者实现基本相同的事情,以获取来自NSFetchedResultsController 的更新,正如Apostolos 在他的回答here 中所建议的那样,并在链接的Medium post 中进行了详细说明

    我整理了一个简单的概念验证示例,用于测试和演示 iOS14 及其新生命周期管理的方法。这个演示应用程序可以在我的 GitHub 存储库中找到 here

    祝你好运。

    【讨论】:

    • 非常感谢您!它与我对 UserDefaults 所做的很接近,它解决了我对 CoreData 的最后一个顾虑。我很好奇——你会建议如何分解 AppModel?几个 FooModel 类应该有自己的 NSPersistentContainer 实例吗?当@Published 道具进入主 AppModel 时,他们是否应该只列出具有业务逻辑的静态方法?逻辑是否应该进入实体扩展?
    • 您好 Viktor,回答冗长,因此必须拆分多个 cmets >> 多个 FooModel 类是否应该有自己的 NSPersistentContainer 实例? 1 of 2 我认为默认情况下没有。我使用的是 VMM 架构,所以我的 FooModel 类是驱动纯视图的视图模型。对我有用的是在应用模型中默认使用单个 NSPersistentContainer 。但是,然后从其中为核心数据上的事务隔离有用的任何视图模型派生子上下文,例如需要通过回滚、新项目条目等进行编辑的视图。
    • >> 几个 FooModel 类应该有自己的 NSPersistentContainer 实例吗? 2 of 2 // 在实现方面,App Model 的所有核心数据“意图”都是成对实现的。一种是采用 MOC 参数的静态方法(仅在必要时公开)。另一种是应用模型实例方法,它使用应用模型的(和父)MOC 实例调用静态方法。 // App Model 有一个 create Child Context 方法,如果 View Model 需要前面提到的事务隔离,则可以将其与静态核心数据“Intents”一起使用。
    • >> ..@已发布的道具进入主 AppModel?如果它们是应用程序级别的真相来源,那么我认为是的,@Published 道具应该放在应用程序模型中。但是,如果有任何疑问,而且很方便 - 直接在视图模型中使用组合发布器功能 - 它们更灵活,如果需要,以后可能更容易重构。
    • >逻辑是否应该进入实体扩展?当然可以。我在 AppModel+FooEntity.swift、AppModel+BarEntity.swift 等中找到了我的,这使得查找东西变得相当容易。
    【解决方案2】:

    @FetchRequestDynamicProperty,后者是

    /// Represents a stored variable in a `View` type that is dynamically
    /// updated from some external property of the view. These variables
    /// will be given valid values immediately before `body()` is called.
    @available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
    public protocol DynamicProperty {
    

    因此,尝试在View 之外使用它至少是“不合设计”的。如果真的是用例,那么像之前在 UIKit+CoreData 中一样直接使用 NSFetchRequest 并手动将结果与 SwiftUI View 集成。

    【讨论】:

      猜你喜欢
      • 2020-01-31
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多