从不同核心数据实体获取数据并将结果转换为相应类的通用方法
Posted
技术标签:
【中文标题】从不同核心数据实体获取数据并将结果转换为相应类的通用方法【英文标题】:Generic method to fetch data from different core data entities and cast result to respective classes 【发布时间】:2016-11-04 10:36:33 【问题描述】:我正在编写一个通用方法来从给定的entityName
、predicate
和sortDescriptors
的核心数据实体中获取数据。我想将结果作为请求实体的数组返回。如果我给学生 entityName
,我需要返回一个学生数组,如下所示,
do
if let results = try CoreDataController.sharedInstance.masterManagedObjectContext.fetch(request) as? [Student]
if results.count > 0
return results
这里的问题是,如何在使用给定实体名称的泛型方法中将结果转换为相应实体类的数组?
我试图从实体名称生成类,
let coreDataClass = NSClassFromString(entityName) as! NSManagedObject.Type
但它没有被数组声明(在上面代码中的学生位置)。请帮我找到正确的方法。
提前致谢!
【问题讨论】:
你使用的是 Swift3.0 吗? @Wolverine 是的。我正在使用 swift 3.0 和 Xcode 8.0 【参考方案1】:您可以将 Swift 泛型用于完全相同的场景。
考虑以下 Swift(版本 3.0.1)代码,用于获取对象数组,其中谓词和排序描述符作为参数提供(您可以在 coredata 帮助器类中将此函数定义为类方法):
class func arrayOf<T: NSManagedObject>(_ entity: T.Type,
predicate: NSPredicate? = nil,
sortDescriptor: [NSSortDescriptor]? = nil,
context: NSManagedObjectContext = CoreDataHelper.shared.context()) -> NSMutableArray?
let fetchRequest = NSFetchRequest<T>(entityName: NSStringFromClass(T.self))
if predicate != nil
fetchRequest.predicate = predicate!
if sortDescriptor != nil
fetchRequest.sortDescriptors = sortDescriptor!
fetchRequest.returnsObjectsAsFaults = false
do
let searchResult = try context.fetch(fetchRequest)
if searchResult.count > 0
// returns mutable copy of result array
return NSMutableArray.init(array: searchResult)
else
// returns nil in case no object found
return nil
catch
print(error.localizedDescription)
return nil
希望对您有所帮助。
【讨论】:
以上是关于从不同核心数据实体获取数据并将结果转换为相应类的通用方法的主要内容,如果未能解决你的问题,请参考以下文章