2016-11-07 22 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 
} 

私のデータモデルは、私のコンテキストでWorkOrderは説明のためのものと考えることができる「サービス」を指し、そのWorkOrderは非常に簡単です。作業員は「サービス」を1つしか持てません。 「サービス」は多くの作業項目に属することができますが、それらの多くに関係はありません。だから私はまだ1対1の私は信じています。

g_workOrders []とg_services []は、エディタメニュー - > createNSManagedSubClassesから作成したNSManagedSubclassesです。

これらの配列をプログラム全体で使用して、現在の作業オーダーの状態を追跡し、いつでもサービスに関する情報を取得する予定です。さらに、グローバル変数を更新し、コンテキストでsaveを呼び出すと、データベースを保存するはずです。 これは現在動作しますが、私の質問は...この良い習慣ですか?このようにして予期しない動作が発生することはありますか?

答えて

1

あなたのアプローチは、主に2つの理由から疑問があります。メモリを消費し、dbが変更され、配列オブジェクトが同期していないと、矛盾する可能性があります。

このデータが必要な場合は、NSFetchedResultsControllerを使用してください。コアデータはすべての最適化を行い、無料で多くの機能を提供します(例:テーブルビューに最適)。

また、あなたの文の一つが矛盾していると、設計上の欠陥を指している可能性があります:多くのworkordersに属することができます

A「サービス」は、それらの多くに関係はありません。

これは間違いです。同じServiceが多くのWorkorderに属している場合は、Workorderエンティティと1対1の関係に多対多の関係があります。

+0

あなたの答えをありがとう、私はこれが間違った方向に行くかもしれないと感じていたが、確かではなかった...それはあなたが得ているように見えるだろうグローバル変数を使用する代わりに、coreDataコマンドとフェッチを介して必要なデータにアクセスすることができます。私はそのアプローチを試みると思うが、これは興味深い質問を提起する。テーブルごとに、あるオブジェクトを 'on'または 'off'のように保持する 'オブジェクト'への参照を作成したかったのです。私はそれをtablecontrollerにクラス変数として入れることを考えていましたが、これが同じ問題を引き起こすかどうかは疑問です。 –

+0

サービスが多くの作業指示に属することができる理由は、技術的に多くの作業指示がサービステンプレートを参照しているためですが、サービステンプレートは一度に1つの作業指示のみを参照するためです。このようなことは、私がそれを行う正しい方法を常に混乱させていました。私の頭の中では、NSManagedSubclassがサービス上でこの配列変数を持っていると思っていましたが、それは意味をなさないでしょう。それは理にかなっていますか? –

+0

1つのサービスが複数の作業オーダーに接続されている、古典的な1対多のようなサウンドです。あなたは、仕事の順序でサービス変数を持っている必要がありますし、これらの属性間の接続で働いている仕事の配列の配列。 – PeejWeej

1

あなたはこのようにすることができますが、本当にする必要はありません。

必要に応じてフェッチリクエストで必要なタイプのオブジェクトをすべて取得することができます。 CoreDataは高度に最適化され、キャッシュされています。極端な数字を処理しない限り、意味のある待機時間はありません。このようにして、別の場所で自分の状態を管理しようとせずに、モデルのすべてのインスタンスを常に保持することがわかります。

また、データベース内のWorkOrdersとServiceの間に接続がある場合。 (あなたがすべきです)、あなたは間違いなく両方の配列を始める必要はありません。

+0

これは本当に私が行く方向を決めるのを助けました –