我正在编写一个通用方法,用于从给定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
但它没有采用数组声明(在上面代码中的学生位置)。请帮我找到正确的方法。
提前致谢!
答案 0 :(得分:4)
您可以将Swift Generics用于完全相同的场景。
考虑以下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
}
}
希望有所帮助。