2017-03-15 91 views
0

基於由境界團隊提供的例子,我已經實例化的境界,並將其綁定到名爲「境界」這樣的類變量:如果我將realm實例化爲類屬性,如何刪除Realm?

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

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

我覺得很有道理,使代碼更易讀。然而,我的項目是在它的早期階段,對象是改變了很多,我試圖避免與此進行遷移:

Realm.Configuration.defaultConfiguration.deleteRealmIfMigrationNeeded = true 

當然,這帶來了麻煩,因爲我想刪除一個境界文件後,開啓在docs中明確禁止的領域。我在UIViewController類中也遵循了類似的設計模式,這使得重構有點麻煩。

的問題是:
它是不好的做法,領域實例綁定到一個類的屬性,因爲我做了什麼?我應該總是參考Realm讓let realm = try!當我需要讀取我的對象時,Realm()是否阻塞?或者是否有某種方法可以刪除Real而不刪除所有類級別的領域實例?

謝謝

回答

1

我用這個模式:

辛格爾頓DataManager這是用來管理Realm訪問。它可以包裝所有的try S,例如:

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... 
} 

我也有一個MigrationManager單,其顧名思義,處理領域遷移。它的方法得到很早就叫 - 被稱爲前以及DataManager方法

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

一些MigrationManager代碼

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

謝謝@dmorrow快速回復。這似乎巧妙,我會試一試! –

1

當你調用try! Realm(),境界會在內部存儲緩存參考實例Realm對象。這樣,在後續時間調用try! Realm()將回收該實例。

因此,它通常被認爲是最佳實踐Realm實例作爲長壽命對象的屬性,比如應用程序的委託,並只在次當你真正需要它調用try! Realm()

您應該儘早配置您的defaultConfiguration,以便在應用程序委託的執行中儘可能早。

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 
} 

這樣,事後Realm()任何通話將納入遷移時邏輯刪除。在此之前沒有理由保存Realm的副本。

如果您正在使用故事板,let realm = try! Realm()作爲UIViewController子類中的某個屬性有時可能最終在應用代理有機會觸發之前調用。在這種情況下,您可以在Realm配置完成後,在應用程序委託中手動設置故事板邏輯。

+0

謝謝@TiM,這件事澄清了很多 –