NSFetchResultsController 委托没有被调用

Posted

技术标签:

【中文标题】NSFetchResultsController 委托没有被调用【英文标题】:NSFetchResultsController delegate not getting called 【发布时间】:2013-03-06 05:39:28 【问题描述】:

我正在使用NSFetchedResultsController 使用 coredata 加载我的 tableView。 最近我在我的 ManagedObjectModel 中添加了一个新的Entity,并进行了 coredata 版本控制并使用了轻量级迁移。

我的托管对象上下文 (MOC) 的打印描述显示了新添加的架构,并且架构也在 NSPersistentStoreCoordinator 中定义。

我的问题是,一旦我将数据插入到新创建的 Entity 中,NSFetchedResultsController 代表不会被解雇,即使插入时没有抛出错误,并且我验证插入确实是发生在 SQL 表中。

我已经检查过是否需要使用

进行 coredata 迁移
 NSMigrationManager *manager = [[NSMigrationManager alloc]
                               initWithSourceModel:[self sourceModel] destinationModel:[self destinationModel]];




BOOL success = [manager migrateStoreFromURL:storeURL type:NSSQLiteStoreType
                                    options:nil withMappingModel:mappingModel toDestinationURL:dstStoreURL
                            destinationType:NSSQLiteStoreType destinationOptions:nil error:outError];

发现coredata是自动选择了正确的模型,不用NSMigrationManager了。

为了实现NSFetchResultsController,我遵循了 Raywenderlich 的示例

http://www.raywenderlich.com/999/core-data-tutorial-how-to-use-nsfetchedresultscontroller 它过去在没有任何版本控制的情况下可以在 CoreData 上正常工作。

谁能告诉我如何使NSFetchResultsController delegate 工作在添加新实体后 并进行版本控制,我有changed the Current Core Data Model 到最新的。新添加的实体和旧实体之间没有关系托管对象模型中的实体。

编辑:这是我的获取结果控制器初始化代码

- (NSFetchedResultsController *)fetchedResultsController 

if (fetchedResultsController != nil) 
    return fetchedResultsController;


NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"SongDetails" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                          initWithKey:@"songName" ascending:YES];


[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];



[fetchRequest setFetchBatchSize:10];

/*CHECKED WHETHER ANY SONGDETAILS ARE FETCHED*/
NSError * err;
NSArray * results = [managedObjectContext executeFetchRequest:fetchRequest error:&err];
NSLog(@" results >>> %@ ,results);
/* */

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                               cacheName:nil];

self.fetchedResultsController = theFetchedResultsController;
fetchedResultsController.delegate = self;

return fetchedResultsController;

在获取结果控制器中添加日志后,我得到以下结果

 results >>> ("<SongDetails: 0x115abae0> (entity: SongDetails; id: 0x115a94a0 <x-coredata://7E5CDD40-8A4C-455D-8000-34FD70AC8837/SongDetails/p1> ; data: <fault>)",
"<SongDetails: 0x115abe90> (entity: SongDetails; id: 0x115aa450 <x-coredata://7E5CDD40-8A4C-455D-8000-34FD70AC8837/SongDetails/p2> ; data: <fault>)",

以下是插入时 SQL 调试器的结果。

2013-03-06 12:09:25.894[6035:c07] CoreData: sql: BEGIN EXCLUSIVE
2013-03-06 12:09:25.895[6035:c07] CoreData: sql: INSERT INTO ZSONGDETAILS(Z_PK, Z_ENT, Z_OPT, ZSONGNAME) VALUES(?, ?, ?, ?)
2013-03-06 12:09:25.902[6035:c07] CoreData: sql: COMMIT

任何帮助将不胜感激。

【问题讨论】:

您应该发布初始化NSFetchedResultsController 的代码,包括NSFetchRequest。更改模型定义(即添加实体)不会影响 'NSFetchedResultsController` 是否会检测到更改,这取决于 NSFetchRequest 以及它是否/如何受到数据更改的影响。 所以我希望添加新实体并将 coredata 设置为正确的版本不会影响获取结果控制器。在类似的情况下我还需要注意什么。 好的,NSFetchRequest 是为实体SongDetails 配置的,因此如果任何SongDetails 对象更改,NSFetchedResultsController 委托方法将被调用(只要您实现它们)。为什么您认为 delegate 方法不起作用? 是的,我尝试在视图中插入 SongDetails,但在初始化 MOC 和 FRC 后确实加载了,但代理似乎没有被告知插入。 更多代码会有所帮助。你在哪里打电话给 FRC 的performFetch?还有与 FRC 和 SongDetails 相关的 viewDidLoad 代码。 【参考方案1】:

从我的 cmets 中转述。在 FRC 检测模型更改并调用其委托方法之前,您需要调用 [fecthedResultsController performFetch:&amp;error]

【讨论】:

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

使用 NSFetchResultsController 时 UICollectionView 滚动不流畅

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

NSFetchResultsController 委托没有被调用

NSFetchResultsController 委托没有被调用

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

在 NSFetchResultsController 中派生节号