2016-07-03 4 views
2

После прочтения this учебник Мне нужна помощь в понимании наиболее эффективного способа сделать следующее.iOS (Swift) Объект Singleton Realm Объект

Когда мое приложение открыто, ему необходимо загрузить объект Profile. Поскольку в жизни приложения должно быть только одно из них, я устанавливаю его как одноэлементный.

Realm, казалось, отличный способ сохранить и получить данные. При дальнейшем просмотре кажется, что мне нужно иметь модель данных, чтобы использовать Realms. После неудачной попытки интегрировать Object в Profile.swift, показанный ниже, мне нужна некоторая помощь в том, как я должен справиться с этой проблемой. Должен ли я сделать второй класс ProfileDataModel, который может быть вызван Profile для извлечения и сохранения изменений или есть способ включить Realm Object в класс Singleton?

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

Я предлагаю вам создать класс менеджера БД для обработки всех операций БД на нем, то вы можете создавать свои модели данных отдельно и использовать класс менеджера, чтобы получить данные/магазина на ваш дБ.

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

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

+1

То, что я использую, чтобы это сделать. При использовании в небольших приложениях это хороший способ отслеживать код, доступ к Царству. Также вы можете легко обменивать базовую базу данных, например, Основные данные, если необходимо (надеюсь, нет) – brainray

+0

@brainray, как вы это делаете сейчас или в больших приложениях? – sirvon

+0

@sirvon, этот подход работает отлично уже. или в больших проектах, если это не подходит для использования, вы можете напрямую использовать блоки записи, где вы обрабатываете запросы. , когда данные извлекаются, непосредственно записывают их в Realm с блоком записи и для обновления пользовательского интерфейса в каждом VC добавляют соответствующее уведомление для объектов realm для его обновления. https://realm.io/docs/swift/latest/#notifications –

2

Как вы уже сказали, было бы неплохо реализовать шаблон Singleton для управляемого объекта Realm. Они привязаны к потоку и могут быть изменены только из транзакций записи.

Вместо этого, если вам требуется общее изменчивое глобальное состояние и вы хотите сохранить это в пределах Realm, я бы рекомендовал иметь класс, который позволяет вам извлекать объекты, которые действуют только для описания сохраняемых данных. Например. a DatabaseManager в качестве одноэлементного объекта, который создает экземпляр нового Realm и возвращает единственный существующий объект Profile, наследующий от Object, но без специальных свойств и методов static.

Смежные вопросы