我有一个名为globals.swift 的文件
代码非常简单,看起来像这样。
import Foundation
import CoreData
import UIKit
var g_workOrders = [Workorders]()
var g_services = [Service]()
//Shortcut method to get the viewcontext easily from anywhere.
func gm_getContext () -> NSManagedObjectContext {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
//For unique constraints it will overwrite the data.
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
return context
}
我的数据模型非常简单,它是一个工作订单,它引用了一个"服务",在我的上下文中,可以将其视为工作订单的描述。工单只能有一个"服务"。一个"服务"可以属于许多工单,但与其中许多工单没有关系。所以我仍然相信这是一对一。
g_workOrders[]和g_services[]是我从编辑器菜单->createNSManagedSubClasses中创建的NSManagedSub类。
我计划在整个程序中使用这些数组来跟踪工作订单的当前状态,并随时获取服务信息。此外,如果我更新全局变量并在上下文中调用save,它应该会保存数据库这目前确实有效,但我的问题是……这是一个好的做法吗这样做会导致任何意外行为吗
您的方法有问题,主要有两个原因:它占用内存,如果数据库发生更改,并且您的数组对象不同步,则可能会出现不一致。
您应该在任何需要此数据的地方使用NSFetchedResultsController
。Core Data将为您进行所有优化,并免费为您提供许多功能(例如,非常适合表视图(。
此外,你的一个说法是矛盾的,可能指向一个设计缺陷:
一个"服务"可以属于许多工单,但与其中许多工单没有关系。
这绝对是错误的。如果同一个Service
可以属于多个Workorder
,那么它应该与Workorder
实体具有多对多关系,并且具有反一关系。
您可以用这种方式做事,但实际上并不需要。
只要需要,就可以通过提取请求获得所需类型的所有对象。CoreData是高度优化和缓存的,所以除非你处理的是极端的数字,否则不应该有一个有意义的等待时间。这样,您就知道您将始终拥有模型的所有实例,而无需尝试在另一个地方管理它们的状态。
此外,如果您在数据库中的WorkOrders和Service之间有连接。(您应该这样做(,您绝对不需要从一开始就保留它们的数组。