Swift 3: Observateur de la propriété pour singleton

Je me request s'il y a un moyen d'observer la class singleton pour les changements dans sa propriété

Dans mon cas, avec Realm j'ai quelque chose comme ça

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

Ce que je veux réaliser, c'est que je veux avoir un seul object user dans mon application, et chaque fois que l'une de ses propriétés est modifiée, je voudrais l'save sur Realm.

Cependant, l'exemple ci-dessus montre une erreur

'let' les déclarations ne peuvent pas être des propriétés d'observation

Comment l'aborderiez-vous? Pensez-vous que mon idée d'avoir Realm object Singleton et de le mettre à jour à tout moment des changements de propriété est une bonne idée?

Je me request s'il est vraiment logique d'avoir un object singleton de class qui est persisté par Realm.

Il n'est pas possible d'avoir un observateur général pour un seul Object royaume en ce moment, mais il y a un problème qui le suit dans le Realm GitHub et je crois que c'est prioritaire pour le moment.

Alcivanio a raison de dire que vous devrez triggersr manuellement un événement de mise à jour pour vous assurer que les modifications sont conservées dans Realm. Cela étant dit, étant donné que Realm contrôle les accesseurs dans les objects persistants, didSet n'est pas garanti que didSet soit appelé une fois qu'un object a été enregistré dans Realm. Pour des raisons de simplicité, je recommand d'utiliser une fermeture pour mettre à jour l'object user.

Réponse mise à jour: Si votre singleton est un Object , vous ne pouvez pas modifier ses propriétés en dehors d'une transaction d'écriture. Comme je l'ai écrit ci-dessous, la chose la plus facile à faire serait d'avoir une fermeture de update qui gère la transaction d'écriture Realm, et vous mettez simplement à jour les propriétés de votre object Singleton à l'intérieur.

Comme vous l'avez également vu, vous ne pouvez pas utiliser didSet avec une propriété définie avec let , il est donc préférable de revenir aux conventions Objective-C et d'utiliser une variable d'instance interne.

Alors tout, peut-être envisager de faire ceci:

 fileprivate var _current: User? = nil class User: Object { dynamic var name:Ssortingng = "" dynamic var email:Ssortingng = "" dynamic var id:Ssortingng = "" dynamic var picURL:Ssortingng = "" 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" } 

Eh bien, si vous avez juste un user, vous devriez mettre cet observateur dans chaque variable, plutôt que dans l' user let . Et là, vous pouvez appeler une méthode pour la mise à jour de l'user.

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

Pour écrire la méthode de mise à jour, vous devrez écrire quelque chose comme ça

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

Basé sur ce que vous avez écrit:

Ce que je veux réaliser, c'est que je veux avoir un seul object user dans mon application, et chaque fois que l'une de ses propriétés est modifiée, je voudrais l'save sur Realm.

Je suggérerais cette solution:

  1. Créez un class User qui n'utilise pas le model Singleton.

  2. Créez un class UserManager qui se conforme au model Singleton

  3. Créez des methods de définition personnalisées pour A user. Dans ces setters, vous pouvez ensuite modifier les propriétés des users WITH ou SANS écrire dans la database. Vous pouvez également vérifier l'utilisation INPUT (mettre le nom en minuscules etc.).

Avec cette approche, vous pouvez facilement tester votre class d' User , l'étendre, la sous-class et la réutiliser.

Si vous avez besoin de commentaires sur les extraits de code ci-dessous =).