2013-04-02 65 views
6

我正在處理遊戲工具包的GKTurnBasedMatch類中的腐敗問題(請參閱this thread),有時會導致遊戲狀態無效且matchData損壞。如何識別顯示爲空括號的空NSData對象?

因此,作爲一種解決方法,我正在創建一種方法來識別這些無效匹配,以便我可以適當地處理它們。損壞的matchData似乎是一個很好的方法來做到這一點。但是,到目前爲止,我一直無法識別它們。當我這樣做:

// "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"); 

我得到如下:

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

所以比賽數據被顯示爲一對空方括號「<>」,其中我希望可以認定爲,但顯然不是。

順便提一下,我將這個matchData存儲在覈心數據實體中,在NSData屬性下。當我保存NSManagedObjectContext,然後NSLog的NSManagedObject看看裏面有什麼,問題仍然 NSData屬性顯示爲「<>」!

但是,如果我再創建一個新的NSManagedObjectContext,retreive相同NSManagedObject出來,然後NSLog的自己的價值觀,NSData的屬性現在顯示爲

因此,在某些時候,核心數據似乎是「清除」了屬性值,因爲它的價值在於其價值價值。我的問題是,我實際上需要將這個值確定爲之前這一點,在我將它添加到核心數據存儲時。

回答

18

您正在對上一個案例中的對象實例進行比較。這兩個實例都可能是空的,結果將不成立。

試試這個:

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

這樣做的伎倆,謝謝! – todd412

+0

有同樣的問題。完美的答案。 – mondousage

3

[NSData data]返回一個新的NSData對象,它永遠不會==現有的對象。要檢查它是否爲空NSData:

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

CoreData不會改變你的NSManagedObject實例設置的值。您必須設置一個空的NSData值。

要檢查它是否爲空數據,請檢查其屬性length。空時應該爲0。