ios – 刷新NSFetchedResultsController数据?

ios – 刷新NSFetchedResultsController数据?,第1张

概述我可以在我的应用程序中创建新的托管对象,在单独的视图中,我有一个表视图显示了我所有的对象. 当我创建一个新的托管对象(在一个完全独立的视图中)时,我发送一个通知,它试图让我的表视图重新加载包含刚创建的新对象的新数据. 我没有编辑表视图. 只有一个管理上下文. 我无法掌握我做错了什么如果我关闭应用程序并重新启动,我的新对象在表视图中.我正在尝试调用reloadData,当我收到一个新的对象的通知,并 我可以在我的应用程序中创建新的托管对象,在单独的视图中,我有一个表视图显示了我所有的对象.

当我创建一个新的托管对象(在一个完全独立的视图中)时,我发送一个通知,它试图让我的表视图重新加载包含刚创建的新对象的新数据.

我没有编辑表视图.

只有一个管理上下文.

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

在代码方面,我的ListVIEwController:

@interface MyNotesVIEwController : UIVIEwController{    NSManagedobjectContext * __managedobjectContext;    UItableVIEw * _notestableVIEw;    MyNotestableVIEwDelegate_DataSource * _tableDelegate_DataSource;}

我的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];    }}

在我的委托/ datasource对象中,我有:

@interface MyCommutestableVIEwDelegate_DataSource : NSObject <UItableVIEwDataSource,NSFetchedResultsControllerDelegate>{    NSManagedobjectContext * __managedobjectContext;    NSFetchedResultsController * __fetchedResultsController;}@property (nonatomic,retain) NSManagedobjectContext *managedobjectContext;@end

实施摘录:

-(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;}

我在这里有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;}

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;    }}

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

解决方法 您正在将UItableVIEwController设置为NSFetchedResultsControllerDelegate.那很好.现在尝试在tableVIEwController中实现controllerDIDChangeContent:方法,如下所示:
- (voID)controllerDIDChangeContent:(NSFetchedResultsController *)controller {   [self.tableVIEw reloadData];}

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

总结

以上是内存溢出为你收集整理的ios – 刷新NSFetchedResultsController数据?全部内容,希望文章能够帮你解决ios – 刷新NSFetchedResultsController数据?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1111601.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存