objective example ios swift swift3 realm

ios - example - realm swift 4



Swift 3: observador de propiedad para singleton (3)

Me pregunto si hay alguna manera de observar la clase de singleton para los cambios en ony de su propiedad

En mi caso, con Realm tengo algo como esto

class User: Object { dynamic var name:String = "" dynamic var email:String = "" dynamic var id:String = "" dynamic var picURL:String = "" dynamic var pic:Data = Data() static let currentUser = User() { didSet { try! realm.write { realm.add(currentUser, update: true) } } } }

Lo que quiero lograr es que quiero tener solo un objeto de usuario en mi aplicación, y cada vez que cualquiera de sus propiedades se modifique, me gustaría guardarlo en Realm.

Sin embargo, el ejemplo anterior muestra un error que

las declaraciones ''let'' no pueden estar observando propiedades

¿Cómo lo abordarías? ¿Crees que mi idea de tener Realm object singleton y actualizándola cada vez que cambian algunas propiedades es una buena idea?

Me pregunto si realmente tiene sentido tener un objeto singleton de clase que persista en Realm.


Bueno, si solo tiene un usuario, debe poner este observador en cada variable, en lugar de en el usuario let . Y allí puede llamar a un método para la actualización del usuario.

dynamic var name: String { didSet{ User.updateOnRealm()//create this method } }

Para escribir el método de actualización, tendrás que escribir algo como esto

class func updateOnRealm() { //update code here }


De acuerdo con lo que escribiste:

Lo que quiero lograr es que quiero tener solo un objeto de usuario en mi aplicación, y cada vez que cualquiera de sus propiedades se modifique, me gustaría guardarlo en Realm.

Sugeriría esta solución:

  1. Cree un class User que no use el patrón de Singleton.

  2. Cree un class UserManager que se ajuste al patrón de Singleton

  3. Cree métodos setter personalizados para A usuario. En estos incubadores, puede cambiar las propiedades de los usuarios CON o SIN escribir en la base de datos. También puede verificar el uso de INPUT (establezca el nombre en minúsculas, etc.).

Con este enfoque puede probar fácilmente su clase de User , ampliarla, subclase y reutilización.

Si necesita fragmentos de código, comente a continuación =).


No es posible tener un observador general para un solo Object dominio en este momento, sin embargo, hay un problema al rastrearlo en el Realm GitHub y creo que se está dando prioridad en este momento.

Alcivanio tiene razón en cuanto a que deberá activar manualmente un evento de actualización para asegurarse de que los cambios se mantengan en Realm. Dicho esto, como Realm controla los didSet en objetos persistentes, no se garantiza que se llame a una vez que un objeto se haya guardado en Realm. Por razones de simplicidad, recomendaría usar un cierre para actualizar el objeto del usuario.

Respuesta actualizada: si su singleton es un Object Reino, no puede modificar sus propiedades fuera de una transacción de escritura. Como escribí a continuación, lo más fácil sería tener un cierre de update que administrara la transacción de escritura de Realm y simplemente actualice las propiedades de su objeto Singleton dentro de él.

Como también ha visto, no puede usar didSet con una propiedad definida con let , por lo que es mejor regresar a las convenciones de Objective-C y usar una variable de instancia interna.

Entonces todo, tal vez considere hacer esto:

fileprivate var _current: User? = nil class User: Object { dynamic var name:String = "" dynamic var email:String = "" dynamic var id:String = "" dynamic var picURL:String = "" dynamic var pic:Data = Data() static var current: User { if _current == nil { let realm = try! Realm() // Query for an existing user _current = realm.objects(User.self).first // Create a new user if it didn''t exist in Realm if _current == nil { _current = User() try! realm.write { realm.add(_current) } } } return _current } public func update(_ block: (() -> Void)) { let realm = try! Realm() try! realm.write(block) } } let user = User.current user.update { user.name = "DCDC" }