Ios 在Swift中运行核心数据管理器的类初始值设定项

Ios 在Swift中运行核心数据管理器的类初始值设定项,ios,swift,core-data,Ios,Swift,Core Data,在阅读之前,请考虑到我正处于iOS开发的早期阶段:) 我有一个类SomeManager,它通过iOS应用程序中的核心数据框架来处理数据。我以如下方式为该经理创建了初始值设定项: class UserManager { private let appDelegate: AppDelegate private let context: NSManagedObjectContext init() { self.appDelegate = UIApplication.share

在阅读之前,请考虑到我正处于iOS开发的早期阶段:) 我有一个类SomeManager,它通过iOS应用程序中的核心数据框架来处理数据。我以如下方式为该经理创建了初始值设定项:

class UserManager {
    private let appDelegate: AppDelegate
    private let context: NSManagedObjectContext

init() {
    self.appDelegate = UIApplication.shared.delegate as! AppDelegate
    self.context = self.appDelegate.persistentContainer.viewContext
}
此外,我还有一些使用用户NSManagedObject类执行该操作的方法

所以我有两个问题。 1.这样对吗? 2.我应该在哪里(在哪个阶段)为我的管理器实现多线程(通过GCD)?我应该在初始化器中还是在管理器方法中执行它?还是在ViewController中


谢谢你的回答

听起来这里有几个问题。很难说什么是“正确的”,但有一些或多或少在架构上合理的解决方案

问题1

对于简单案例:

如果您打算只读取CoreData,或者正在进行非常轻量的写入(甚至可能不介意在最坏的情况下应用程序UI冻结片刻),则使用
context=persistentContainer.viewContext
可以很好地工作(假设在其他地方已经创建了
appDelegate.persistentcainer

对于企业架构案例:

如果您正在研究MVVM/MVP/VIPER,通常特定于CoreData的代码在它自己的类中,其唯一职责是管理数据的进出方式。这样这个类就知道什么时候使用什么上下文。通常,写入操作将在后台使用
persistentContainer.performBackgroundTask
,除非您需要通过创建自己的上下文进行更多控制

问题2

当您的UI陷入困境,或者发生大量写入(和批量写入)时,您应该开始使用多线程。不过,
persistentContainer
非常棒,因为您可以在后台抛出东西,而不用担心自己创建和管理其他线程:

persistentContainer.performBackgroundTask{ context in
   //do some stuff on a background thread
   let person = Person(context: context) //creating a person for example

   try! context.save() //this will save that Person to the database

   //returning to the UI Thread
   DispatchQueue.main.async {
      //tell the UI thread to do something
   }
}
您的管理器似乎开始将数据层与视图逻辑分离(这是一种最佳实践),因此我绝对不会直接在视图控制器中创建或使用上下文,而是将数据层分离