如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController

Posted

技术标签:

【中文标题】如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController【英文标题】:How to initialize a NSFetchedResultsController in iOS 10 Swift 3 【发布时间】:2016-06-26 09:11:36 【问题描述】:

我无法在 ios 10 中使用来自 AECoreDataUI 的 CoreDataTableViewController 中的 Swift 3 初始化我的 NSFetchedResultsController

let request = NSFetchRequest<NasaPicture>(entityName:"NasaPicture")  
request.predicate = Predicate(format: "isPagedResult == YES")  
request.sortDescriptors = [SortDescriptor(key: "date", ascending: false)]  
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)  

编译器抱怨

"Cannot convert value of type NSFetchedResultsController<NasaPicture> to expected type NSFetchedResultsController<_>"

控制器现在为 swift 使用泛型类型,但它没有正确推断实体类型。我已经明确尝试过:

fetchedResultsController = NSFetchedResultsController<NasaPicture>(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)  

也没有运气。

谢谢!

【问题讨论】:

这是你的变量声明。你不能再使用var fetchedResultsController: NSFetchedResultsController?,你必须使用var fetchedResultsController: NSFetchedResultsController&lt;NasaPicture&gt;? 【参考方案1】:

NSFetchRequest 现在是泛型。 NSFetchedResultsController 也是通用的。因此,在声明变量时,必须使用泛型声明,例如:

var fetchedResultsController: NSFetchedResultsController<NasaPicture>?

【讨论】:

我的视图控制器有一个超类 CoreDataCollectionViewController 声明了 frc。因为它可以重复使用,所以当它在超类中声明时,我无法将 frc 绑定到特定类型。除非我在基类中添加泛型类型参数? 好的,所以问题出在我的基类中 - 我必须添加 T:NSFetchRequestResult 的类型参数,在使用 NSFetchRequestResult 的任何地方都使用 T,并让子类提供他们想要使用的实体. @JasonC.Howlin 你能具体说明你做了什么吗?我有一段时间懒惰地声明 frc、指定谓词、排序描述符等。【参考方案2】:

当我们需要声明变量时,我们必须使用泛型声明 请在 swift 3 中检查以下 NSFetchedResultsController 代码..

 override func viewDidLoad() 
     super.viewDidLoad()
    do 
        try self.fetchedResultsController.performFetch()
     catch 
        let fetchError = error as NSError
        print("Unable to Perform Fetch Request")
        print("\(fetchError), \(fetchError.localizedDescription)")
    

// MARK: - NSFetchedResultsController

fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExistenceOnXMPPCD> = 
    let fetchRequest = NSFetchRequest<UserExistenceOnXMPPCD>(entityName: "UserExistenceOnXMPPCD")
    fetchRequest.sortDescriptors = [
        NSSortDescriptor(key: "name", ascending: true)]

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:CoreDataController.sharedInstance.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

    try! fetchedResultsController.performFetch()
    fetchedResultsController.delegate = self
    if let quotes = fetchedResultsController.fetchedObjects 
        if quotes.count > 0 
            print(quotes.count)
        
    
    return fetchedResultsController
()


// MARK: - NSFetchedResultsController delegate methods
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>)  
    tableView.beginUpdates()


func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>)  
    tableView.reloadData()

【讨论】:

【参考方案3】:

只需调用函数:

private func setupFetchedResultsController() 

    let context = NSManagedObjectContext.mr_default()
    let fetchRequest = NSFetchRequest<Month>(entityName: "Month")
    let dateDescriptor = NSSortDescriptor(key: "date", ascending: false)

    fetchRequest.sortDescriptors = [dateDescriptor]

    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "year", cacheName: nil)
    fetchedResultsController.delegate = self

    try! fetchedResultsController.performFetch()
    tableView.reloadData()

【讨论】:

以上是关于如何在 iOS 10 Swift 3 中初始化 NSFetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中为 iOS 10 和 iOS 9.3 初始化 NSManagedObject 子类

如何在 iOS swift 中使用多个属性初始化 CBMutableCharacteristic

如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像

我如何通过 swift 2.3 项目支持 iOS 版本 10.3

如何将推送通知令牌存储到外部数据库 - iOS 10,Swift 3

如何在 IQKeyboardManager iOS Swift 3 中隐藏工具栏