2016-11-07 40 views
0

我有一個名爲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。

我計劃在整個程序中使用這些數組來跟蹤工作訂單的當前狀態並隨時獲取服務的相關信息。此外,如果我更新全局變量並調用保存上下文,它應該保存數據庫。 這目前工作,但我的問題是...這是一個很好的做法?這樣做會導致任何意想不到的行爲嗎?

回答

1

你的方法主要有兩個原因值得懷疑:它佔用內存,並且如果數據庫更改和數組對象不同步,它有潛在的不一致性。

無論你需要這些數據,你都應該使用NSFetchedResultsController。核心數據將爲您做所有優化,併爲您提供大量免費功能(例如,理想的表格視圖)。

而且,你的說法之一是矛盾的,可能指向一個設計缺陷:

A「服務」可以屬於很多工作訂單,但並沒有很多人的關係。

這是絕對錯誤的。如果同一個Service可以屬於許多Workorder s,它應該與Workorder實體有多對多關係,並且具有反向一對一的關係。

+0

感謝您的回答,我有這種感覺,我可能會以錯誤的方式去做,但不知道爲什麼......這將顯示您所得到的是根據需要通過coreData命令訪存數據,而不是嘗試使用全局變量來獲取數據。我想我會嘗試這種方法,但這確實提出了一個有趣的問題。對於每個表格,我都想創建一個對'對象'的引用,這個對象將某些狀態保存爲'開'或'關'。我在考慮把它作爲一個類變量放在tablecontroller中,我想知道這是否會導致相同的問題。 –

+0

我之所以說服務可以屬於許多工作訂單,是因爲從技術上講,許多工單是指服務模板,但服務模板一次只能指向一個工單。這件事對我來說一直困擾着做它的正確方式:P。在我的腦海裏,我想NSManagedSubclass會在服務上擁有這個數組變量,這對於工作順序應該只有一個變量是沒有意義的。那有意義嗎? –

+0

聽起來像許多人的經典之作,其中一項服務連接到多個工單。您應該在工作順序中擁有一個服務變量,並且在這些屬性之間建立一個具有連接的workOrders數組。 – PeejWeej

1

你可以這樣做,但你並不需要。

只要需要它們,您就可以簡單地通過獲取請求獲取所需類型的所有對象。 CoreData高度優化和緩存,除非你處理極端數字,否則不應該有一個有意義的等待時間。這樣你就知道你將永遠擁有你的模型的所有實例,而不會試圖在另一個地方管理他們的狀態。

另外,如果您在數據庫中的WorkOrders和Service之間有連接。 (你應該這樣做),你絕對不需要保持它們的數組開頭。

+0

感謝這真的幫助我決定走的方向 –