2017-03-15 8 views
0

Basierend auf den Beispielen der Realm Team zur Verfügung gestellt, ich habe das Reich instanziiert und binden es in eine Klassenvariable ‚Reich‘ wie folgt aufgerufen:Wie Realm löschen, wenn ich Realm als Klasseneigenschaft instanziiere?

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    let realm = try! Realm() 

Ich denke, dass es Sinn macht, und macht den Code besser lesbar. Allerdings ist mein Projekt darin frühes Stadium ist, werden die Objekte sehr viel verändert und ich versuche, die Durchführung Migrationen mit diesen zu vermeiden:

Realm.Configuration.defaultConfiguration.deleteRealmIfMigrationNeeded = true 

Natürlich führt dies zu Schwierigkeiten, da ich eine Realm-Datei zu löschen versuchen nach Öffnen des Realms, das im docs explizit verboten ist. Ich habe in meinen UIViewController-Klassen ein ähnliches Designmuster verfolgt, was das Refactoring ein wenig mühsam macht.

Die Frage ist:
Ist es schlechte Praxis Realm Instanz einer Klasse Eigenschaft zu binden, wie ich es getan habe? Soll ich immer auf Realm verweisen mit let realm = probiere es aus! Realm() blockiert, wenn ich meine Objekte lesen muss? Oder gibt es eine Möglichkeit, das Realm zu löschen, ohne alle klassenweiten Realm-Instanzen zu löschen?

Danke

Antwort

1

ich dieses Muster verwenden:

Singleton DataManager die Realm Zugang zur Verwaltung verwendet wird. Es kann alle try s wickeln, zum Beispiel:

class DataManager { 
    static let shared = DataManager() 

    func add(_ object: Object, update: Bool = true) { 
     do { 
      let realm = try Realm() 
      try realm.write { 
       realm.add(object, update: update) 
      } 
     } catch { 
      print (error) 
     } 
    } 

    ...Other shared Realm methods... 
} 

Ich habe auch eine MigrationManager Singletons, die wie der Name schon sagt, Realm Migrationen behandelt. Es ist Methode sehr früh aufgerufen - auch vor DataManager Methoden

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    ... 
    MigrationManager.shared.migrate() 
    ... 
} 

einige MigrationManager Code

class MigrationManager { 
    static let shared = MigrationManager() 

    let schemaVersion: UInt64 = 3 

    private var migrationBlock: MigrationBlock? { 
     return { migration, oldSchemaVersion in 
     ... 
     } 
    } 

    func migrate() { 
     let config = Realm.Configuration(
      schemaVersion: schemaVersion, 
      migrationBlock: migrationBlock) 

     Realm.Configuration.defaultConfiguration = config 
    } 
} 
+0

Dank @dmorrow für schnelle Antwort. Das scheint genial, ich werde es versuchen! –

1

Wenn Sie try! Realm() nennen genannt werden, Realm wird intern speichern eine im Cache gespeicherte Verweis auf das instanziiert Realm Objekt. Auf diese Weise wird das Aufrufen der try! Realm() zu nachfolgenden Zeiten diese Instanz wiederverwenden.

Als solches ist es in der Regel am besten Praxis betrachtet nicht Speicher Realm Instanzen als Eigenschaften von langlebigen Objekte, wie die app-Delegaten, und nur try! Realm() zu den Zeiten anrufen, wenn Sie es wirklich brauchen.

Sie sollten Ihre defaultConfiguration so früh wie möglich in der Ausführung Ihres Anwendungsdelegaten konfigurieren.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 
    // Configure the default Realm 
    let configuration = Realm.Configuration() 
    configuration.deleteRealmIfMigrationNeeded = true 
    Realm.Configuration.defaultConfiguration = configuration 

    return true 
} 

Auf diese Weise werden alle Anrufe zu Realm() nach der Tat die bei der Migration Logik löschen einzuarbeiten. Es gibt keinen Grund, eine Kopie von Realm vorher zu speichern.

Wenn Sie Storyboards verwenden, kann manchmal let realm = try! Realm() als eine Eigenschaft in einer UIViewController Unterklasse am Ende aufgerufen werden, bevor der App-Delegat eine Chance hatte, zu feuern. In diesem Fall können Sie die Storyboard-Logik auch manuell im App-Delegaten einrichten, nachdem Realm konfiguriert wurde.

+0

Danke @TiM, das hat einiges geklärt –