coreData performFetch中的viewDidLoad不工作 [英] CoreData performFetch in viewDidLoad not working

查看:132
本文介绍了coreData performFetch中的viewDidLoad不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我的主视图控制器加载,并调用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆