2012-04-08 40 views
0

我知道有很多話題都有類似的問題,但是我一直沒能找到解決我的問題的話題。在客觀上寫一個plist

我想存儲一個高分的plist。
高分榜的每個條目都必須有兩個元素
一個NSString *和一個int。

我想存儲前20名高分(字符串和整數對)並在plist中執行此操作。

我開始:

NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"Mylist" ofType:@"plist"]]; 

我想要的數組項0是一個字典,在那裏我可以插入 的鍵值對(字符串,整數)
我該怎麼辦呢?

+1

三條評論:1.您的plist的根元素是否真的是一個數組?我懷疑。你寧願要爲你的目的初始化一個NSMutableDictionary。 2.然後,您不能在索引0處插入對象,因爲字典是*無序*集合。 3.在另一個問題中提出問題之前,您將無法將plist重寫爲應用程序的主包目錄,因爲應用程序無法將其寫入自己的包中。 – 2012-04-08 20:31:29

+0

即使您將NSMutableDictionary對象存儲在數組中並將其保存,當您加載它時,它們將是不可變的。 ([initWithContentsOfFile的NSArray類參考](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/ initWithContentsOfFile :)說:「這個數組包含的對象是不可變的,即使數組是可變的。」) – Dondragmer 2012-04-09 00:27:50

回答

1

您可以隨時撥打[arr addObject:score];,對其進行分類,並刪除最後一項,直到有10個。

排序:

[arr sortUsingComparator:^(id firstObject, id secondObject) { 
    NSDictionary *firstDict = (NSDictionary *)firstObject; 
    NSDictionary *secondDict = (NSDictionary *)secondObject; 
    int firstScore = [[firstDict objectForKey:@"score"] intValue]; 
    int secondScore = [[secondDict objectForKey:@"score"] intValue]; 
    return firstScore < secondScore ? NSOrderedAscending : firstScore > secondScore : NSOrderedDescending : NSOrderedSame; 
}]; 

如果你想得分是周圍的其他方式,改變「>」到「<」,反之亦然。將列表保留爲10:

while ([arr count] > 10) { 
    [arr removeLastObject]; 
} 

您可能必須從plist加載時進行排序。對於10分的成績將是最低的,所以我建議你這樣做以防萬一。

+0

確實有幫助!但是,問題是我想爲每個分數都存儲一個分數和一個字符串。說鑰匙應該是字符串,然後鑰匙的價值應該是分數? – 2012-04-09 15:21:26

0
[arr insertObject:[NSMutableDictionary dictionary] atIndex:0]; 
+0

首先,感謝評論。 二,澄清事情。我的目標是存儲在一個plist中,在某種程度上,我不知道如何(我正在思考我上面描述的方式)10個最高分(它們的細節構成了一對int和NSString *。每次我想要檢查我插入的int是否高於已經存在的10個int,如果是,插入並刪除最小int(如果它們總體大於10)。是否更清晰? – 2012-04-09 00:14:25

1

Property List Serialization

你將要作出的通知:可變性的選擇,因爲你的方法可能會返回不可變的數組...

中的plist存儲與writeToFile:...writeToURL:...方法完成

+0

也是通常很糟糕的做法除非它在秩序方面不具有貶義性 – 2012-04-09 01:53:19