これは、Cocoa Touch Framework内で驚異的なRealmデータベースを使用する際のコードパターン/デザインに関する質問です。具体的には、ココアポッドとして配布されるフレームワーク。Cocoa Touch FrameworkでRealmを使用するときのパターン
は私が今
public class Dog: Object {
@objc public private(set) dynamic var name: String?
public let age = RealmOptional<Int>()
public private(set) var owner: Person?
}
public class Person: Object {
@objc public private(set) dynamic var name: String?
public private(set) var dogs = LinkingObjects(fromType: Dog.self, property: "owner")
}
を構築していますフレームワーク内のいくつかのレルムのオブジェクトを持っていると言うことができます、私は私の枠組みの消費者は、これらのオブジェクトと対話できるようにしたいです。私はMVVMパターンでこれらを抽象化したくありません。なぜなら私のフレームワークのユーザは、クエリ、並べ替え、そして最も重要なRealm変更通知のような素晴らしいRealmの機能を利用できるようにしたいからです。
ですから、最初の質問です。私のフレームワークのユーザがオブジェクトを直接初期化できるようにする必要がありますか?これらのオプションは既にRealmイニシャライザで使用されています。使用することを選択した場合は、それらを担当します。しかし、私は静的メソッドを使用して工場パターンに行くのが好きです。このように:
extension Dog {
public static func retreiveManagedDog() throws -> Dog {
let dog = Dog()
do{
let realm = try Realm()
realm.beginWrite()
realm.add(dog)
try realm.commitWrite()
}catch{
throw error
}
return dog
}
}
これは、このユースケースに適したデザインパターンですか?
第2に、次の問題はオブジェクトを更新することです。すべてのRealmオブジェクトは書き込みトランザクション内で更新する必要があるため、私のフレームワークのユーザーは名前を変更するために定型コードを書く必要はありません。だから、私はこのような関数を作成:
//MARK: Extension that has functions to update properties
extension Dog {
public func updateName(_ name: String?) throws {
do{
let realm = try Realm()
realm.beginWrite()
self.name = name
try realm.commitWrite()
}catch{
throw error
}
}
}
お知らせ私のオブジェクト定義は、まさにこの理由のためprivate(set)
を持っていました。これは、私のフレームワークのユーザーが自分のセッターメソッドを使用するのを助けるでしょう。
一般的に、このようにレルムをラップしようとすると私は狂気ですか?永続する他の偉大なフレームワークは、通常、すべてのSQL Lite /コアデータロジックをラップします。私はこのパターンを一般的に改善する提案もしたいと思います。
Thanks AustinZ。私の例では、デフォルトのレルムを使用しています。実際に私のフレームワークでは、私は 'MyFrameworkName.realm'として保存されている別のレルムを使用します。レルムを完全にラッピングするアドバイスをありがとう。私の独自のプロトコルの背後にあるRealmのすばらしい機能をすべて網羅することはたくさんの仕事のようです。私は、私のフレームワークのユーザーにレルムの最高の部分を使用させ、より迷惑な部分をより簡単にすることができます。検証していただきありがとうございます。 –