2013-04-02 18 views
6

Ich habe es mit einem Korruptionsproblem in der GKTurnBasedMatch-Klasse von Game Kit zu tun (siehe this thread), die manchmal zu einem ungültigen Spielstatus mit beschädigten MatchData führt.Wie identifiziere ich ein leeres NSData-Objekt, das als leere Klammer erscheint?

Also als Workaround, ich einen Weg schaffen, eine Möglichkeit, diese ungültigen Übereinstimmungen zu identifizieren, damit ich damit umgehen kann. Die beschädigten MatchData scheint ein guter Weg, dies zu tun. Bisher konnte ich sie jedoch nicht identifizieren. Wenn ich dies tun:

// "match" is an existing GKTurnBasedMatch object 
NSLog(@"match data is: %@",[match matchData]); 
NSLog(@"match data is nil? %@",[match matchData] == nil ? @"YES" : @"NO"); 
NSLog(@"match data equals empty nsdata? %@",[match matchData] == [NSData data] ? @"YES" : @"NO"); 

ich wie folgt zusammen:

match data is: <> 
match data is nil? NO 
match data equals empty nsdata? NO 

So werden die Spieldaten als ein Paar von leeren Klammern zeigen nach oben „<>“, die hoffentlich würde identifiziert werden könnte als null, aber anscheinend nicht.

Übrigens, ich speichere diese MatchData in einer Kerndateneinheit unter einem NSData-Attribut. Und wenn ich den NSManagedObjectContext speichere, dann NSLogge das NSManagedObject, um zu sehen, was drin ist, wird das NSData-Attribut in Frage noch erscheint als "<>"!

Allerdings, wenn ich dann eine neue NSManagedObjectContext erstellen, retreive die gleiche NSManagedObject aus ihm heraus, dann NSLog seine Werte, das Attribut NSData jetzt als nil auftaucht.

So scheint es, dass Core-Daten an einem gewissen Punkt das Attribut zu seinem poper nil Wert "bereinigen". Mein Problem ist, dass ich diesen Wert als nullvor diesen Punkt identifizieren muss, zu der Zeit, wenn ich es zum Kerndatenspeicher hinzufüge.

Antwort

18

In Ihrem letzten Fall führen Sie einen Vergleich von Objektinstanzen durch. Diese beiden Instanzen könnten leer sein und das Ergebnis wäre nicht wahr.

Versuchen Sie folgendes:

NSLog(@"match data equals empty nsdata? %@",[[match matchData] length] == 0 ? @"YES" : @"NO"); 
+0

Das hat den Trick, danke! – todd412

+0

Hatte das gleiche Problem. Perfekte Antwort. – mondousage

3

[NSData data] gibt ein neues Objekt NSData zurück, das nie == ein vorhandenes Objekt wird. Um zu prüfen, ob es sich um ein leeres NSData handelt:

[[match matchData] isKindOfClass:[NSData class]] && match.length == 0 
2

Coredata verändert nicht die Werte, die Sie auf der NSManagedObject Instanz festgelegt. Sie müssen einen leeren Wert NSData festlegen.

Um zu überprüfen, ob es sich um leere Daten handelt, überprüfen Sie die Eigenschaft length. Es sollte 0 sein, wenn es leer ist.