2010-06-30 39 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