从不同核心数据实体获取数据并将结果转换为各个类的通用方法

时间:2016-11-04 10:36:34

标签: ios swift core-data casting nsmanagedobject

我正在编写一个通用方法,用于从给定entityNamepredicatesortDescriptors的核心数据实体中获取数据。我想将结果作为请求实体的数组返回。如果我将学生作为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

但它没有采用数组声明(在上面代码中的学生位置)。请帮我找到正确的方法。

提前致谢!

1 个答案:

答案 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
    }
}

希望有所帮助。