在Swift中运行Core Data Manager的类初始化程序

时间:2017-01-25 21:15:10

标签: ios swift core-data

在您阅读之前考虑到我在iOS开发的早期阶段:) 我的类SomeManager在我的iOS应用程序中通过Core Data框架操作数据。我以这种方式为该Manager创建了初始化程序:

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

init() {
    self.appDelegate = UIApplication.shared.delegate as! AppDelegate
    self.context = self.appDelegate.persistentContainer.viewContext
}

此外,我还有一些使用User NSManagedObject类执行该操作的方法。

所以我有2个问题。 这种方式是否正确? 2.我应该在哪里(在什么阶段)为我的经理实施多线程(通过GCD)?我应该在初始化程序或管理器方法中执行此操作吗?或者在ViewController中?

感谢您的回答

1 个答案:

答案 0 :(得分:0)

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

问题1

对于简单案例:

如果您只是从CoreData阅读,或者正在进行非常轻量级的写入(甚至可能不介意应用程序UI在最坏的情况下暂时冻结),那么context = persistentContainer.viewContext可以工作正常(假设appDelegate.persistentContainer已经创建,其他地方)。

对于企业架构案例:

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

问题2

如果你的用户界面陷入困境,或者你有大量的写入(和批量写入),你应该开始使用多线程。 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
   }
}

您的经理看起来好像开始将数据层与视图逻辑分开(最佳做法),因此我绝对不会直接在视图控制器中创建或使用您的上下文,并保持数据层分离。