gpt4 book ai didi

ios - 重构 NSFetchedResultsController

转载 作者:行者123 更新时间:2023-11-30 12:43:23 24 4
gpt4 key购买 nike

此代码现在位于 UIViewController 中:

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 循环引用获取的类别的方式:

let category = (self.categoryFRC.fetchedObjects?[index])! as Category

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

  1. 我可以知道重构代码的正确方法是什么吗?

  2. 我要创建一个新类吗?

  3. 如何处理 NSFetchedResultsControllerDelegate

  4. 所有引用 fetchedResultsViewControllers 都必须是NSFetchResultsControllerDelegate 的子类?

最佳答案

我所做的就是从 ViewController 中提取所有非 View 渲染/用户事件处理,并将该逻辑放入另一个类中。在您的情况下,您想要创建一个新类并将categoryFRC逻辑放入新类中

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 的实例:

class ViewController {
var dataController : DataController!

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

其他观察结果:

  • 创建另一个采用 NSFetchedResultsControllerDelegate 的类。然后将categoryFRC.delegate设置为新类。这样,新类负责 FRC 委托(delegate)方法,而不是 View Controller 。

  • 从惰性类别FRC定义中拉出围绕frc.performFetch()的do/try/catch。您确定要在每次访问categoryFRC 时执行提取吗?我会将 do/try/catch 逻辑放入一个新函数中。

  • 看看你的 for 循环,如果 fetchedObjects 会发生什么?是零吗?你不会因为解开一个 nil 值而崩溃吗?

关于ios - 重构 NSFetchedResultsController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41970893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com