如何将参数传递给 Core Data 生命周期方法?

Posted

技术标签:

【中文标题】如何将参数传递给 Core Data 生命周期方法?【英文标题】:How to pass an argument to a Core Data life cycle method? 【发布时间】:2020-09-02 17:03:33 【问题描述】:

似乎需要在 NSManagedObject 的子类中重写 Core Data 生命周期方法。我的应用程序的各个部分都有删除功能,在主视图控制器、详细视图控制器等中,其中一些需要条件语句,具体取决于视图控制器中属性的状态。如何在视图控制器中使用它或将参数传递给 prepareForDeletion 方法?

当我通过“创建 NSManagedObject 子类”功能生成 NSManagedObject 的子类时,会创建子类文件,以便它们与视图控制器分开存在。

override func prepareForDeletion() 
    super.prepareForDeletion()
    
    if filePath != nil 
        // logic
     else 
        print("filepath is empty")
    

【问题讨论】:

文件路径是您要传递的东西还是您的实体的属性? 我想通过。 【参考方案1】:

func prepareForDeletion() 用于在删除对象时在数据库中传播自定义更改。

不要将 UI 级别的决策逻辑放在数据层中。

由于filePath 可能是 UI 的一部分,如果删除操作有足够的共性,您可以在每个位置重复逻辑或在某处浓缩为逻辑对象。

class DatabaseDecisions 

    @discardableResult func delete(_ thing: Thing, filePath: String?) -> Bool 
        if filePath != nil 
            // logic
         else 
            print("filepath is empty")
        
        return didIReallyDeleteIt
    

然后在 UI 级别,例如在您的视图控制器中

func deleteAction(_ sender: Any) 
     let thing = selectedThing()
     DatabaseDecisions().delete(thing, filePath: filePath)

编辑

要对属性集产生副作用,您可以像使用任何其他属性一样使用didSet

extension Thing 
    public override var filePath: String? 
        didSet 
            //logic to cleanup files
        
    

但同样,这个逻辑最好留在数据层之外,并将清理操作委托给外部逻辑。

【讨论】:

感谢您的回答。假设filePath 是一个实体的属性,它被获取和修改,是否有一个生命周期方法被触发以删除以前的文件?例如filePath = "A"被获取并更新为filePath = "B",我想删除位于“A”的文件。

以上是关于如何将参数传递给 Core Data 生命周期方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个参数传递给 ASP.NET CORE MVC 中的 HttpGet 方法?

.NET Core DI,将参数传递给构造函数的方法

SwiftUI Core Data 在 DetailView 中绑定 TextFields

Android NDK将参数传递给本机方法

在 R data.table 中,如何将变量参数传递给表达式?

iOS Core Data - 将上下文传递给详细视图的设计模式