viewDidLoad中的CoreData performFetch不起作用

时间:2012-07-04 19:52:32

标签: objective-c ios cocoa-touch core-data nsfetchedresultscontroller

当我的主视图控制器被加载并调用viewDidLoad时,我正在执行获取请求并停用数组或我的核心数据对象:

+ (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

出于某种原因,从viewDidLoad调用时会返回一个空数组。

如果我从viewDidAppear:调用相同的方法,它可以正常工作并返回NSArrayCoreData个对象。

是否有理由说这不适用于viewDidLoad

修改

获取结果控制器方法:

/**
 * 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

1 个答案:

答案 0 :(得分:1)

我的猜测是您的视图控制器是MainWindow.xib的一部分,因此在您的应用程序委托获得核心数据上下文之前,它的viewDidLoad正在被调用。

你可能想在viewWillAppear中运行它,这样你就可以在离开屏幕并返回时获得新数据。另一个选择是确保app delegate响应fetchedResultsController,方法是获取核心数据堆栈(如果尚未准备好)。