核心数据类的全局变量(坏?好?)

Posted

技术标签:

【中文标题】核心数据类的全局变量(坏?好?)【英文标题】:Global Variables For Core Data Classes (Bad?, Good?) 【发布时间】:2016-11-07 03:44:23 【问题描述】:

我有一个名为 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 创建的 NSManagedSubclasses。

我计划在整个程序中使用这些数组来跟踪工作订单的当前状态并随时获取有关服务的信息。此外,如果我更新全局变量并在上下文中调用 save 它应该保存数据库。 目前确实有效,但我的问题是……这是一种好的做法吗? 这样做会导致任何意外行为吗?

【问题讨论】:

【参考方案1】:

您的方法存在问题主要有两个原因:它占用内存,并且如果 db 更改并且您的数组对象不同步,它可能会出现不一致。

您应该在需要此数据的任何地方使用NSFetchedResultsController。 Core Data 将为您进行所有优化,并免费为您提供许多功能(例如,非常适合表视图)。

另外,你的一个陈述是矛盾的,可能指向一个设计缺陷:

一个“服务”可以属于许多工作订单,但与其中许多没有关系。

这绝对是错误的。如果同一个Service 可以属于多个Workorders,它应该与Workorder 实体具有一对多关系和反向一对一关系。

【讨论】:

感谢您的回答,我有这种感觉,我可能会以错误的方式处理它,但不知道为什么......看起来你得到的是访问数据,因为我需要通过 coreData 命令并获取它,而不是尝试使用全局变量来完成它。我想我会尝试这种方法,但这确实提出了一个有趣的问题。对于每个表,我想创建对“对象”的引用,该对象包含某些状态,如“开”或“关”。我想把它作为一个类变量放在 tablecontroller 中,我想知道这是否会导致同样的问题。 我说服务可以属于许多工作订单的原因是因为从技术上讲,许多工作订单引用一个服务模板,但服务模板一次只引用一个工作订单。这些东西一直让我感到困惑,正确的做法是:P。在我的脑海中,我在想 NSManagedSubclass 会在服务上有这个数组变量,这没有任何意义,它应该只有一个变量到工作订单。这有意义吗? 听起来像是经典的一对多,一个服务连接到多个工作订单。您应该在工作订单中有一个服务变量,以及一个服务中的工作订单数组,这些属性之间有联系。 如果您正在跟踪数据非特定状态,则应使用 UserDefaults,如果它特定于数据模型的实例,则应在加载数据时加载。 好的,如果我使用主键并将其存储在控制器中并使用它来了解我为每个单元格引用的记录,我想我可以做到这一点【参考方案2】:

你可以用这种方式做事,但你真的不需要这样做。

您可以在需要时通过获取请求轻松获取所需类型的所有对象。 CoreData 是高度优化和缓存的,因此除非您处理极端数字,否则不应该有有意义的等待时间。这样您就知道您将始终拥有模型的所有实例,而无需尝试在其他地方管理它们的状态。

此外,如果您在数据库中的 WorkOrders 和 Service 之间建立了连接。 (你应该这样做),你绝对不需要一开始就保留它们的数组。

【讨论】:

感谢这真的帮助我决定了前进的方向

以上是关于核心数据类的全局变量(坏?好?)的主要内容,如果未能解决你的问题,请参考以下文章

java的全局变量都有哪些作用?

错误:NSArray 在访问全局变量和核心数据时被枚举抛出

全局变量和局部变量的区别

面向对象:类的成员---只是特定(类的)命名空间的全局变量(函数)而已

QT如何设置可变的全局变量

为什么一个类的全局变量默认以m开头?