3

当我的主视图控制器被加载并调用时,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:它可以正常工作并返回NSArray我的CoreData对象​​。

有没有理由为什么这不起作用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
4

1 回答 1

1

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

无论如何,您可能都希望在 viewWillAppear 中运行它,以便在离开屏幕并返回时获得新数据。另一种选择是确保应用程序委托响应 fetchedResultsController 通过准备好核心数据堆栈(如果尚未准备好)。

于 2012-07-04T19:55:30.733 回答