ios - 在 Swift 中运行 Core Data Manager 的类初始值设定项

标签 ios swift core-data

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

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 类执行该操作的方法。

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

谢谢您的回答

最佳答案

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

问题1

对于简单情况:

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

对于企业架构案例:

如果您正在研究 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
   }
}

您的经理看起来像您开始将数据层与 View 逻辑分离(最佳实践),因此我绝对不会直接在 View Controller 中创建或使用您的上下文,并保持数据层分离。

关于ios - 在 Swift 中运行 Core Data Manager 的类初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41861796/

相关文章:

objective-c - 设置背景图像尺寸 IOS

android - FloatingActionButton onpressed()无法正常工作

ios - 如何以编程方式创建 UIImage View - Swift

ios - Swift Core Data 只保存与循环中最后一个的关系

objective-c - 如何通知 NSFetchedResultsController 关于 [NSManagedObjectContext 保存]

ios - "merge"Core Data如何配置?

php - NSURLSession 加载速度快,但 UI 更改时间太长

ios - UIApplicationInvalidInterfaceOrientation 问题

Swift3 为可为空的对象赋值

ios - 通过 migratePersistentStore 备份数据库后出现 CoreData : Is there a way to cleanly delete the backuped DB,?