2016-10-02 3 views
0

Я пытаюсь работать с одним из документированных методов миграции базы данных области и установки версии схемы. Тип кода, который я использую:Перенос области, где инициализировать

let config = Realm.Configuration(
    // Set the new schema version. This must be greater than the previously used 
    // version (if you've never set a schema version before, the version is 0). 
    schemaVersion: 1, 

    // Set the block which will be called automatically when opening a Realm with 
    // a schema version lower than the one set above 
    migrationBlock: { migration, oldSchemaVersion in 
     // We haven’t migrated anything yet, so oldSchemaVersion == 0 
     if (oldSchemaVersion < 1) { 
      // Nothing to do! 
      // Realm will automatically detect new properties and removed properties 
      // And will update the schema on disk automatically 
     } 
}) 

// Tell Realm to use this new configuration object for the default Realm 
Realm.Configuration.defaultConfiguration = config 

Это, по-видимому, довольно стандартный код и выглядит другим. Однако то, что, кажется, отключает меня, - это то, где я инициализирую экземпляр Realm, который вызывает настройку схемы, которая не устанавливается или не сохраняется.

, что я борюсь с где установить следующий код:

let uiRealm = try! Realm() 
  • Если я кладу это в верхней части AppDelegate выше @UIApplicationMain инициализирует слишком рано
  • Если я создаю контроллер файл, который я намереваюсь вызывать внутри функции после миграции, и поместить инициализатор вверху, что он все еще не работает
  • Если я поместил его в класс ViewController, как в приведенном ниже коде, ошибка Instanc е член uiRealm не может быть использован по типу XYZViewController

    import UIKit 
    import RealmSwift 
    
    class XYZViewController: UITableViewController,UIPickerViewDataSource,UIPickerViewDelegate { 
    
        let uiRealm = try! Realm() 
        var scenarios = uiRealm.objects(Scenario).filter("isActive = true ") 
    
    } 
    

Так что мой вопрос: есть ли какие-либо рекомендации о том, где инициализируется, и как лучше перенести.

ответ

1

Вам необходимо убедиться, что вы установили свой объект Configuration в качестве конфигурации по умолчанию в Realm перед любыми другими частями вашего кодового вызова Realm().

Лучшая практика - не придерживаться каких-либо ссылок на Realm(), если у вас нет веской причины. Каждый раз, когда вы вызываете Realm(), он возвращает ранее кэшированный экземпляр объекта, поэтому нет преимуществ по производительности, создавая ссылку на экземпляр, а затем навешивая его на жизненный цикл вашего приложения.

Лучшее место для установки объекта Configuration с информацией о миграции как можно скорее, прежде чем код имел возможность позвонить Realm(). Поэтому делегат приложения является хорошим местом для этого.

Если у вас есть свойства класса, которые полагаются на Realm(), которые уже были предварительно сконфигурированы, это может помочь добавить к этим свойствам ключевое слово lazy, чтобы их создание задерживалось до тех пор, пока вы им не понадобятся.

+0

Спасибо за это, так как я могу преобразовать следующее в ленивую инициализацию? scenarios = uiRealm.objects (Сценарий) .filter ("isActive = true"). Если я просто ставлю ленивый на фронт, я получаю сообщение об ошибке «Использование неразрешенного идентификатора uiRealm» –

+0

Не стоит беспокоиться! Хм, есть ли причина, по которой вы не можете просто использовать 'Realm()' вместо uiRealm? – TiM

+0

Привет, я обошел это, объявив var сценарии: Результаты ! вверху, а затем инициализирует область в каждой функции. Снова я пытался сделать слишком много, как глобальный съедобный, и все это переместило в функции. –