IOS: 从 uipicker 的核心数据中获取数组

IOS: fetch array from core data for uipicker

我正在尝试让 UIPickerController 显示一些用户。如果我如下硬编码一些示例用户,它就很容易工作:

  //in viewDidLoad
       _users = @[@"Ronald", @"David",
                          @"Sharon", @"Amir", @"Atul"]; //etc.

但是,我想从核心数据中抽取这些用户。到目前为止,我已经尝试了一个简单的获取和 nsfetchedresults 控制器,但似乎没有任何效果。从核心数据中获取数组的首选方法是什么。

//fetchrequest

  - (id) getUsers{
    NSFetchRequest *fetchRequest = [NSFetchRequest 

fetchRequestWithEntityName:@"User"];
    fetchRequest.resultType = NSDictionaryResultType;


    NSError *error      = nil;
    self.managedObjectContext = [chModel sharedInstance].managedObjectContext;

    NSArray *results    = [self.managedObjectContext executeFetchRequest:fetchRequest
                                                                   error:&error];

    return results;
}

//this throws an error at

    - (NSString *)pickerView:(UIPickerView *)pickerView
                 titleForRow:(NSInteger)row
                forComponent:(NSInteger)component
    {
        NSLog(@"in titleforrow");
        return _users[row];//error here.  also error if I substitute [0]

    }

//when I try


_users = [self.fetchedResultsController fetchedObjects];
}

frc 从未被调用

哥们两个建议:)

  1. 如果你已经声明了一个 属性 命名的执行者(你应该从你的 getter 声明中假设 :) )声明它是 NSArray 类型而不是 id :)

2.Change 你的 getter 实干家 return 数组而不是 id :)。 return 数组并声明 return 类型为 id,然后最终将其重新转换为数组以使用下标语法访问其实体没有任何意义:)

你的代码有问题

_doers 是一个实例变量:) self.doers 是一个属性 :)

当您使用@synchronize 同步您的 属性 时(现在您不再写它,因为 xcode 默认为您写一个)与 [=95= 同名的实例变量] 但前缀为它的下划线用于为您的 属性 提供默认 setter 和 getter :)

当您调用 _doers 时,您正在访问实例变量而不是 属性,因此您的 getter 永远不会被调用 :)

如何解决??

而不是调用 return _doers[row]; 调用 self.doers[row]

能解决问题吗??

不 :)。它 return 是一个用户实体对象数组 :) 而不是字符串数组 :) 所以如果你简单地说 self.doers[row] 你将 return 一个用户对象(在你的例子中是字典)一个接受字符串的方法:)

那正确的做法是什么??

- (NSString *)pickerView:(UIPickerView *)pickerView
                 titleForRow:(NSInteger)row
                forComponent:(NSInteger)component
    {
        User *userInstance =  (User *)self.doers[row];
        return userInstance.name; //user entiy attribute which holds name or something like that 
    }

- (NSString *)pickerView:(UIPickerView *)pickerView
                 titleForRow:(NSInteger)row
                forComponent:(NSInteger)component
    {
        return [self.doers[row] valueForKey:@"name"] //user entiy attribute which holds name or something like that 
    }

它会起作用 :) 尽管使用 getter 作为 属性 的模型很差 :)

这个方法正确吗??

会成功吗??当然! ...这是正确的方法吗?决不! :)

对于选择器中的每一行,都会调用此方法,因为您正在访问 属性 self.doers 它的 getter 为每个单元格调用 :) 这意味着您将查询很多次核心数据:)

我认为它是不必要的 :) 你可以做的是让用户 NSFetchedResultsController 一个单调变量根据你的要求在 viewdidload 或 viewwillappear 中执行一次获取,并将其 feched 对象数组用于你的选择器: )

其他

将执行者 getter 中的代码移动到一个方法中,调用一次并填充一次 属性 并填充一次,然后使用 属性 填充选择器:)

核心数据操作成本高:)

无论如何编码愉快,一切顺利:)

声明:以上代码仅用于解释概念,并非用于复制粘贴:)盲目使用前请检查语法:)