如何将 [NSManageObject] 数组“向下转换”到所选实体?

Posted

技术标签:

【中文标题】如何将 [NSManageObject] 数组“向下转换”到所选实体?【英文标题】:How to “downcast” an array of [NSManageObject] to the selected entity? 【发布时间】:2018-11-04 09:43:47 【问题描述】:

我正在使用 CoreData 开发应用程序。

我有 5 个实体(A、B、C、D、E),每个实体 90% 的属性都是通用的。 10% 不同。

我创建了一个 [NSManageObject] 数组来存储所选实体的 fetchRequest。在那之前,一切似乎都正常。

这是我的 fetchRequest 代码。首先我做了一个 NSManagedObjectContext 的扩展:

extension NSManagedObjectContext 

func fetchMOs (_ entityName: String, sortBy: [NSSortDescriptor]? = nil, predicate: NSPredicate? = nil) throws -> [NSManagedObject] 

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)

    request.returnsObjectsAsFaults = false
    request.predicate = predicate
    request.sortDescriptors = sortBy

    return try! self.fetch(request) as! [NSManagedObject]

    

然后我通过在上下文中调用这个函数来请求数据:

documentArray = try! context.fetchMOs(requestedEntity!, sortBy: requestedSortBy, predicate: requestedPredicate)

当我想访问所选实体的属性以使用它们时,问题就出现了。

例如,我选择了实体 A,而 fetchRequest 将数据存储在数组 [NSManageObject] 中。现在我想打印实体的一个属性: [NSManageObject].attribute1

我想我可以做一个 switch 语句来向下转换和处理数据:

Switch entitySelected 
   Case “A”:
      arrayOfMO as! [A]
      arrayOfMO.attribute1 ......

对于每个实体,依此类推。但在我看来,应该有一种更干净的方式来做到这一点。

存储在实体中的数据是字符串,我想用它做的只是在 tableViewController 中填充标签和按钮。

谢谢。

【问题讨论】:

请分享您的 fetchRequest。什么是 entitySelected? 选项 1:定义一个共同的父实体。选项 2:定义一个通用协议。 也许看看我对您之前问题的回答,这取决于您对实体的处理方式 @Carpsen90 我使用您询问的信息编辑了帖子。 entitySelected 是一个 String,它在 performSegue 中接收一个值,具体取决于您在主屏幕中按下的按钮。 @JoakimDanielson 我编辑了帖子以编写我想对来自实体的数据执行的操作。它只是在 tableViewController 中填充标签和按钮。 【参考方案1】:

尝试下一个:

    extension NSManagedObjectContext 
        func fetchMOs<T: NSManagedObject>(sortBy: [NSSortDescriptor]? = nil, predicate: NSPredicate? = nil) throws -> [T] 

            let request = NSFetchRequest<T>(entity: T.entity())

            request.returnsObjectsAsFaults = false
            request.predicate = predicate
            request.sortDescriptors = sortBy

            return try? self.fetch(request) ?? []
        
    

那么你就可以得到

    let results: [SomeMoClass] = moc.fetchMOs<SomeMoClass>()

【讨论】:

以上是关于如何将 [NSManageObject] 数组“向下转换”到所选实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同的 NSManagedObjectContext 中设置从一个 NSManageObject 到另一个的关系

当我使用 Xcode 编辑器创建 NSManageObject 子类时出现错误?

如何将数组中的元素向右移动?

如何在核心数据中保存NSArray数据?

js中如何向json数组添加元素

如何向数组中添加新元素?