核心数据 - 从另一个类调用时,fetchedobjects数组为空

时间:2012-01-03 18:35:07

标签: objective-c arrays core-data initialization class-method

从UIViewController类(名为StageDetailViewController)的 - viewDidLoad()我在另一个类(称为ContentController)上调用实例方法。

 - (void)viewDidLoad {
        [super viewDidLoad];
        ContentController * instance = nil;
        instance = [[ContentController alloc] init];
        [instance fetchSectorList];
        [instance release];

       ....other stuff ....

}

被调用的方法(fetchSectorList)如下所示:

- (void)fetchSectorList {

     NSLog(@"fetchSectorList method called");

     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Sectors" inManagedObjectContext:self.managedObjectContext];
     [fetchRequest setEntity:entity];
      NSError *error;
      NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

      for (NSManagedObject *info in fetchedObjects) {
           NSLog(@"aircraft in fetchsectorlist: %@", [info valueForKey:@"aircraft"]);
      }

[fetchRequest release]; 

}

该方法的类型为void,因为在此阶段我想要做的就是调用它并确保它有一些有效的内容。

问题是:当我从StageDetailViewController调用(void)fetchSectorList时,NSLog文件确认它已被调用:

“fetchSectorList方法”

...但for循环不会返回任何内容!

但是,当我从ContentController类内部调用(void)fetchSectorList时,for循环返回一个“飞机”列表。

- (NSFetchedResultsController *)stageResultsController {
    [self fetchSectorList];
    return [self resultsControllerForEntity:@"Stage"];
}

为什么我不能从另一个类调用同样的方法?请帮忙。所有的贡献都非常受欢迎。

注意:

1)我声明了NSManagedObjectModel,NSManagedObjectContext和NSPersistentStoreCoordinatorin ContentController.h 2)我从互联网上的一个例子继承了核心数据代码的骨架。它定义了一个类方法,该示例由示例中的另一个类用于初始化类。

+ (ContentController *)sharedInstance {
    static ContentController * instance = nil;
    if (!instance) {
        instance = [[ContentController alloc] init];

但是我选择在我的调用类(StageDetailViewController)的viewdidload()中显示上面显示的初始化代码。这可能是问题的一部分吗?

感谢您的耐心等待。我真的很感激这里的一些意见。我很乐意澄清以上任何内容。

解决方案!!!

伙计们,感谢所有的建议。根据Marcus的评论,我深入研究了Singletons,并且在-viewdidload()中提供StageDetailViewController所需结果的调用就是:

[[ContentController sharedInstance] fetchSectorList];

我的应用中的单身人士:

  • (ContentController *)sharedInstance

...将始终在StageDetailViewController初始化时初始化,因此作为单例,它只需要在应用程序的运行时初始化一次。因此,对fetchSectorList方法的简单调用就可以了。

马库斯,很遗憾将你的名字与单身人士联系起来......我发誓要在稍后阶段扩大我的军械库。

3 个答案:

答案 0 :(得分:1)

首先,不要使用单身人士。花时间了解依赖注入设计。

其次,你没有正确使用单身人士。

- (void)viewDidLoad {
        [super viewDidLoad];
        ContentController * instance = nil;
        instance = [[ContentController alloc] init];
        [instance fetchSectorList];
        [instance release];

       ....other stuff ....

}

在此代码中,您不使用单例。您正在创建一个对象,在其上执行一个方法,然后销毁它。因此它没有任何价值。

将此代码更改为:

- (void)viewDidLoad {
        [super viewDidLoad];
        ContentController * instance = [ContentController sharedInstance];
        [instance fetchSectorList];

       ....other stuff ....

}

我怀疑你会得到你想要的结果。

更新1

你在持久性商店里有什么东西吗?

self.managedObjectContext是否返回实际对象或是否为nil?

答案 1 :(得分:0)

在第一个示例中,您正在创建一个新的ContentController对象,但您没有给它一个托管对象上下文。因此,您对上下文执行提取请求的调用将传递给nil,因此您无法获得任何结果。

除非您在访问者中懒惰地创建它,否则可能存在问题?我无法从你在问题中的代码中看出来。请在fetchSectorList中放置一个断点,并检查所有核心数据播放器的值,以了解工作和非工作运行。

答案 2 :(得分:0)

感谢所有的建议。根据Marcus的评论,我深入研究了Singletons,并且在-viewdidload()中提供StageDetailViewController所需结果的调用就是:

[[ContentController sharedInstance] fetchSectorList];

我的应用中的单身人士:

  • (ContentController *)sharedInstance

...将始终在StageDetailViewController初始化时初始化,因此作为单例,它只需要在应用程序的运行时初始化一次。因此,对fetchSectorList方法的简单调用就可以了。

马库斯,很遗憾将你的名字与单身人士联系起来......我发誓要在稍后阶段扩大我的军械库。