2012-04-08 4 views
0

비슷한 문제가 많은 주제가 있음을 알고 있지만 내 질문에 대한 주제를 찾을 수 없었습니다.객관적인 c에 plist 작성

최고 기록을 저장하고 싶습니다.
최고 기록의 각 항목에는 두 개의 요소
과 NSString * 및 int가 있어야합니다.

나는 상위 20 개의 높은 점수 (문자열과 정수의 쌍)를 저장하고이를 plist에 저장하려고합니다.

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

내가 배열의 항목 0 내가 의 키 값 쌍을 삽입 할 수있는 사전 (문자열, int)를
내가 어떻게해야합니까되고 싶어요 :와

내가 시작? Property List Serialization

당신은 통지 확인하는 것이 좋습니다

+1

3 개의 의견 : 1. plist의 루트 요소가 실제로 배열입니까? 나는 의심한다. 차라리 목적에 맞게 NSMutableDictionary를 초기화하고 싶습니다. 2. 사전은 * 정렬되지 않은 * 콜렉션이므로 인덱스 0에 오브젝트를 삽입 할 수 없습니다. 3. 다른 질문으로 질문하기 전에 : 앱이 자체 번들에 쓸 수 없기 때문에 plist를 앱의 기본 번들 디렉토리로 다시 쓸 수 없습니다. –

+0

배열에 NSMutableDictionary 객체를 저장하고 저장하더라도로드 할 때 변경할 수 없습니다. ([NSArray Class Reference for initWithContentsOfFile] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/) initWithContentsOfFile :)는 "배열이 변경 가능할지라도이 배열에 포함 된 객체는 변경되지 않습니다."라고 말합니다. – Dondragmer

답변

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

그건 참으로 도움이된다. 그러나 문제는 모든 점수에 대해 점수와 문자열을 모두 저장하려고한다는 것이다. 키가 문자열이어야하고 키의 값이 점수 여야한다고 말합니다. –

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

먼저 주석에 대해 감사드립니다. 둘째, 명확하게 설명합니다. 내 목표는 plist에 저장하는 것입니다. 어쨌든, 내가 (위에서 설명한 방식으로 생각하고 있습니다.) 10 가지 최고 점수 (그들의 세부 사항은 int 및 NSString *의 쌍으로 구성됩니다.)를 원할 때마다 내가 삽입 할 int가 이미 삽입되어 있는지 확인하려면 이미 10 int보다 높습니다. 그렇다면 삽입하고 최소 int (10 개 이상인 경우) 제거하십시오. 그게 더 명확한가요? –

1

하십시오 PLIST에 저장하는 당신의 방법은 아마도 불변의 배열을 반환 한, 가변성 옵션을 ...

writeToFile:... 또는 writeToURL:... 방법으로 이루어집니다

+0

또한 대개 매우 나쁜 연습입니다 순서와 관련하여 비 결정 론자가 아닌 한 plist의 루트를 배열로 갖는다. –

관련 문제