我有一个名为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 []是我从编辑器菜单创建的NSManagedSubclasses - > createNSManagedSubClasses。
我计划在整个程序中使用这些数组来跟踪工作订单的当前状态,并随时获取服务信息。此外,如果我更新全局变量并在上下文中调用save,它应该保存数据库。 这目前有效,但我的问题是......这是一个好的做法吗? 这样做会导致任何意外行为吗?
答案 0 :(得分:1)
你可以这样做,但你真的不需要。
您可以随时使用获取请求获取所需类型的所有对象。 CoreData经过高度优化和缓存,因此,除非您处理极端数字,否则不应该有意义的等待时间。通过这种方式,您可以始终拥有模型的所有实例,而无需在其他位置管理其状态。
此外,如果数据库中的WorkOrders与Service之间存在连接。 (你应该这样做),你绝对不需要保留两者的数组。
答案 1 :(得分:1)
您的方法有问题,主要有两个原因:它会占用内存,如果数据库发生更改且您的数组对象不同步,则可能存在不一致。
您应该在需要此数据的任何地方使用NSFetchedResultsController
。 Core Data将为您做所有优化,并免费为您提供许多功能(例如,理想的表视图)。
另外,你的一个陈述是矛盾的,可能指出一个设计缺陷:
'服务'可以属于许多工作人员,但与许多工作人员没有关系。
这绝对是错误的。如果相同的Service
可以属于许多Workorder
,则它应该与Workorder
实体具有多对多的关系,并且与一对一的关系相反。