2016-05-20 3 views
0

enter image description here enter image description hererapide - changement d'objet après appel de fonction

j'ai un objet en utilisant le code ci-dessous

name = "Toma" 
    let toma = setupPet(name, family: "Hawn", stage: 1, imageName: "hawn_toma", imageNamef: "", imageNameEgg: "hawn_egg", hatchEXP: 5000, desc: "", eggDesc: "", rarity: "Common") 

    name = "Hawn" 
    let hawn = setupPet(name, family: "Hawn", stage: 2, imageName: "hawn", imageNamef: "", imageNameEgg: "hawn_egg", hatchEXP: 5000, desc: "", eggDesc: "", rarity: "Common") 
    hawn.basePet = toma 

    let tomaToHawn = NSEntityDescription.insertNewObjectForEntityForName("Evolution", inManagedObjectContext: self.appData.moc) as! Evolution 
    tomaToHawn.evolveTo = hawn 
    tomaToHawn.howEvolve = "Level" 
    tomaToHawn.evolveValue = "10" 

    NSLog("\(tomaToHawn.evolveTo!.name)") 

    toma.addEvolveToObject(tomaToHawn) 

    NSLog("\(tomaToHawn.evolveTo!.name)") 

Maintenant le résultat des deux NSLogs donne des valeurs différentes,

en option ("Hawn")

Facultatif ("Toma")

Il a changé après l'appel addEvolveToObject La méthode consiste

class Pet: NSManagedObject { 

    func addEvolveToObject(value:Evolution) { 
     let items = self.mutableSetValueForKey("evolveTo"); 
     items.addObject(value) 
    } 

} 

J'ai aussi essayé l'ajouter évoluer en utilisant @NSManaged func mais obtenir le même résultat. Une fois l'objet ajouté au nsset, evolveto est défini sur l'animal de compagnie auquel il est ajouté. Les autres champs conservent les données correctes

Modifier J'ai réduit le problème à la méthode addEvolveToObject. Si j'imprime en utilisant NSLog ("Pet CD: (value.evolveTo? .name)") avant l'appel items.addobject il donne la valeur correcte, mais si j'imprime le même après l'instruction, il donne une valeur différente

IE:

func addEvolveToObject(value:Evolution) { 
    NSLog("********************************************************************") 
    let items = self.mutableSetValueForKey("evolveTo"); 
    NSLog("Pet CD: \(value.evolveTo?.name)") 
    items.addObject(value) 
    NSLog("Pet CD: \(value.evolveTo?.name)") 
    NSLog("********************************************************************") 
} 

donne

Pet CD: En option ("Mel")

Pet CD: En option ("Joan")

Si je commente la ligne d'objet COMBINEZ NSLogs donnent le résultat correct

Codes de classe: - Permet de définir simplement la base de données importation UIKit importation CoreData

class Setup: NSObject { 

    let appData : AppData = AppData.sharedInstance 

    func setup() { 
      // Hawn 
     name = "Toma" 
     let toma = setupPet(name, family: "Hawn", stage: 1, imageName: "hawn_toma", imageNamef: "", imageNameEgg: "hawn_egg", hatchEXP: 5000, desc: "", eggDesc: "", rarity: "Common") 

     name = "Hawn" 
     let hawn = setupPet(name, family: "Hawn", stage: 2, imageName: "hawn", imageNamef: "", imageNameEgg: "hawn_egg", hatchEXP: 5000, desc: "", eggDesc: "", rarity: "Common") 
     hawn.basePet = toma 

     let tomaToHawn = NSEntityDescription.insertNewObjectForEntityForName("Evolution", inManagedObjectContext: self.appData.moc) as! Evolution 
     tomaToHawn.evolveTo = hawn 
     tomaToHawn.howEvolve = "Level" 
     tomaToHawn.evolveValue = "10" 

     toma.addEvolveToObject(tomaToHawn) 

     appData.saveContext() 
    } 
    func setupPet(name : String, family : String, stage : NSNumber, imageName : String, imageNamef : String, imageNameEgg : String, hatchEXP : NSNumber, desc : String, eggDesc : String, rarity : String) -> Pet { 

     let pet : Pet = NSEntityDescription.insertNewObjectForEntityForName("Pet",inManagedObjectContext: appData.moc) as! Pet 
     pet.name = name 
     pet.family = family 
     pet.stage = stage 
     pet.imageName = imageName 
     pet.imageNamef = imageNamef 
     pet.imageNameEgg = imageNameEgg 
     pet.hatchEXP = hatchEXP 
     pet.rarity = rarity 
     pet.desc = desc 
     pet.eggDesc = eggDesc 

     return pet 
    } 
} 

animaux - propriétés de données de base classe

import Foundation 
import CoreData 

extension Pet { 

    @NSManaged var desc: String? 
    @NSManaged var eggDesc: String? 
    @NSManaged var family: String? 
    @NSManaged var gained: NSNumber? 
    @NSManaged var hatchEXP: NSNumber? 
    @NSManaged var imageName: String? 
    @NSManaged var imageNameEgg: String? 
    @NSManaged var imageNamef: String? 
    @NSManaged var name: String? 
    @NSManaged var rarity: String? 
    @NSManaged var stage: NSNumber? 
    @NSManaged var adopt: NSSet? 
    @NSManaged var evolveTo: NSSet? 
    @NSManaged var userPets: NSSet? 
    @NSManaged var basePet: Pet? 

} 

Pet

import Foundation 
import CoreData 


class Pet: NSManagedObject { 

    func addEvolveToObject(value:Evolution) { 
     let items = mutableSetValueForKey("evolveTo") as NSMutableSet; 
     items.addObject(value) 
    } 

} 

et les données de base de l'évolution classe

import Foundation 
import CoreData 

extension Evolution { 

    @NSManaged var evolveValue: String? 
    @NSManaged var howEvolve: String? 
    @NSManaged var evolveTo: Pet? 

} 

La classe animal peut prendre plusieurs objets d'évolution, chaque objet d'évolution est pour un animal de compagnie

+0

Non, j'essaie de comprendre pourquoi l'objet change quand je ne l'ai pas dit à –

+0

ajouté des codes de classe –

+0

J'ai aussi essayé l'évolution d'ajouter en utilisant @NSManaged func mais obtenir le même résultat. Une fois l'objet ajouté au nsset, evolveto est défini sur l'animal de compagnie auquel il est ajouté. Les autres champs conservent les bonnes données –

Répondre

2

La raison en est des relations bi-directionnelles. Lorsque vous vous connectez à une extrémité de la relation, l'autre extrémité sera connectée pour vous, donc lorsque vous ajoutez quelque chose à l'ensemble (l'extrémité la plus longue), l'autre extrémité (l'extrémité) sera définie pour vous. C'est ce que vous voyez.

Si ce n'est pas ce que vous voulez, vous devez ajouter 2 relations de plus, car vous voulez que toutes les relations soient bidirectionnelles, mais vous voulez également séparer les 2 que vous avez actuellement.

+0

Que feriez-vous pour définir les valeurs des relations supplémentaires? # –

+0

vous ne le feriez pas, cela arriverait automatiquement, votre code resterait le même que vous ajouteriez simplement 2 nouvelles relations et les relieriez comme les nouveaux inverses (l'espoir qui a du sens) - donc ce n'est pas une nouvelle relation, c'est deux nouvelles fins pour vos 2 extrémités de relation existantes – Wain

+0

Voyons voir si je comprends. je crée deux nouvelles relations et les assigner à l'inverse de celles existantes? Est-ce une relation sur chaque entité? –