2016-07-03 13 views
2

thisチュートリアルを読んだ後、以下を実行する最も効率的な方法を理解するためにいくつかの助けが必要です。iOS(Swift)シングルトンレルムオブジェクト

私のアプリを開くときには、Profileオブジェクトを読み込む必要があります。アプリケーションの存続期間にはこれらのうちの1つだけが必要なので、私はそれをシングルトンに設定しました。

レルムは、データを保存して取得するのに最適な方法でした。さらに見ると、Realmsを使用するためにデータモデルを用意する必要があるようです。下に示すProfile.swiftにObjectを統合しようとして失敗した後、私はこの問題をどのように処理すべきかについていくつかの助けが必要です。 Profileによって呼び出されて変更を取得して保存することができる2番目のクラスProfileDataModelを作成するか、レルムObjectをシングルトンクラスに含める方法がありますか?

Profile.swift

class Profile { 

    //MARK: Singleton 
    static let sharedInstance = Profile() 

    //MARK: Properties 
    var characterName: String 
    var level: Int 

    //MARK: Init 
    private init() { 
     //TODO: Load from realms 
     self.characterName = "John Appleseed" 
     self.level = 50 
    } 

    //MARK: Helper Methods 
    static func save(){ 
     //TODO: Save to Realm 
    } 
} 

答えて

7

私は、あなたが個別にあなたのデータモデルを作成し、上/ストア・データをフェッチするために、あなたのマネージャークラスを使用することができ、あなたはそれのすべてのDB操作を処理するために、DBマネージャクラスを作成することをお勧めあなたのデータベース。

class DBManager { 
//MARK: Singleton 
static let sharedInstance = DBManager() 

//MARK: Init 
private override init(){ 
    let config = Realm.Configuration(
     fileURL: dbPath, 
     readOnly: false) 
    do{ 
     myDB = try Realm(configuration: config) 
     print(dbPath) 
    } 
    catch{ 
     print("boooom") 
    } 

} 

    //retrive data from db 
    func getDataFromDB() -> Results<DataModel>{ 
    let results: Results<NewsModel> = myDB.objects(DataModel) 
    return results 
    } 

    //write an object in db 
    func addDataModelEntry(object: DataModel){ 
     try! myDB.write{ 
      myDB.add(object, update: true) 
     } 
    } 

} 

//your controller you want to use your db manager class 
class main(){ 
    func viewDidLoad(){ 
     DBManager.sharedInstance.getDataFromDB() ///here you have realm results 

     DBManager.sharedInstance.addDataModelEntry(customDataModel) //to store your object on db 
    } 
} 

これらの機能を使用して、特定のニーズに合わせて任意の種類のDB操作に拡張することができます。

+1

私はそれをやるのに使う方法もそうです。より小さなアプリケーションでは、これはレルムにアクセスするコードを追跡する良い方法です。また、基盤となるデータベースを簡単に交換することもできます。必要な場合はコアデータ – brainray

+0

@brainray現在、またはより大きなアプリでどうやってやっていますか? – sirvon

+0

@ sirvonでは、このアプローチはすでにうまく動作しています。 または大きなプロジェクトでは、これがうまくいかない場合は、要求を処理する場所に直接書き込みブロックを使用できます。 データがフェッチされたときに、書き込みブロックでRealmに直接書き込み、UIを更新するために、各VCで領域オブジェクトの関連通知を追加して更新します。 https://realm.io/docs/swift/latest/#notifications –

2

すでに提案したように、レルム管理対象オブジェクトにシングルトンパターンを実装することはあまりお勧めできません。これらはスレッドにバインドされ、書き込みトランザクションからのみ変更できます。

共有可変グローバル状態が必要で、Realm内でその状態を維持したい場合は、オブジェクトを取得できるクラスを用意することをお勧めします。オブジェクトは永続データを記述する目的でのみ動作します。例えば。新しいレルムをインスタンス化し、オブジェクトを返します。Objectから継承しますが、カスタムstaticプロパティまたはメソッドは継承しません。DatabaseManagerをシングルトンとして使用します。