问题标签 [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 - 由于 NSManagedObjectContext 保存而更新 NSFetchedResultsController 时延迟 UITableView 更新
我正在使用带有 NSFetchedResultsController 的谓词对 UITableView 进行排序。但是,当我在详细视图中进行更改并保存它时,我更改的对象立即被放置在 UITableView 中的新位置。
我有类似于 Mail 中消息视图的向上/向下按钮。这种行为会打乱项目的顺序,我想推迟这种变化,直到用户出于 UX 原因退出 UITableView。我在 UITableViewController 中实现了 NSFetchedResultsControllerDelegate 方法。有没有简单/聪明的方法来做到这一点?
编辑:下面是在 UITableViewController 中实现的 NSFetchedResultsControllerDelegate 方法。
iphone - 更改为 NSFetchedResultsController 后 UITableView 未更新 DataSource
我有一个UITableView
由NSFetchedResultsController
. 初始提取工作正常。我可以零问题地添加、删除、修改等。但我想将用户定义的排序添加到表中。我通过更改NSFetchedResultsController
使用不同的sortDescriptor
集合和不同的sectionNameKeyPath
. 这是我更改提取的代码:
当我调用此方法时,效果很好。该表立即重新排序以使用新的部分信息和新的排序参数。但是,如果我向数据添加或删除项目,TableView 不会更新其信息,从而导致崩溃。我可以 NSLog 获取 fetchedResultsController 中的对象总数的计数,并看到它增加(和减少),但如果我 NSLog 返回值numberOfRowsInSection
以监视那里的变化,则调用该方法,但值不会改变。得到以下崩溃(用于添加,但删除类似)
无效更新:第 2 节中的行数无效。更新后现有节中包含的行数 (3) 必须等于更新前该节中包含的行数 (3),加上或减去数字从该部分插入或删除的行数(插入 1 行,删除 0 行)。与用户信息(空)
如果我重新启动应用程序,我会看到添加的项目,或者看不到删除的项目,因此我正在正确修改数据源。
有任何想法吗?
iphone - NSFetchedResultsController 返回具有空 indexPaths 的对象
详细信息在评论中。
以下代码:
结果如下:
任何想法将不胜感激。仅供参考,如果我使用不同的模板作为起点,上面的代码可以在单独的应用程序中完美运行。即如果我使用“基于窗口的应用程序”模板,代码将失败。如果我使用“基于导航的应用程序”,代码将按预期工作。
更新: TechZen 想知道问题是否是由我的提醒实体引起的。我认为这是一个好主意,所以我做了以下事情:
创建两个默认模板应用程序:一个“基于窗口的应用程序”和一个“基于导航的应用程序”(都启用了 Core Data)
将执行上述测试所需的最少代码从基于导航复制到基于窗口(几乎只是“xcdatamodel”文件、fetchedresultscontroller 和添加测试对象的方法)。
上面的代码在新的“无提醒实体”的基于窗口的应用程序中仍然失败。(在这个新的测试应用程序中,实际上我自己编写的代码为零(在测试代码之外),它只是模板代码剪切和粘贴在一起。)
所以现在,我正在寻找在创建“基于窗口的应用程序”之后运行上述代码的任何方法。这是使用基于导航的默认实体执行测试的代码,以防有人有兴趣尝试一下:
更新请注意,正如 TechZen 在下面指出的那样,无论使用空数据库运行此代码都会崩溃,因此如果从基于窗口的应用程序开始,首先向数据库添加一些对象,然后添加测试代码。
UPDATE这里是使用新的剪切粘贴代码时的输出
更新所以我将这个问题缩小为与 SDK 版本相关的问题,我现在有一个项目,如果我使用 Simulator 3.2 构建它会崩溃,而使用 Simulator 3.1.3 构建它可以正常工作。但是如果我添加一个 UITableViewController,然后使用 Simulator 3.2 构建,那么它又可以正常工作了。所以我创建了一个新的 stackoverflow帖子来问这个问题:如果你使用 NSFetchedResultsController 没有 UITableViewController,你如何与对象交互?(因为 IndexPaths 不可靠)。
更新这个问题(暂时)通过使用 -[NSFetchedResultsController fetchedObjects] objectAtIndex:]
来访问对象来解决。
iphone - 使用没有 UITableViewController 的 NSFetchedResultsController
我在尝试使用没有相应 UITableViewController 的 NSFetchedResultsController 时遇到问题。
根据苹果的文件:
“NSFetchedResultsController 旨在有效地管理从核心数据获取请求返回的结果,以便为 UITableView 对象提供数据。”
因此,我首先研究了在没有 UITableViewController 的情况下使用 NSFetchedResultsController 是否可取,并遇到了这篇 Stackoverflow 帖子,得出的结论是,至少在某些情况下,这不是一个坏主意。
但是现在我遇到了一个问题,当相应的 UITableViewController 不存在时,NSFetchedResultsController 的行为会有所不同。问题是当 UITableViewController 不存在时,NSFetchedResultsController 返回的对象没有 IndexPaths。我已经在stackoverflow 帖子中记录了这个问题。(请注意,这是对问题的简化,在某些情况下,对象确实具有 IndexPaths,但我遇到了足够多的问题,我认为在没有 UITableViewController 的情况下期望IndexPaths 是个坏主意。)
如果没有 IndexPaths,我将无法按排序顺序访问返回的对象,也无法访问特定对象。所以我正在寻找的是一种让 NSFetchedResults 控制器返回带有 IndexPaths 的对象的方法,或者是访问对象的另一种方法。(或者也许我根本不应该使用 NSFetchedResultsController?)
重新替代方法,一种解决方法是将 fetchedObjects 传递给数组,然后使用该数组。但根据我的经验,创建指向 FRC 对象的新指针总是会导致问题。我认为每次我尝试使用自己的指针保留一个 NSManagedObject 时,它最终都会导致一个错误。
仅供参考,我正在尝试创建一个导航栏,类似于照片中的导航栏。如果你想象你可以动态地将照片添加到 Photos 应用程序中,那么将栏中的照片由 NSFetchedResultsController 管理是有意义的——这样添加的新照片将被动态添加到栏的末尾,就像添加新对象如何动态添加到 UITableView。
感谢您提供任何可以帮助我的想法!
更新这个问题(暂时)通过使用 -[NSFetchedResultsController fetchedObjects] objectAtIndex:] 解决
iphone - objectAtIndex:0] numberOfObjects] > fetchLimit
我目前遇到一个问题,当 FRC 的 fetchRequest 上的 fetchLimit 为 4 时,使用 NSFetchedResultsController 的 UITableViewController/UITableView 显示大约 86 个项目。我知道 86 个项目满足 fetch 本身,并且我知道它们出现的原因是因为 didChangeObject: atIndexPath... 被 86 个中的每一个调用,并且我按默认实现方式插入。
我的问题是为什么 fetchLimit 不限制 NSFetchedResultsController 尝试“更改”(在这种情况下插入)的对象数量?
我的应用程序用例是第一个选项卡显示我在应用程序启动时(在侧线程上)获得的典型提要项目。我将它们保存在单独的上下文中的 CoreData 中,最终合并到主线程的上下文中并针对更改的内容启动 FRC 回调。我的问题专门针对不存在任何项目的初始情况。
这是我的fetchRequest:
上面的 contentType 只是一种区分应该在此选项卡与其他选项卡中显示的内容的方法。Featured 是项目的布尔属性,它更像是一个用于显示目的的开关。
这是我的didChangeObject:
我知道这个问题很难回答,但即使是解释 FRC 如何决定调用 didChangeObject 的次数也会非常有帮助。
iphone - 为核心数据中的可转换属性编写 SortDescriptor?
我有一个实体头,它有一个属性 NSDictionary ,它在模型中被声明为可转换的。现在我不想对 fetchedRequestController 中的标头数组进行排序。并且传递 nil 或 null 对象会产生错误。请帮助其紧急。
让我从上次重新开始:如果我有一个实体,它具有可转换的属性标题。我在生成的类中将 id 类型更改为 NSDictionary。我现在需要以 entity.attribute name.key 的形式访问字典的键...我收到一个错误,因为此类不是键的键值编码投诉:(键)...解决此问题的方法是什么。
上面的选择器给出了一个错误,因为它不能对 headersDictionary 进行排序......
iphone - iPhone:NSFetchedResultsController,具有来自单独线程的委托和数据更新
首先,很抱歉问题太长了。
我知道这里很少有问题可以讨论类似的问题,但是这些都没有讨论 NSFetchedResultsController 与委托以及单独线程中的更新。没有一个解决方案对我有帮助。
这些是现有的问题:
- NSFetchedResultsController:在更新期间使用 NSManagedObjectContext 会导致崩溃
- 确定哪个核心数据属性/属性更改触发了 NSFetchedResultsController 更新
- 核心数据 executeFetchRequest 抛出 NSGenericException(枚举时集合发生了变异)
- 枚举时集合发生了突变。如何确定是哪一组?
- 等等
现在关于我的问题:
- 我有一个单独的线程来更新来自网络的核心数据对象(使用套接字)。
- 很少有视图控制器显示来自同一核心数据对象的数据(每个选项卡都包含一个显示其过滤数据的视图控制器)。
- 每个视图控制器都有自己的实例,
NSFetchedResultsController
并且委托设置为 self。
was mutated while being enumerated
有时我在更新单独线程中的数据时收到异常,有时它会使应用程序崩溃。
为了尝试修复它,我做了很多代码操作,但似乎没有任何帮助。
我试图不直接从表视图数据源方法中使用托管对象。而不是我创建了一个包含字典列表的数组。didChangeObject
我从上面的方法中填写这些字典。这样我就不会在视图控制器中触及托管对象。
然后我明白问题出在 NSFetchedResultsController 中,它可能一直在迭代数据。这是与我在单独线程中的数据更新冲突的对象。
问题是,一旦我有一个带委托的 NSFetchedResultsController (意味着它“监视”数据并一直更新委托),如何在单独的线程中更新核心数据对象。
NSFetchedResultsControllerDelegate 实现:
在表视图数据源方法中,我直接使用托管对象。
uitableview - 为什么 NSFetchedResultsController 将获取的对象分配给多个 UITableView 部分?
在我的另一个关于在 Core Data 支持的 UITableView 中添加插入行的问题中,我提到我的 NSFetchedResultsController 正在将它获取的每个对象分配给我的 UITableView 中的单独部分。我认为这只是默认行为,但 Marcus S. Zarra 说我的控制器配置或数据源委托方法可能有问题。我承认,我的代码感觉有点像弗兰肯斯坦,其中的部分来自 Apple 文档和大量教程。这是我的第一个程序,也是我第一次使用 Core Data,所以请温柔;)
我的表视图控制器的标题如下:
我的实现文件包含一堆虚拟测试数据。我包括在内,以防我使用不正确的方法来实例化 Core Data 对象。基本上,我想知道我的 NSFetchedResultsController 是否不应该将我的对象(在本例中为 myClass 的实例)返回到单独的部分中。如果是这样,我在做什么来制造这个问题?
目前的最终目标是让我能够在表格顶部添加一个插入单元格(我知道将它放在底部是“标准的”,但我喜欢它在执行它的应用程序中的外观其他方式)。您会注意到我-tableView:editingStyleForRowAtIndexPath:
设置要插入的第 0 节的单元格样式,但当然我需要弄清楚如何在单元格 1 而不是单元格 0 开始列出 myClass.classTitle(这就是为什么我要确定是否有每个对象分配到自己的部分是正常的)。
这是我的实现文件:
我的 RubricAppDelegate 与用于设置 Core Data NSManagedObjectContext、NSPersistentStoreCoordinator 等的 Apple 文档基本相同。但是,如果您认为其中可能存在问题,请告诉我,我会发布它。
编辑:我忘了提到我知道每个对象被分配到不同部分的两个原因。
1) NSLog(@"Number of sections = %d", [[fetchedResultsController sections] count]);
inside of-numberOfSectionsInTableView:
返回我拥有的 myClass 对象的数量。
2) 如果我设置-numberOfSectionsInTableView:
为返回 1,我的表格只显示一个对象,其余的都被删掉。
iphone - 如何返回 FRC 提取的对象数?
我正在尝试使用我的 FRC 提取中的对象计数,以便在我所有提取的对象都已在 UITableView 中列出之后创建一个“添加”单元格。有没有返回获取的对象数量的方法?我只能找到一种方法来返回给定 FRC 的节数。
iphone - NSFetchedResultsChangeDelete 未被触发
有没有人遇到过这个?
当我选择从我的 tableView(由 FRC 填充)中删除一行时,应用程序不会崩溃或挂起。它什么也没做。删除按钮保持选中状态,如果我单击模拟器上的其他位置,删除按钮会取消选择并消失,但单元格永远不会从 UI 中删除。我敢肯定我在这里犯了一个愚蠢的疏忽,但我无法发现它。以下是我的代码的相关部分。
我的 UITableViewController 接口声明如下:
在其实现文件中,我有:
和
和
还
上面的代码使单元格刚好超出我的提取填充单元格一个插入单元格,但其余的删除单元格。
我将 UITableView 连接到我的文件所有者,以获取 IB 中的委托和数据源。我需要更改什么NSFetchedResultsChangeDelete:
才能触发?
更新:
我已经添加[managedObjectContext save:&error];
并commitEditingStyle
通过断点验证,当我选择删除一个单元格时它被击中。我知道保存正在正确处理,因为如果我退出并重新运行应用程序,我选择删除的单元格实际上已被删除。
但是,当我按下删除按钮时,仍然没有任何反应。该按钮保持选中状态,直到我单击其他位置,从而取消选择它。