如何将 [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 到另一个的关系