2010-06-30 56 views
0

我一直在這個小時,並找不到問題。 我有一個分數數組,我在覈心數據模型中保存在遊戲結束時。當我重新回到高分視圖 - 控制我從核心數據加載的分數,並使用下面的函數,其中得分陣列是一個NSMutableArray與我的10個高分核心數據排序NSMutableArray奇怪的結果

[self.scoresArray sortUsingFunction:firstNumSort context:@selector(totalScore)]; 

//function to sort high scores in the array 
NSInteger firstNumSort(id str1, id str2, void *context) { 
    static int counter = 0; 

    NSLog(@"counter = %d", counter); 
    counter++; 
    //NSLog(@"should be sorting"); 
    int num1 = [str1 totalScore]; 
    int num2 = [str2 totalScore]; 
    if (num1 > num2) { 
     NSLog(@"%@ is greater than %@", num1, num2); 
     return NSOrderedAscending; 
    } 
    else if (num1 < num2){ 
     NSLog(@"%@ is less than %@", num1, num2); 
     return NSOrderedDescending; 
    } 
else { 
    NSLog(@"%@ is the same as %@", num1, num2); 
    return NSOrderedSame; 
    } 

} 

這始終將最後得分排序的數組保存後無論其值如何進入列表頂部?奇怪的是,當我重新啓動我的應用程序時,相同的功能將所有分數以正確的降序排列,這正是我想要的,但顯然我不希望用戶必須重新啓動應用才能看到以正確順序顯示的分數。任何人都可以請點亮一下發生了什麼?

非常感謝

+0

什麼類型是str1和str2? – Eiko 2010-06-30 15:59:32

回答

1

唯一明顯的問題,我用你的代碼中看到的是,你傳遞給sortUsingFunction:context上下文參數(即@selector(totalScore))不使用的功能,並可以替換爲NULL。這不會解釋你所看到的行爲,無論如何也更像是一種風格。您可能要檢查的另一件事是totalScore的類型實際上是int。排序函數中的NSLog語句將它們視爲對象(%@是對象的格式說明符,對於int,您將使用%d。)您確定總分不是實際的NSStringNSNumber?除此之外,sort函數看起來應該起作用,並且由於您說它在啓動時會執行,所以我會在代碼之外尋找該問題。

您是否已在調試器中或通過NSLog聲明驗證過數組在調用之後實際上是否被錯誤排序?也許在你如何顯示排序的分數或在排序後發生了什麼以改變順序時會出現一些錯誤?

+0

+1如果'str1'是一個NSManagedObject'[str1 totalScore]'將返回一個指向對象的指針。分配一個指向整數的指針會給出一個很大但無關緊要的整數。最後一個分數可能在頂部,因爲它總是有最高的內存地址。我建議int num1 = [[str1 totalScore] intValue]; – TechZen 2010-06-30 18:57:08

+0

你是絕對正確的......我忘了獲取totalScore的intValue,它是存儲在Core Data中的一個NSNumber ....奇怪的是,雖然int var實際上被分配給了正確的值,但是在進行比較時並沒有工作?也許一些內部的事情發生在那裏... 無論如何感謝您的幫助 Jules – Jules 2010-07-01 08:33:57