Ios NSFetchedResultController不';当我更改FetchRequest而不更改NSSortDescriptor时,我不会更新UITableView

Ios NSFetchedResultController不';当我更改FetchRequest而不更改NSSortDescriptor时,我不会更新UITableView,ios,iphone,objective-c,nsfetchedresultscontroller,Ios,Iphone,Objective C,Nsfetchedresultscontroller,我的视图控制器中有一个UITableView和一个UISegmentControl。 视图控制器有两个段。当用户单击某个段时,我会在viewController中优化数据,它应该在UITableView中更新。这不管用 数据使用NSFetchedResultsController显示,其数据源是CoreData表。 它们使用相同的NSSortDescriptor,但不是相同的谓词 我观察到,当我更改NSSortDescriptor时,它是有效的,因此这个对象是问题的根源 当用户单击某个段时,我将

我的视图控制器中有一个UITableView和一个UISegmentControl。 视图控制器有两个段。当用户单击某个段时,我会在viewController中优化数据,它应该在UITableView中更新。这不管用

数据使用NSFetchedResultsController显示,其数据源是CoreData表。 它们使用相同的NSSortDescriptor,但不是相同的谓词

我观察到,当我更改NSSortDescriptor时,它是有效的,因此这个对象是问题的根源

当用户单击某个段时,我将此代码称为:

self.fetchedResultsController = nil;
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
}
并且它通过以下方式更新NSFetchedResultsController:

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }
    //get the segment index:
    NSUInteger selectedState = self.chooseTableSegmentedControl.selectedSegmentIndex;

    //Update the fetched result consequently:
    NSManagedObjectContext *context = self.managedObjectContext;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event"
                                              inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSSortDescriptor *dateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:NO];
    NSPredicate *predicate;

    if (selectedState == 0) {
        [fetchRequest setSortDescriptors:@[dateDescriptor]];

    } else if (selectedState == 1) {
        predicate = [NSPredicate predicateWithFormat:
                                  @"postedByUser == 0"];
        [fetchRequest setSortDescriptors:@[dateDescriptor]];

    }
    [fetchRequest setPredicate:predicate];
    [fetchRequest setFetchBatchSize:7];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:context
                                          sectionNameKeyPath:nil
                                                   cacheName:@"Root"];
    _fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

有什么想法吗?非常感谢

创建新的“获取结果”控制器并调用
performFetch
后,必须使用
reloadData
重新加载表视图<代码>性能蚀刻不会触发FRC委托方法


更新:当提取请求更改时,必须删除FRC缓存(使用
deleteCacheWithName:
)。但是缓存仅在与
sectionNameKeyPath:
连接时有用,因此您也可以设置
缓存名称:nil
来解决此问题。

在创建新的获取结果控制器并调用
performFetch
后,必须使用
重新加载数据重新加载表视图<代码>性能蚀刻
不会触发FRC委托方法


更新:当提取请求更改时,必须删除FRC缓存(使用
deleteCacheWithName:
)。但是缓存仅在与
sectionNameKeyPath:
连接时有用,因此您可以设置
cacheName:nil
来解决此问题。

实现委托方法,该方法将在tableview看到更改时重新加载tableview@insane-36:如果更改FRC并调用performFetch,则不会调用委托方法。在这种情况下,必须显式重新加载表视图。实现委托方法,该方法将在表视图看到更改时重新加载表视图@insane-36:如果更改FRC并调用performFetch,则不会调用委托方法。在这种情况下,您必须显式重新加载表视图。它仍然不能用于重新加载数据。实际上是在我的密码里我忘了过去。你还有别的主意吗?@Gabriel:试试
cacheName:nil
。很好!插入[NSFetchedResultsController deleteCacheWithName:nil];在执行取回之前。谢谢你,马丁!你能编辑答案使其正确吗?它仍然不能重新加载数据。实际上是在我的密码里我忘了过去。你还有别的主意吗?@Gabriel:试试
cacheName:nil
。很好!插入[NSFetchedResultsController deleteCacheWithName:nil];在执行取回之前。谢谢你,马丁!你能编辑答案使其正确吗?