0

J'ai travaillé avec CoreData pour l'une de mes applications iOS et j'ai voulu créer une fonction d'assistance pour transformer une représentation String d'une entité CoreData en une instance NSManagedObject de cette entité. Je viens de terminer mon premier cours Swift pour mon commandant et, d'après ce que je comprends, je suppose que la logique/implémentation est assez simple. Je crois que ma mise en œuvre est mauvaise parce que Swift est mon nouveau langage de programmation. J'essaie d'éviter de coder en dur une solution parce que mon intuition me dit qu'il y a une meilleure façon plus générale d'atteindre mon objectif.CoreData: conversion d'une chaîne en instance NSManagedObject

Exemple (Naïf pseudocode):

func getEntity(from string: String) -> NSManagedObject { 
    return string as! NSManagedObject 
} 

exécution souhaitée:

let stringRep = "Entity" 
entity(from: stringRep) 

Entity

Contexte:

Deux des entités CoreData avec lesquels je travaille sont Category et Service.

public class Category: NSManagedObject { } 
public class Service: NSManagedObject { } 

Category contient une relation à de nombreuses entités Service et mes autres fonctions d'aide à l'accès AppService CoreData à l'aide de cette relation.

CategoryTableViewController a trois cellules statiques, chacune contenant une représentation String des entités pour Category.

Je passe la représentation String sélectionnée d'une entité telle que Service pendant prepare(for segue: UIStoryboardSegue, sender: Any?) à l'autre UIViewController avec un UITableView. En utilisant la nouvelle fonction d'aide, je serai en mesure d'extraire de façon ambiguë de CoreData la représentation String et afficher les données dans le UITableView.

Mon but ultime est de couper les fonctions inutiles dans AppService avec la fonction ci-dessous.

func get(_ entities: String, for category: Category) -> NSFetchedResultsController<T> { 
    let someEntity = getEntity(from: entities) 
    let fetchRequest: NSFetchRequest<someEntity> = someEntity.fetchRequest() 
    fetchRequest.predicate = NSPredicate(format: "category == %@", category) 
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)] 

    return createFetchedResultsController(for: fetchRequest) 
} 

Exemple:

get("Service", for: category) 
+0

Vous ne pouvez pas le faire parce que 'ne sont pas liés CHAINE' et' NSManagedObject'. Et NSManagedObject n'est pas une entité. – vadian

+0

Je l'ai clarifié. C'est exactement comme ça que j'écris un pseudocode pour Swift à cause de la sémantique du langage. –

Répondre

1

Vous pouvez créer un nouvel objet d'une certaine entité basée sur le nom de l'entité. Comme toujours, vous aurez besoin de votre contexte d'objet géré.

Vous devez d'abord obtenir le NSEntityDescription:

let entity = NSEntityDescription.entity(forEntityName: "Widget", in: context) 

Vous pouvez alors créer l'objet:

let newWidget = NSManagedObject(entity: entity, in: context) 

Cependant, il serait préférable d'utiliser la sous-classe. Il inclut automatiquement les informations sur l'entité.

let newWidget = Widget(context: context) // much easier 
+0

Merci, cela aide beaucoup! La documentation était un peu vague sur 'NSEntityDescription' et comment l'utiliser. Il devrait s'intégrer parfaitement dans mon 'AppService'. –

0

Ce n'est pas possible de cette façon ...

1, Supposons qu'il y ait un nom entité « Personne » dans la mesure où vous avez un attribut comme « nom »

2, ont un quelque chose comme xx12145ac NSManagedObject vont chercher par requête OU Créer une nouvelle NSManagedObject de personne

3, une fois que vous avez cet objet de type personne, vous pouvez définir

myPersonObj.name = « qUELQU'UN » comme! String

J'espère que cela vous aidera !!!

Faites-moi savoir si vous rencontrez un problème .. :)