【问题标题】:Random function in Core Data XcodeCore Data Xcode 中的随机函数
【发布时间】:2014-03-31 16:17:27
【问题描述】:

我是一名新程序员,正在尝试使用 Core Data 制作随机函数。我想要的是标签从我的实体返回一个随机 managedObject 。这是我的代码

- (IBAction)randomize{
    NSEntityDescription *entitydesc = [NSEntityDescription entityForName:@"Restraunt" inManagedObjectContext:context ];
    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    [request setEntity:entitydesc];
    NSError *error;
    NSArray *matchingData = [context executeFetchRequest:request error:&error];
    NSString *textString;
    int RandomNumber;
    RandomNumber = arc4random() %[matchingData count];
    textString = [matchingData objectAtIndex:RandomNumber];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"restraunt_name like %@",textString];
    [request setPredicate:predicate];

    if(matchingData.count <= 0){
        self.label.text = @"doesnt exist";}
    else {
        NSString *string;
        for (NSString *obj in matchingData){
            string = [obj valueForKey:@"restraunt_name"];

        }
        self.label.text = [NSString stringWithFormat:@" %@", string] ;
    }
}

【问题讨论】:

  • 你看到了什么?您希望看到什么?
  • 我希望看到字符串,但我看到内存中的位置

标签: objective-c xcode core-data


【解决方案1】:

这段代码有几处错误。例如,“textString”不是字符串,它是您的 Restraunt 实体之一。此外,您在 else 子句中的 for 循环只是遍历所有实体(使您的随机选择无关紧要),因此“字符串”将是您数据中的最后一个餐厅名称。你的代码应该是这样的,

- (IBAction)randomize{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Restraunt"];
    NSError *error;
    NSArray *matchingData = [context executeFetchRequest:request error:&error];
    int randomNumber = arc4random() %[matchingData count];
    NSManagedObject *aRestraunt = matchingData[randomNumber]; // aRestraunt might not be an NSManagedObject depending on whether you've subclassed NSManagedObject or not -- if you have, then that should probably be Restraunt instead.

    self.label.text = [aRestaurant valueForKey:@"restraunt_name"];
}

编辑后:

我上面提供的答案基本上是对您的代码进行“修复”以使其正常工作。但是,这并不是获取单个随机对象的最有效方法。没有必要为了得到一个对象而将所有对象都提取到内存中。相反,您可以按照 Hal Mueller 在他的评论中建议的那样获取您的记录数,然后将 fetchOffset 与 fetchLimit 结合使用来获取一条记录,

NSError *error;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Restraunt"];
NSUInteger count = [context countForFetchRequest:request error:&error];
if (! error) {
    NSUInteger rand = arc4random_uniform() % count;
    [request setFetchOffset:rand];
    [request setFetchLimit:1];
    NSError *fetchError;
    NSManagedObject *aRestraunt = [[context executeFetchRequest:request error:&fetchError] lastObject];
    if (! fetchError) {
        self.label.text = [aRestaurant valueForKey:@"restraunt_name"];
    }else{
        NSLog(@"There was an error in fetching a Restraunt entity");
}

【讨论】:

  • 哦,好吧,我明白你做了什么;我肯定是想得太复杂了。非常感谢
  • 不使用调用结果和错误参数。我很失望。你真的应该使用 arc4random_uniform()
  • 不是实例化商店中的每个@"Restraunt"实体,NSUInteger recordCount = [context countForFetchRequest:request error:&amp;error]; if (recordCount != NSNotFound) {...怎么样
  • @HalMueller,感谢您的建议。我最初的答案是让 OP 的代码工作的“快速而肮脏”。我已经更新了我的答案,以包含一种更节省内存的方式来获取单个记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2012-06-11
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多