1

Dans mon projet, j'ai des objets que je montre depuis un serveur, appelons-les Foo. Quand je reçois mon flux Foo, je les analyse dans une sous-classe NSMutableDictionary appelée RemoteFoo, et transmets ces objets RemoteFoo tout autour de l'application pour afficher les données.Abstract NSManagedObject et NSDictionary

Si l'utilisateur finit par vouloir télécharger un RemoteFoo, je crée ensuite une entité NSManagedObject de base de données appelée Foo, et l'instancie à l'aide des valeurs de RemoteFoo. Tout cela fonctionne. Le problème que j'ai est que si je veux qu'une méthode fonctionne sur un RemoteFoo et un Foo, je dois le dupliquer dans RemoteFoo.m et Foo.m. En outre, mon application si plein de Dupliquons de initialisation comme:

- (id)initWithFoo:(Foo *)foo; 
- (id)initWithRemoteFoo:(RemoteFoo *)foo; 

Comment puis-je éviter tout ce code-duplication tout en séparant encore la RemoteFoo à distance temporaire des entités Foo-données de base qui représentent Foo l'utilisateur a enregistré localement?

Répondre

2

Vous pouvez simplement enregistrer tous les RemoteFoo comme Foo et travailler avec ceux-ci. Si vous avez besoin d'un comportement différent, vous pouvez avoir un attribut sur Foo indiquant s'il est distant ou non.

+0

RemoteFoos changent constamment cependant, et sont demandés dans différentes listes à partir du serveur de plusieurs façons, par le biais de multiples points dans l'application . Si je les sauvegarde tous, je devrais constamment mettre à jour chaque enregistrement Foo que j'en ai, car les détails de chaque RemoteFoo peuvent changer. Je pense que cela ajouterait beaucoup de frais généraux à la performance de mon application. Sans oublier qu'il y a des milliers de RemoteFoo, mais seulement des dizaines de Foo que l'utilisateur va télécharger. – coneybeare

+0

Cela semble définitivement être le moyen le plus facile ... pensez-vous qu'il y aurait un coup de performance en l'utilisant comme je le décris dans le commentaire ci-dessus? – coneybeare

+1

Les données de base ont été fortement ajustées pour la performance. Vous ne pouvez pas vous-même être plus efficace avec votre solution homebrew qu'avec CoreData. – Jaanus

1

Modifiez votre modèle de données de base comme suit. Utilisez une instance Foo et ajoutez un attribut booléen isRemote (ou quelque chose de similaire) que vous avez défini par défaut sur NO. Lorsque vous téléchargez vos objets distants, instanciez ceux-ci en tant qu'objets gérés Foo et définissez leur attribut isRemote sur yes. De cette façon, vous n'avez besoin de traiter qu'une seule instance de votre application, tout en conservant la possibilité de différencier clairement les objets Foo locaux et distants. Si votre application le permet, vous pouvez même déclarer l'attribut isRemote comme transitoire, afin qu'il ne soit jamais stocké sur le disque, juste en mémoire. Si vous ne tenez pas à persister cette information, alors c'est peut-être la meilleure solution.

+0

Cette réponse est similaire à Jaanus, mais je ne connaissais pas l'option transitoire. Cela semble attrayant parce que les RemoteFoos ne changent généralement pas en une seule session, donc l'enregistrement dans la mémoire sonne bien. Je vais rechercher plus sur ce – coneybeare

+0

hmm, j'ai mal lu. Je pensais que l'ensemble Foo pourrait être tranient, mais seulement les colonnes peuvent l'être. – coneybeare

3

Avez-vous pensé à utiliser quelque chose comme un cluster de classe -

http://seanmurph.com/weblog/make-your-own-abstract-factory-class-cluster-in-objective-c/

--------- Foo --------   NSManagedObject 
    |     |     | 
RemoteFoo    LocalFoo ------ CoreDataFoo 
+0

Salut, C'est vraiment la façon dont je souhaite aller, mais les entités de données de base doivent être une sous-classe de NSMangedObject – coneybeare

+0

Je sais que c'est un peu compliqué mais ne serait-il pas possible d'avoir un médiateur entre les entités de données de base et une classe dans le cluster de classe Foo? Je vais ajouter un petit diagramme à mon article Je pense que je devrais ajouter l'avertissement que je suis très endormi et très affamé en ce moment - donc mes réponses sont peut-être un peu folles! –

+0

Comment l'interaction entre LocalFoo et CoreDataFoo fonctionnerait-elle exactement? Pouvez-vous donner un petit exemple de fonctionnement de MediatorFoo et de ses branchements? – coneybeare