coreData performFetch中的viewDidLoad不工作 [英] CoreData performFetch in viewDidLoad not working
问题描述
当我的主视图控制器加载,并调用 viewDidLoad
我执行获取请求并退役数组或我的核心数据对象:
+(NSArray *)getData {
//获取数据
NSError * error = nil;
if(![[[AppDelegate instance] fetchedResultsController] performFetch:& error]){
//更新以适当地处理错误。
NSLog(@未解析的错误%@,%@,错误,[错误userInfo]);
abort();
}
NSArray * items = [[AppDelegate instance] .fetchedResultsController fetchedObjects];
return item;
} // end
由于某种原因,如果我从 viewDidAppear:
viewDidLoad
。 它工作正常,并返回 CoreData
对象的 NSArray
。
有没有理由为什么这不能在 viewDidLoad
中工作?
strong> EDIT:
获取结果控制器方法:
/ **
*控制器从核心数据获取结果
*
* @version $ Revision:0.1
* /
- (NSFetchedResultsController *) fetchedResultsController {
if(fetchedResultsController!= nil){
return fetchedResultsController;
}
//创建并配置读取请求
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription * entity = [NSEntityDescription entityForName:@SiteConfiginManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
//创建排序描述符数组
NSSortDescriptor * sectionTitle = [[NSSortDescriptor alloc] initWithKey:@createdDateascending:NO];
NSArray * sortDescriptors = [[NSArray alloc] initWithObjects:sectionTitle,nil];
[fetchRequest setSortDescriptors:sortDescriptors];
//创建和初始化fetch结果控制器
NSFetchedResultsController * aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@Root];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;
//内存管理
return fetchedResultsController;
} // end
解决方案我的猜测是,你的视图控制器是你的MainWindow.xib的一部分,因此它的viewDidLoad被调用之前,你的应用程序委托获得核心数据上下文准备好。
您可能希望在viewWillAppear中运行此操作,以便在离开屏幕并返回时获取新数据。另一个选项是确保应用程序委托通过获取核心数据堆栈(如果尚未准备好)来响应fetchedResultsController。
When my main view controller is loaded and it calls viewDidLoad
I am performing a fetch request and retiring an array or my core data objects:
+ (NSArray *)getData {
// Fetch Data
NSError *error = nil;
if (![[[AppDelegate instance] fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
NSArray *items = [[AppDelegate instance].fetchedResultsController fetchedObjects];
return items;
}//end
For some reason, this returns an empty array when called from viewDidLoad
.
If I call the same method from viewDidAppear:
it works correctly and returns the NSArray
of my CoreData
objects.
Is there a reason why this won't work in viewDidLoad
?
EDIT:
Fetched Results Controller method:
/**
* The controller the gets our results from core data
*
* @version $Revision: 0.1
*/
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController != nil) {
return fetchedResultsController;
}
// Create and configure a fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SiteConfig" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Create the sort descriptors array
NSSortDescriptor *sectionTitle = [[NSSortDescriptor alloc] initWithKey:@"createdDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sectionTitle, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
// Create and initialize the fetch results controller
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;
// Memory management
return fetchedResultsController;
}//end
解决方案 My guess is that your view controller is part of your MainWindow.xib, and so its viewDidLoad is being called before your app delegate gets the core data context ready.
You probably want to run this in viewWillAppear anyway, so that you'll get new data if you leave the screen and return. The other option would be to ensure the app delegate responds to fetchedResultsController by getting the core data stack ready if it isn't already.
这篇关于coreData performFetch中的viewDidLoad不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!