返回为基本NSManagedObject类的CustomManagedObjectClass NSFetchedResultsController <nsmanagedobject>

时间:2017-11-10 11:46:07

标签: ios core-data nsfetchedresultscontroller nsfetchrequest base-class

这是我的第一个<div id="bx"> <div class="left">Left Div</div> <div class="right">Right Div Fixed Width.</div> </div>项目Swift。目标C中CoreData没有Swift。 在return instancetype类中,我使用Swift - CoreData的公共基类。我已经实现了NSManagedObject功能。

class

我想返回class func FRCWith(sortArray: [NSSortDescriptor], predicate: NSPredicate? = nil, mainContext: NSManagedObjectContext = CoreDataManager.shared.managedObjectContext) -> NSFetchedResultsController<NSManagedObject> { let className = self.nameOfTheClass let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest.init(entityName: className) fetchRequest.sortDescriptors = sortArray fetchRequest.fetchBatchSize = 4 if let predicateValue = predicate { fetchRequest.predicate = predicateValue } let fetchedResultsController: NSFetchedResultsController<NSManagedObject> = NSFetchedResultsController.init(fetchRequest: fetchRequest, managedObjectContext: mainContext, sectionNameKeyPath: nil, cacheName: nil) do { try fetchedResultsController.performFetch() } catch { print(error.localizedDescription) } return fetchedResultsController } 而不是普通NSFetchedResultsController<customCoreDataClass>

NSFetchedResultsController<NSManagedObject>

现在我正在var schoolvalue: NSFetchedResultsController<SchoolDetails> = SchoolDetails.FRCWith([sort]) var schoolvalue: NSFetchedResultsController<StudentDetails> = StudentDetails.FRCWith([sort], preidcate) 这样使用并检查FRC for loop

as! customClass

找到某种solution in StackOverflow。那let loopValue: SchoolDetails = someFRC.object(at: IndexPath.init(row: value, section: 0)) as! SchoolDetails 事,我不明白。

这有可能成为这样的方法吗?

谢谢,@ Paulw11回答。

init时随机应用程序崩溃

T

from below answer。 因为

let fetchedResultsController: NSFetchedResultsController<T> = NSFetchedResultsController<T>(fetchRequest: fetchRequest, managedObjectContext: mainContext, sectionNameKeyPath: nil, cacheName: nil)

仅在从App store或Testflight下载时才会发生。

1 个答案:

答案 0 :(得分:0)

您可以使用Swift泛型。您指定了一个占位符,通常使用T但不一定是,它代表将要使用的实际类。在这种情况下,您需要指定T必须是NSManagedObjectNSManagedObect

的子类

将您的函数声明为:

class func FRCWith<T: NSManagedObject>(sortArray: [NSSortDescriptor], predicate: NSPredicate? = nil, mainContext: NSManagedObjectContext) throws -> NSFetchedResultsController<T> {
    let fetchRequest:NSFetchRequest<T> = T.fetchRequest() as! NSFetchRequest<T>
    fetchRequest.sortDescriptors = sortArray
    fetchRequest.fetchBatchSize = 4

    fetchRequest.predicate = predicate

    let fetchedResultsController: NSFetchedResultsController<T> =
        NSFetchedResultsController<T>(fetchRequest: fetchRequest, managedObjectContext: mainContext, sectionNameKeyPath: nil, cacheName: nil)

    try fetchedResultsController.performFetch()

    return fetchedResultsController
}

然后你可以使用:

调用它
if let frc: NSFetchedResultsController<SchoolDetails> = try? CD.FRCWith(sortArray: [], mainContext: moc) {
    // Do something with results
    if let schoolDetails = frc.fetchedObjects?.first {
        // schoolDetails will be an instance of SchoolDetails
    }
}

请注意,我已将该函数声明为throws,而不是将错误隐藏在函数内。