首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构NSFetchedResultsController

重构NSFetchedResultsController
EN

Stack Overflow用户
提问于 2017-02-01 02:21:19
回答 1查看 142关注 0票数 0

这段代码现在位于UIViewController

代码语言:javascript
复制
lazy var categoryFRC: NSFetchedResultsController<Category> = {
    let fetchRequest: NSFetchRequest<Category> = Category.fetchRequest()
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "text", ascending: true)]
    let appDelegate = (UIApplication.shared.delegate) as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    frc.delegate = self
    do {
        try frc.performFetch()
    } catch {
        fatalError("Failed to initialize FetchedResultsController: \(error)")
    }
    return frc
}()

这就是我使用for-循环引用获取类别的方式:

代码语言:javascript
复制
let category = (self.categoryFRC.fetchedObjects?[index])! as Category

我想从不同的CoreData访问同一个ViewController实体。

  1. 我可以知道重构代码的正确方法是什么吗?
  2. 我是否创建了一个新类?
  3. 以及如何处理NSFetchedResultsControllerDelegate
  4. 引用fetchedResults的所有fetchedResults必须是NSFetchResultsControllerDelegate的子类吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 09:54:09

我所做的是从ViewControllers中提取所有非视图呈现/用户事件处理,并将该逻辑放入另一个类中。在您的示例中,您希望创建一个新类并将categoryFRC逻辑放入新类中。

代码语言:javascript
复制
class DataController {
  lazy var categoryFRC: NSFetchedResultsController<Category> = {
  let fetchRequest: NSFetchRequest<Category> = Category.fetchRequest()
  fetchRequest.sortDescriptors = [NSSortDescriptor(key: "text", ascending: true)]
  let appDelegate = (UIApplication.shared.delegate) as! AppDelegate
  let context = appDelegate.persistentContainer.viewContext
  let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
  frc.delegate = self

  do {
    try frc.performFetch()
  } catch {
    fatalError("Failed to initialize FetchedResultsController: \(error)")
  }

  return frc
  }()
}

然后,在ViewController存储中,DataController的一个实例:

代码语言:javascript
复制
class ViewController {
  var dataController : DataController!

  func viewDidLoad() {
    dataController = DataController()
    dataController.categoryFRC.delegate = <Class that adopts NSFetchedResultsControllerDelegate>
  }
}

其他意见:

  • 创建另一个采用NSFetchedResultsControllerDelegate的类。然后将categoryFRC.delegate设置为新类。这样,新类负责FRC委托方法,而不是视图控制器。
  • 从延迟的frc.performFetch定义中提取categoryFRC ()周围的do/try/catch。您确定每次访问categoryFRC时都要执行fetch吗?我会将do/try/catch逻辑放入一个新函数。
  • 看看您的for循环,如果fetchedObjects发生了什么?是零吗?你会不会崩溃,因为那时你正在展开一个零值?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41970893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档