问题标签 [nsfetchedresultscontroller]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - NSFetchedResultsController 不显示来自其他上下文的更新
根据我的“主要”NSManagedObjectContext,我设置了一个 NSFetchedResultsController 来填充 UITableView。
在计时器中,我不断地将对象添加到单独的 NSManagedObjectContext 中,但它与主上下文共享其 NSPersistantStoreCoordinator。
我可以看到正在发送 NSManagedObjectContextWillSaveNotification 通知,当我退出重新启动应用程序时,我拥有上一次运行的所有数据。但是,当前的 NSFetchedResultsController 不会发生任何更新。
我创建了一个测试项目并将其放置在这里。
(我最初认为这是因为有多个线程在起作用;但是,当一切都在一个线程中完成时会发生)。
原始问题
根据我的“主要”NSManagedObjetContext,我设置了一个 NSFetchedResultsController 来填充 UITableView。
在后台线程中,我将几个对象下载并导入到单独的 NSManagedObjectContext 中,但该对象与主线程的上下文共享其 NSPersistantStoreCoordinator。
我已注册接收 NSManagedObjectContextWillSaveNotification 通知。当我得到这些时,我将它们转发到主线程,并将它们传递给我的主上下文。
使用调试器,我可以看到这些进入,并验证它们确实是在将对象添加到上下文中。但是,我的 NSFetchedResultsController 没有更新。如果我在主线程中做这一切,它确实有效。在控制器上调用 -performFetch: 会导致它更新,所以我知道并不是它没有看到新对象。
其中大部分是样板代码,只是分成不同的线程。
iphone - 核心数据表视图部分使用 NSSortDescriptor 按工作日排序
我目前正在尝试将我的对象数组按天顺序排序,以便它们可以按正确的顺序分组,即星期一、星期二、星期三,然后按开始时间。
唯一的问题是我无法弄清楚如何做到这一点,我的代码目前看起来像这样: 按字母顺序然后按时间排序:
请帮忙!
iphone - How to implement delayed/batched table view update from NSFetchedResultsControllerDelegate?
You should consider carefully whether you want to update the table view as each change is made. If a large number of modifications are made simultaneously—for example, if you are reading data from a background thread— /.../ you could just implement controllerDidChangeContent: (which is sent to the delegate when all pending changes have been processed) to reload the table view.
This is exactly what I'm doing: I'm processing incoming changes in a background thread with a different ManagedObjectContext, and merge the results into the main thread MOC with mergeChangesFromContextDidSaveNotification:. So far so good.
I chose to not implement controller:didChangeObject:... and would instead like to do the batched update that the document suggests.
Question/problem: the document doesn't elaborate how to actually implement the batched update? Should I just call [tableview reloadData] in controllerDidChangeContent: or is there a less intrusive way that saves me from a full reload?
One thought I have: I could take note of mergeChangesFrom... notification that contains the changed objects, figure out their indexpaths, and just call tableview:ReloadRowsAtIndexPaths: for them. But is there any authoritative info, recommendations or examples? Or just [tableview reloadData]?
(Aside: controller:didChangeObject:... started behaving really erratically when it received a set of batched updates, even though the same updating code [that I now put in background thread] was fine before when it was running on the main thread, but of course locking up the UI.)
iphone - 一个 NSFetchedResultsController vs 几个 UITableViews——只有一个 UITableView 得到更新?
设置:
我有几个 UITableViewControllers (tvc),它们都实例化了一个单独的 NSFetchedResultsController (frc)。但是,所有这些 frc-s 都使用相同的 ManagedObjectContext (moc)。
设想:
有时,我从其中一个 tvc-s 启动一些后台进程来更新数据。后台进程在单独的线程中更新数据,最后在主线程调用[moc mergeChangesFromContextDidSaveNotification:]。然后这些更改应该传播到 frc,并且应该调用 [frcDelegate controllerDidChangeContent:]。这很好用......但仅适用于关联 tvc 启动更新的 frcDelegate。(所有 tvc-s 都充当他们 frc 的 frcDelegate。)
预期行为:
因为所有的 frc-s 都绑定到同一个 moc,所以所有的 frc-s 都应该接收这些变化,并且应该为所有这些变化调用 [frcDelegate controllerDidChangeContent:]。
实际行为:
只有一个 [frcDelegate controllerDidChangeContent:] 被调用。
为什么我看到的是实际行为而不是预期?我应该如何调试这个?或者这是正确的行为?
iphone - 如何使用 NSFetchedResultsController 和 UISearchDisplayController
我一直在使用 Core Data 创建一个 iPhone 应用程序。
首先,同时使用 NSFetchedResultsController 和 UISearchDisplayController 来获取结果有意义吗?你会推荐别的东西吗?
我一直在尝试将 NSFetchedResultController 和 UISearchDisplayController 结合起来。我一直在考虑(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
在 UIViewController 的 NSFetchedResultController 的方法中设置一个 NSPredicate。但这不是很好。
那么,您知道如何为我的问题实施解决方案吗?感谢您发布优秀教程的答案或链接。
编辑
这是我的代码。UISearchDisplayDelegate 方法调用(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
应该在 NSFetchedResultController 中设置谓词的方法。我还添加了 NSFetchedResultController 的代码。
iphone - 使用 SQLite 后端修复谓词 NSFetchedResultsController/NSFetchRequest 性能?
我有一系列 NSFetchedResultsController 为一些表视图提供动力,它们在设备上的性能非常糟糕,大约为几秒。由于它全部在主线程上运行,它在启动时阻塞了我的应用程序,这不是很好。
我调查并发现谓词是问题所在:
即获取实体,称为“事物”,与实体“事物”具有多对多关系。该谓词是一个过滤器,它将结果限制为仅与特定“某物”有关系的事物。
当我删除谓词进行测试时,获取时间(初始 performFetch: 调用)从 4 秒(对于某些极端情况)下降到大约 100 毫秒或更短,这是可以接受的。不过,我对此感到困扰,因为它否定了我希望通过 Core Data 和 NSFRC 获得的很多好处,否则这似乎是一个强大的工具。
所以,我的问题是,如何优化这种性能?我使用谓词错误吗?我应该以某种方式修改模型/模式吗?还有什么其他方法可以解决这个问题?这种性能下降是可以预料的吗?(大约有数百个 <1KB 的对象。)
编辑细节:
这是代码:
更新的日志(以前,我有一些应用程序效率低下,降低了性能。这些更新的日志应该尽可能接近最佳状态,因为你可以在我当前的环境下获得):
如果我在没有谓词的情况下进行相同的提取(通过注释掉问题开头的两行):
时间相差20倍。500ms 并不是那么好,而且似乎没有办法在后台线程中完成它或以其他方式优化我能想到的。(除了去二进制存储这成为一个非问题,所以我可能会这样做。对于上述 200 个对象的谓词查询,二进制存储性能始终为 ~100 毫秒。)
(我之前在这里嵌套了另一个问题,现在我搬走了)。
iphone - NSFetchedResultController 和 UISearchBar 实现
我正在使用我的 iPhone 的核心数据创建一个简单的基于导航的应用程序,并且我正在尝试实现一些搜索。该应用程序基于 Apple 的“基于导航的应用程序”模板。NSFetchedResultsController 获取所有对象,它们将显示在表格视图中。我还留下了加号按钮来添加新对象。好吧,我已经实现了一个 UISearchBar 和一个 UISearchDisplayController,两者都在同一个中。搜索使用相同的 NSFetchedResultsController 过滤对象。NSPredicate 将在 UISearchDisplayController Delegate 方法中设置,但似乎尚未设置谓词,因为 fetchedResultsController 没有过滤任何内容。这是我的第一个问题。现在,如果我按下搜索栏的取消按钮并想通过按下加号按钮插入一个新对象,它不会去。不会插入任何对象,应用程序不会崩溃,它什么也不会发生。
我必须在一个视图中使用两个不同的 NSFetchedResultsController 吗?如果是,这并不能解决未设置 NSPredicate 的问题。我已经感谢你的帮助。
iphone - Core Data / NSManagedObject / NSFetchedResultsController 中的多属性“事务”?
是否可以设置 NSManagedObject 的多个属性并让 NSFetchedResultsController 调用 controllerDidChangeContent: 一次?
换句话说,是否可以这样说:
然后让 NSFetchedResultsController 只调用一次 controllerDidChangeContent: (和其他方法)?
谢谢!
iphone - NSFetchRequestController 的 NSSortDescriptor 在排序属性的值更改时导致崩溃
我有一个具有许多属性的核心数据实体,包括数量(浮点数)、类别总计(浮点数)和类别(字符串)
初始 ViewController 使用 FethchedResultsController 来检索实体,并根据类别对它们进行排序,然后是 categoryTotal。到目前为止没有问题。
在选择一行时(tableView:didSelectRowAtIndexPath),另一个视图控制器被加载,允许编辑所选实体的金额字段。
在返回第一个视图之前,categoryTotal 被新的“金额”更新。当返回到第一个视图控制器时,问题就来了,应用程序炸弹
严重的应用程序错误。在核心数据更改处理期间捕获到异常:无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (1) 必须等于更新前该节中包含的行数(1),加上或减去从该部分插入或删除的行数(0 插入,1 删除)。with userInfo (null) 程序接收信号:“EXC_BAD_ACCESS”。
这似乎是由 NSSortDescriptor *sortByTotals = [[NSSortDescriptor alloc] initWithKey:@"categoryTotal" ascending:sortOrder]; 如果我删除它,一切都会按预期工作,但显然没有我想要的排序。
我猜这与由于 categoryTotal 更改(删除/插入)而导致的排序顺序更改有关,但无法解决此问题。我已经验证了在第二个视图中正确地修改了值,因此它似乎是 fetchedResultsController 被混淆了。如果 categoryAmount 更改为不改变排序顺序的,则不会产生错误
我没有在物理上更改(即删除)fetchedResultsController 返回的项目数......我能找到的唯一其他问题似乎会产生此错误
任何想法都将受到欢迎
谢谢, AJ
iphone - 基于 NSFetchedResultsController 的表视图在实体的第二次插入时总是失败
我正在使用 NSFetchedResultsController 来管理在具有一个部分的表视图中显示获取的托管对象。该表一开始是空的,用户可以使用 UI 向其中添加新实体。就目前而言,程序在添加第一个实体时总是有效,而在添加第二个实体时总是崩溃。崩溃时有时不会出现错误,有时会出现不同类型的错误(一些包含在下面)。通过日志语句和跟踪,我看到程序在 NSFetchResultsController 的委托的 controllerWillChangeContent(调用 [self.tableView beginUpdates];)方法退出之后,但在调用我的代码中的任何其他方法之前崩溃。这是我的代码的一些相关部分。配置 NSFetchedResultsController:
添加新实体:
我在文档中看到了有关显示一个部分的表格的问题的警告,并且我使用了 Apple 的解决方法,但无济于事。无论如何,这些方法都不会在崩溃之前被调用。
我收到的一些错误:
如您所见,即使没有对代码进行任何更改,错误(出现错误时)也不一致。
谁能弄清楚我做错了什么?