从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];
我的应用中的单身人士:
...将始终在StageDetailViewController初始化时初始化,因此作为单例,它只需要在应用程序的运行时初始化一次。因此,对fetchSectorList方法的简单调用就可以了。
马库斯,很遗憾将你的名字与单身人士联系起来......我发誓要在稍后阶段扩大我的军械库。
答案 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 ....
}
我怀疑你会得到你想要的结果。
你在持久性商店里有什么东西吗?
self.managedObjectContext
是否返回实际对象或是否为nil?
答案 1 :(得分:0)
在第一个示例中,您正在创建一个新的ContentController对象,但您没有给它一个托管对象上下文。因此,您对上下文执行提取请求的调用将传递给nil,因此您无法获得任何结果。
除非您在访问者中懒惰地创建它,否则可能存在问题?我无法从你在问题中的代码中看出来。请在fetchSectorList中放置一个断点,并检查所有核心数据播放器的值,以了解工作和非工作运行。
答案 2 :(得分:0)
感谢所有的建议。根据Marcus的评论,我深入研究了Singletons,并且在-viewdidload()中提供StageDetailViewController所需结果的调用就是:
[[ContentController sharedInstance] fetchSectorList];
我的应用中的单身人士:
...将始终在StageDetailViewController初始化时初始化,因此作为单例,它只需要在应用程序的运行时初始化一次。因此,对fetchSectorList方法的简单调用就可以了。
马库斯,很遗憾将你的名字与单身人士联系起来......我发誓要在稍后阶段扩大我的军械库。