【问题标题】:sorting NSMutableArray weird results with Core Data使用 Core Data 对 NSMutableArray 奇怪的结果进行排序
【发布时间】:2010-06-30 15:43:40
【问题描述】:

我已经研究了好几个小时,但找不到问题所在。 我有一组分数,我在游戏结束时将它们保存在核心数据模型中。保存后,当我回到高分视图控制器时,我从核心数据加载分数并使用以下函数对数组进行排序,其中分数数组是一个 NSMutableArray,有我的 10 个高分

[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;
    }

}

无论它的值如何,这总是将最后一个分数条目放在列表的顶部??奇怪的是,当我重新启动我的应用程序时,相同的功能会将所有分数按正确的降序排列,这是我想要的,但显然我不希望用户必须重新启动应用程序才能看到以正确顺序显示的分数。任何人都可以阐明发生了什么吗??

非常感谢

朱尔斯

【问题讨论】:

    标签: iphone cocoa-touch sorting core-data


    【解决方案1】:

    我在您的代码中看到的唯一明显问题是您传递给sortUsingFunction:context 的上下文参数(即@selector(totalScore))未被您的函数使用,可以用NULL 替换。不过,这并不能解释您所看到的行为,而且更多的是风格问题。您可能要检查的另一件事是totalScore 的类型实际上是int。您在排序函数中的NSLog 语句将它们视为对象(%@ 是对象的格式说明符,for 和 int 您将使用%d。)您确定总分实际上不是NSString 还是 NSNumber?除此之外,排序功能看起来应该可以工作,而且既然你说它在启动时就可以工作,我会在这段代码之外寻找问题。

    您是否在调试器中或通过NSLog 语句验证调用后数组实际上排序错误?也许您在显示排序后的分数方面存在一些错误,或者排序后发生了改变顺序的事情?

    【讨论】:

    • +1 如果str1 是一个NSManagedObject [str1 totalScore] 将返回一个指向对象的指针。将指针分配给整数会给出一个大但无意义的整数。最后一个分数可能在顶部,因为它总是具有最高的内存地址。我建议 int num1 = [[str1 totalScore] intValue];
    • 你是绝对正确的......我忘了得到totalScore的intValue,它是存储在Core Data中的NSNumber......奇怪的是虽然int var实际上被分配了正确的值但没有在进行比较时工作?也许那里发生了一些内部事情......无论如何感谢您的帮助 Jules
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2013-09-20
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多