刷新NSFetchedResultsController数据?

Dan*_*iel 14 core-data reload ios

我可以在我的应用程序中创建新的托管对象,在一个单独的视图中我有一个表格视图,显示我拥有的所有对象.

当我创建一个新的管理对象(在一个完全独立的观点),我发出这是试图让我的表视图用新的数据,其中包括我刚才提出的新对象重新加载的通知.

我不是在编辑表格视图.

只有一个托管上下文.

我无法理解我做错了什么.如果我关闭应用程序并重新启动我的新对象是在表视图中.当我收到通知新的对象时,我正在尝试调用reloadData,并且我还尝试再次执行获取,但我最终得到的是一个空表视图.

在代码方面,我的ListViewController:

@interface MyNotesViewController : UIViewController
{
    NSManagedObjectContext * __managedObjectContext;
    UITableView * _notesTableView;
    MyNotesTableViewDelegate_DataSource * _tableDelegate_DataSource;
}
Run Code Online (Sandbox Code Playgroud)

我的viewDidLoad看起来像这样:

- (void)viewDidLoad
{
    [super viewDidLoad];

    _tableDelegate_DataSource = [[MyNotesTableViewDelegate_DataSource alloc] init];
    _tableDelegate_DataSource.managedObjectContext = __managedObjectContext;
    [_notesTableView setDataSource:_tableDelegate_DataSource];

    NSError * _coreDataError;
    BOOL success = [[_tableDelegate_DataSource fetchedResultsController] performFetch:&_coreDataError];

    if(success){
        [_notesTableView reloadData];
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的委托/数据源对象中,我有:

@interface MyCommutesTableViewDelegate_DataSource : NSObject 

<UITableViewDataSource, NSFetchedResultsControllerDelegate>
{
    NSManagedObjectContext * __managedObjectContext;
    NSFetchedResultsController * __fetchedResultsController;
}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

@end
Run Code Online (Sandbox Code Playgroud)

实施摘录:

-(NSFetchedResultsController*)fetchedResultsController{
    if(!__fetchedResultsController){
        NSFetchRequest * request = [[NSFetchRequest alloc] init];
        [request setEntity:[NSEntityDescription entityForName:@"Note" inManagedObjectContext:__managedObjectContext]];

        [request setFetchBatchSize:10];

        NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"noteDate" ascending:NO];
        [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
        [sortDescriptor release];

        __fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:__managedObjectContext sectionNameKeyPath:nil cacheName:nil];


        __fetchedResultsController.delegate = self;
        [request release];

    }
    return __fetchedResultsController;
}
Run Code Online (Sandbox Code Playgroud)

我在这里有stander UITableView数据源方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    id <NSFetchedResultsSectionInfo> sectionInfo = 
    [[__fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"NotesTableViewCell";

    NotesTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {        
        NSArray * topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NotesTableViewCell" owner:nil options:nil];
        for(id currentObject in topLevelObjects){
            if([currentObject isKindOfClass:[UITableViewCell class]]){
                cell = (NotesTableViewCell*) currentObject;
                break;
            }
        }

    }

// Configure the cell.
    Note * _note = [__fetchedResultsController objectAtIndexPath:indexPath];

    [...]

    return cell;
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

我还原只是请求所有对象,因为我必须快速解决我的问题,然后我意识到,在我保存上下文后,我之前在应用程序启动时使用的获取请求,现在没有返回数据,没有错误,但它只是没有回报.

所以我想我如何实现NSFetchResultsController没有问题.但是在保存新对象后,请求怎么能开始不返回结果呢?

注意如果我重新启动,我仍然可以获得所有对象,包括新添加的对象.

标准要求:

-(NSArray*)getNotes{
    NSFetchRequest * request = [[NSFetchRequest alloc] init];

    NSEntityDescription * entity = [NSEntityDescription entityForName:@"Note" inManagedObjectContext:[self managedObjectContext]];
    [request setEntity:entity];

    NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"noteDate" ascending:NO];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    [sortDescriptor release];

    NSError * coreDataError;
    NSArray * fetchedObjects = [[self managedObjectContext] executeFetchRequest:request error:&coreDataError];
    [request release];

    if(fetchedObjects != nil){
        return fetchedObjects;
    } else {
        NSLog(@"ERR: %@", coreDataError);
        return nil;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在等待通知,告诉我已将一个新对象添加到Core Data,然后我调用上面的方法,然后在我的tableview上调用reloadData ...

hue*_*ice 27

你正在设置你UITableViewControllerNSFetchedResultsControllerDelegate.非常好.现在尝试controllerDidChangeContent:在TableViewController中实现该方法,如下所示:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
   [self.tableView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

NSFetchedResultsController将在Core Data中侦听已删除或新对象,并通知其委托(您的TableViewController)更改.检查Xcode中的Core Data模板项目,通过添加和删除动画更好地实现这一点UITableView.

  • 另外不要忘记`NSFetchedResultsController`只会对`NSsagedObjectContext`上的`-save:`作出反应.因此,如果您没有保存新创建的实体,则可能不会看到此方法. (10认同)