2010-11-19 6 views
1

Ich versuche, einige JSON für meine App zu analysieren. Beim Versuch, den "Name" -Wert zu setzen, erhalte ich den Fehler unrecognized selector sent to instance'.
Dies ist der Code-Zeile ist der Fehler passiert: self.name = [json_object objectForKey:@"name"]; (json_object ist ein NSDictionary und "Selbst" ist ein Objekt in Coredata)CoreData, JSON "nicht erkannt Selektor an Instanz gesendet"

Meine JSON wie folgt aussieht:

json_object: { 
draftstatus = "isdraftfull.php"; 
getcard = "getcard.php"; 
getpack = "getpack.php"; 
imageextension = ".jpg"; 
images = "images/small/"; 
joindraft = "joindraft.php"; 
joindraftmenu = "getjoindraftmenu.php"; 
login = "loginasuser.php"; 
name = "the server"; 
passpack = "passpack.php"; 
playerdraftstatus = "getplayerdraftstatus.php"; 
signup = "signup.php"; 
userexists = "checkifuserexists.php"; 
usesetidforimagepath = false; 
} 

Server.h Aussehen wie folgt:

#import <CoreData/CoreData.h> 
#import "JSON.h" 

@interface Server : NSManagedObject 
{ 
    NSMutableData *responseData; 
} 

@property (nonatomic, retain) NSString * playerdraftstatus; 
@property (nonatomic, retain) NSString * signup; 
@property (nonatomic, retain) NSNumber * usesetidforimagepath; 
@property (nonatomic, retain) NSString * login; 
@property (nonatomic, retain) NSString * imageextension; 
@property (nonatomic, retain) NSString * userexists; 
@property (nonatomic, retain) NSString * getcard; 
@property (nonatomic, retain) NSString * passpack; 
@property (nonatomic, retain) NSString * draftstatus; 
@property (nonatomic, retain) NSString * joindraftmenu; 
@property (nonatomic, retain) NSString * getpack; 
@property (nonatomic, retain) NSString * joindraft; 
@property (nonatomic, retain) NSString * images; 
@property (nonatomic, retain) NSNumber * isdefaultserver; 
@property (nonatomic, retain) NSString * root; 
@property (nonatomic, retain) NSString * name; 

- (id) initWithWebAddress:(NSString *) address; 
- (id) initWithWebAddressAsyn:(NSString *) address; 
- (void) fillFromJSON:(NSDictionary *) json_object; 
- (void) saveServer; 

@end 

Ich glaube, dass es vor ein paar Tagen funktionierte, aber ich erinnere mich nicht. Als ich heute damit anfing, habe ich das Objekt "root" hinzugefügt. Es kompiliert ohne Fehler, analysiert aber nicht dieses json.

Hilfe?

EDIT
änderte ich die JSON mit name = "the server" wieder zu kommen und wenn ich mich anmelde, dass wie diese NSLog(@"json_object name: %@", [json_object objectForKey:@"name"]); das Protokoll sagt json_object name: the server aber ich immer noch die gleichen Fehler, wenn ich versuche, das zu self.name einzustellen, die vom Typ String ist .
Ich habe festgestellt, dass manchmal bei der Überprüfung der Log-Version von JSON, dass der Wert innerhalb des Namens nicht immer in Anführungszeichen umgeben ist und wie Sie aus dem Protokoll von [json_object objectForKey:@"name"] es zeigt ohne Anführungszeichen um es. Ist das das Problem und warum passiert das? Wenn ich den json gerade auf der Web-Seite betrachte, die ihn ausgibt, gibt es IMMER Zitate um den Wert.

EDIT 2
Der vollständige Fehler wird wie folgt dar:

-[Server setName:]: unrecognized selector sent to instance 0x61036e0 
2010-11-19 15:46:10.113 TCGDraft[57953:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Server setName:]: unrecognized selector sent to instance 0x61036e0' 
*** Call stack at first throw: 

EDIT 3
habe ich ein NSLog auf "Selbst" und das ist, was self: <Server: 0x6143190> (entity (null); id: (null) ; data: {}) kommt zurück
Ich habe keine Ahnung, ob das aber normal ist. Dies ist ein CoreData-Objekt und ich habe das Gefühl, dass ich es irgendwie vermasselt habe.

EDIT 4
Ich ging zurück und auf dem Code sah wie folgt aus einem Server-Objekt von Coredata zu erstellen:

Server *server = [NSEntityDescription 
        insertNewObjectForEntityForName:@"Server" 
        inManagedObjectContext:context]; 

Als ich lief, dass ich jetzt eine Fehlermeldung erhalten, die besagt, nur EXC_BAD_ACCESS es so Sieht irgendwie aus, als ob dieses Objekt durcheinander ist ... aber ich weiß nicht wie.

EDIT 5
rechts, so ganz habe ich die Server.h und Server.m Dateien mit meinem eigenen Code gelöscht, ich neu erstellt sie aus dem Coredata-Objekt und versuchte, diesen Code, den ich in „Edit 4“ geschrieben und ich STILL bekomme den gleichen Fehler über EXC_BAD_ACCESS .... also bin ich jetzt anscheinend BACKWARD anstatt Forward gegangen.

+0

[json_object objectForKey: @ "name"]; Es gibt Nullwerte zurück. Prüfen Sie. – jfalexvijay

+0

Wie kann es einen Nullwert zurückgeben, wenn es dort heißt, dass "Name" unter "json_object" ist "Default Server"? –

+0

Sind Sie sicher, dass json_object ein NSDictionary ist ?! Führen Sie einen NSLog aus (@ "class:% @", [json_object class]); und sehen, was es zurückgibt. –

Antwort

3

Erstens, ich schlage vor, Sie trennen das NSManagedObject vollständig von Ihren JSON-Parser-Methoden. Das gesamte asynchrone Laden und Verarbeiten Ihrer JSON-Daten sollte in einem separaten Objekt behandelt werden, das Sie dann den Eigenschaften Ihres verwalteten Objekts zuweisen können.

#import <CoreData/CoreData.h> 

@interface Server : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSString * playerdraftstatus; 
@property (nonatomic, retain) NSString * signup; 
... 
@property (nonatomic, retain) NSString * name; 

@end 

Zweitens Sie NICHT die @dynamic Werte ändern zurück zu Coredata @synthesize sonst werden diese Objekte für Sie zu manipulieren und speichern nicht in der Lage sein, (das ist wahrscheinlich, warum Sie die EXEC_BAD_ACCESS Ausnahme bekommen, wenn Sie versuchen, und speichern das Objekt!).

@dynamic *playerdraftstatus; 
@dynamic *signup; 
... 
@dynamic *name; 

Jetzt versuchen die Attributwerte von der Steuerung zuzuweisen, bei der Sie Ihre Server-Objekt erstellen, dh

Server *server = [NSEntityDescription 
        insertNewObjectForEntityForName:@"Server" 
        inManagedObjectContext:context]; 

server.name = [json_object valueForKey:@"name"]; 

Und schließlich, stellen Sie sicher, dass Sie nicht loslassen immer das Server-Objekt als Coredata aussehen wird nach das für dich automatisch.

PS: Wenn Sie Ihr Datenmodell geändert Sie müssen möglicherweise die App aus dem iPhone/Simulator zurücksetzen/löschen sonst erhalten Sie eine Fehlermeldung, dass der Speicher-Typ mit dem bestehenden am Telefon usw.

unvereinbar ist

Lassen Sie mich wissen, wie Sie gehen und wenn Sie weitere Fehlermeldungen erhalten.

Cheers,

Rog

+0

Wo warst du vor 3 Stunden? Das waren so ziemlich all meine Probleme, die ich irgendwann herausgefunden habe. –

0

Das Problem ist, dass Sie eine SetName-Methode in Ihrer Server-Klasse nicht haben. Es hat nichts mit den JSON-Daten zu tun. Stellen Sie sicher, dass Sie Ihre Eigenschaften synthetisieren oder die erforderlichen Methoden anderweitig definieren.

+0

Dies ist ein Objekt, das durch Auswählen der Entität "Server" in meiner CoreData xcdatamodel-Datei und Klicken auf "Datei -> Neue Datei" und Auswählen einer "Verwalteten Objektklasse" und Befolgen der Eingabeaufforderungen erstellt wird. Bedeutung, XCode hat diese Datei erstellt, wenn sie nicht über einige erforderliche Methoden verfügt, dann ist etwas ernsthaft falsch. Das ist das dumme Zeug, das ich an Objective-C und XCode hasse. –

+0

Warum nicht nur Humor uns und posten, was in Server.h ... –

+0

@CrystalSkull: Hinzugefügt, um den ursprünglichen Beitrag. –

Verwandte Themen