NSFetchResultsController 委托没有被调用

Posted

技术标签:

【中文标题】NSFetchResultsController 委托没有被调用【英文标题】:NSFetchResultsController delegate not getting called 【发布时间】:2012-10-22 21:57:10 【问题描述】:

我有以下代码:

- (NSFetchedResultsController *)fetchedResultsController 
    // Set up the fetched results controller if needed.
    if (fetchedResultsController == nil) 

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        // Edit the entity name as appropriate.
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"DiskStory" inManagedObjectContext:self.managedObjectContext];
        [fetchRequest setEntity:entity];

        fetchRequest.predicate = [NSPredicate predicateWithFormat:@"isRemoved == %@", [NSNumber numberWithBool:NO]];

        // Edit the sort key as appropriate.
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created" ascending:NO];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

        [fetchRequest setSortDescriptors:sortDescriptors];

        // Set limit
        [fetchRequest setFetchBatchSize:25];
        // Set batch size
        [fetchRequest setFetchLimit:50];


        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:kSavedStoryCache];
        aFetchedResultsController.delegate = self;
        fetchedResultsController = aFetchedResultsController;
 
    return fetchedResultsController;
    

在我的 viewDidLoad 中我有:

 NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    

我想知道为什么我的:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 


代表,不是叫吗?我在里面放了一个断点。有什么想法吗?

【问题讨论】:

你在- (NSFetchedResultsController *)fetchedResultsController里面放了一个断点吗?你确定你的初始化正在运行吗? 是的,我在里面放了一个断点,它会一直执行直到它返回 你解决了吗? 【参考方案1】:

我之前也遇到过这个问题,第一次调用performFetch时不会调用,只有当fetchedResultsController中的数据实际发生变化时才会调用。例如,当您从此获取结果中的上下文中删除对象时,将调用委托。

【讨论】:

无赖...那么我该如何解决这个问题?我用于表视图数据源的数据状态错误。因为我需要在获取完成后调用 reloadData 我通过在初始提取完成后发布通知来解决它。然后在我的UIViewController 中我重新加载了我的组件。 如果你只是把它放在 performFetch 下,那么不能保证此时会完成抓取? 我的意思是在 fetch 返回之后 - 它完成了。是同步方式。【参考方案2】:

我认为你已经使用了 self.在错误的地方。请看下面的代码;我已将 cmets 添加到更改中

 - (NSFetchedResultsController *)fetchedResultsController 
    // Set up the fetched results controller if needed.
    if (fetchedResultsController == nil) 

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        // Edit the entity name as appropriate.
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"DiskStory" inManagedObjectContext:self.managedObjectContext];
        [fetchRequest setEntity:entity];

        fetchRequest.predicate = [NSPredicate predicateWithFormat:@"isRemoved == %@", [NSNumber numberWithBool:NO]];

        // Edit the sort key as appropriate.
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"created" ascending:NO];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

        [fetchRequest setSortDescriptors:sortDescriptors];

        // Set limit
        [fetchRequest setFetchBatchSize:25];
        // Set batch size
        [fetchRequest setFetchLimit:50];


        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:kSavedStoryCache];
        aFetchedResultsController.delegate = self;
        fetchedResultsController = aFetchedResultsController;     // -> Shouldn't be self.fetchedResultsController 
 
    return fetchedResultsController;        // -> Shouldn't be self.fetchedResultsController 
   

另外,如果你已经合成你的 fetchedResultsController 如下:

fetchedResultsController = _fetchedResultsController 

那么在- (NSFetchedResultsController *)fetchedResultsController 方法中你应该把它称为_fetchedResultsController

【讨论】:

我已根据您的修订对其进行了更改,但没有帮助.. 代表仍然没有被调用。我在执行 fetchRequest 后放了一个断点,它不是 nil 我也合成为 fetchedResultsController 获取了 25 条记录.. 没有部分 你确定你已经注册NSUserDefaultsDidChangeNotification并且正在执行吗? 我为什么要有 NSUserDefaultsDidChangeNotification?

以上是关于NSFetchResultsController 委托没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSFetchResultsController 时 UICollectionView 滚动不流畅

NSFetchResultsController,将新数据填充到表格视图中

NSFetchResultsController 委托没有被调用

NSFetchResultsController 委托没有被调用

NSFetchResultsController -controllerDidChangeContent: - 尝试使用 userInfo 为单元格创建两个动画

在 NSFetchResultsController 中派生节号