NSFetchedResultsController 让我发疯

2024-01-09

自 1 个月以来,我一直在使用 NSFetchedResultsController 构建应用程序,并在 3.1.2 SDK 上测试该应用程序。问题是我一直在我的应用程序中到处使用 NSFetchedResultsController 并正在开发 3.1.2 版本的 SDK,现在我的客户说我应该使其与 3.0 版本兼容,并且截止日期快到了。

但是每次我更改控制器处理的对象时都会崩溃,应用程序会因非常奇怪的错误而崩溃。

当删除一个部分中的最后一个对象以及当更改使对象喜欢另一个部分时,就会出现问题。

我一直在使用来自 Dave Mark 和 Jeff LaMarche 的“More iPhone 3 Development Tackling iPhone SDK 3”中的示例代码。我还添加了一些更改链接文本 http://www.appleiphonetech.com/chapter-4-and-the-tale-of-the-nsfetchedresultscontroller.html

以下是应用程序崩溃时控制台的示例输出。

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“更新无效:部分数量无效。”更新后表视图中包含的节数 (1) 必须等于更新前表视图中包含的节数 (2),加上或减去插入或删除的节数(2 个插入,0 个已删除)。 2010-03-14 16:23:29.758 Instaproofs[5879:207] 堆栈:( 807902715, 7364425, 807986683, 811271572, 815059090, 815007323, 211023, 4363331, 810589786, 807635429, 810579728, 3620573, 3620227, 3614682, 3609719, 27337, 810595174, 807686849, 807683624, 839142449, 839142646, 814752238 )

如果我知道 NSFetchedResultsController 有这么多 bug,我就永远不会使用它。

所以基本上我需要 NSFetchedResultsControllerDelegate 才能在 3.0 及更高版本的 SDK 上正常工作。

如果有人帮助我找出我做错了什么,这将是我的救星。


从错误消息中可以看出,您在应该删除部分时却将其插入表中。即使您已告诉 tableView 总共需要四个部分,您的 tableView 数据源在更新后仅提供一个部分。

我不认为这是 NSFetchedResultsController 有问题的情况,而是在简单用例之外实现起来很棘手。您的崩溃几乎肯定是由于您的controller:didChangeObject:atIndexPath:forChangeType:newIndexPath 委托方法而发生的。成功实现此方法的关键(至少根据我的经验)是要记住changeTypes 是对象和indexPath 驱动的。这使得“更新”和“移动”在概念上变得棘手。

考虑托管对象发生更改以使其在新的sectionNameKeyPath 下排序的情况。从概念上讲,我们认为该对象已“移动”到新部分,因为 fetchedResultsController 现在将其排序在 tableView 中的新标题下。但是,如果对象的 indexPath 没有更改,则 fetchedResultsController 会认为这是“更新”而不是“移动”。

更糟糕的是,即使更改的托管对象仍然保留相同的索引路径,fetchedResultsController 中的其他对象现在可能具有新的索引路径,因为它们因更改而受到影响。这意味着您必须在委托方法的“更新”部分中手动处理部分插入和部分删除。类似的问题需要在委托方法的“移动”部分中解决。

LaMarche 的修复方法是尝试以一种通用的方式来解决这个问题,以容纳尽可能多的用例,而不是试图用太多的话来解释它。通过尝试理解与您的用例相关的问题,您也许能够显着降低 LaMarche 使用的代码的复杂性。特别关注委托方法的“更新”和“移动”部分,因为这些是最有可能导致问题的罪魁祸首。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSFetchedResultsController 让我发疯 的相关文章

随机推荐

  • 参数超过256字节的CUDA内核调用思路

    我有几个结构 它们的总大小超过了允许在内核调用中作为参数传递的 256 字节大小 这两个结构都已分配并复制到设备全局内存 1 如何在同一个内核中使用这些结构而不将其作为参数传递 更多细节 这些结构可以单独作为参数传递 例如 在不同的内核中
  • 从命令行查看表格文件,例如 CSV [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 异常:oauth 状态丢失或无效。 (ASP.NET Core 外部标识符 OAuth)

    我正在尝试在 Asp Net Core 中实现外部 OAuth https github com aspnet contrib AspNet Security OAuth Providers https github com aspnet
  • 在 iframe 中加载另一个域网站

    我想使用 iframe 在我的网站上加载另一个网站 我在其他一些网站中使用 iframe 加载时遇到了一些其他问题 那么我们不能实现iframe来加载其他域网站页面吗 如果是这样 我们是否有其他方法来加载网站 以下是我测试的方法 我已经尝试
  • 从 Azure DevOps 获取已通过 JavaScript 合并到分支中的所有工作项

    The idea 我目前正在使用 NodeJS 开发一个 发行说明 应用程序 该应用程序调用各种 Azure DevOps REST API 端点来获取基于特定标签的工作项 我现在拥有的 我现在所拥有的工作原理如下 SomeAzure De
  • 将 Github 存储库移植到另一种语言

    我想将别人的存储库移植到另一种语言 就我而言 SCSS gt Stylus 但它很可能是Javascript gt Coffeescript 解决这个问题的最佳方法是什么 我是不是该 分叉存储库并编辑文件 而不是拉取请求 在这里 我只会分叉
  • 在引导程序中,如何使图像成为下拉菜单?

    在引导程序中 如何使图像成为下拉菜单 您好 我在引导程序中创建了一个下拉列表 我想放置一个图像 使其成为单击的项目以查看下拉列表 下面是我的代码
  • C++ 模板和内联

    当我编写一个简单 非模板 类时 如果函数实现 就地 提供 它会自动被视为inline class A void InlinedFunction int a 0 the same as inline void InlinedFunction
  • 输入(...)提示后显示%?

    假设我们使用的是 python3 3 和多平台 Linux 和 WIndow 如果我执行以下操作 gt gt gt eval input enter a percent from 1 100 I get enter a percent fr
  • 在 MongoDB 中查询相似数组

    我想在 MongoDB 集合中搜索具有相似数组的文档 并按相似值排序 Example 我会寻找 chars a b c 我已经存储了这些文件 1 chars s e c 2 chars i l d 3 chars b a c 4 chars
  • 如何断言 C# 异步方法在单元测试中引发异常? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使用 NUnit 测试异步方法 最终使用另一个框架 https stackoverflow com questions 12191831 how do i test an async method
  • Jupyter Notebook 同时显示和捕获输出

    我试图找到一种方法来 保存 jupyter 笔记本中的变量 同时捕获丰富的输出 主要是由于 ssh 断开连接等原因 仅分配给变量是行不通的 因为某些库会打印进度条等信息 到目前为止 最有希望的方法是使用 capture然而 在最近的版本中
  • Table Row,可以将高度设置为零吗?

    可以将表格行高设置为 0 吗 IE 8 Chrome 火狐 Opera 你为什么问 好吧 我有一行是在用户单击父行时动态构建和显示的 问题是 如果没有行 当单击时 它仍然显示一个空的 1 像素高的行 这是子网格视图
  • 摆脱 Google api lib 中不必要的依赖项

    背景 我已经在客户端和服务器端使用 Google 服务成功实现了用户身份验证 我用过适用于 PHP 的 Google API 客户端库 https github com googleapis google api php client为此目
  • Nullable 是“预定义值类型”吗?或者 Equals() 和 == 在这里如何工作?

    对于我自己的 Equals 方法的实现 我想检查一堆内部字段 我这样做 myNullableInt obj myNullableInt myString obj myString 我假设 这会比较值 包括 null 是否相等 而不是对象地址
  • Chrome DevTools 协议:如何获取节点的单击事件处理程序名称

    Problem 我有一个相同节点的列表 这些节点附加了相同的处理程序或函数 我需要单击 DOM 中存在的每个交互式节点 这是功能或要求 如果已经单击了要单击的节点或者该节点附加了相同的处理程序 我想跳过要单击的节点 请参阅下面的屏幕截图以供
  • 带有 Asp.net Webforms 的 Azure Active Directory SSO

    我们在 Net 3 5 中有一个 Asp Net Webforms 应用程序 它已经具有带有 FormsAuthentication 的身份验证模块 对于新要求 我们需要使用 Azure Active Directory 实施 SSO SA
  • 纬度和经度的数据类型正确吗? (在活动记录中)

    我应该将纬度和经度存储为字符串或浮点数 或其他东西 吗 我正在 Rails 上使用 activerecord ruby 如果这很重要的话 Update 开发中的 Mysql 和生产中的 postgresql 为什么重要 这就是我使用的 ad
  • 根据字符串的特定排列对字符串数组进行排序

    在 Javascript 中 我有一个值数组 例如 Toy Car PC Water Apple 我需要按此优先级按特定顺序对值进行排序 PC Car Toy Apple Water 请注意 这不能按字母顺序排序 而是按提供的值的特定顺序排
  • NSFetchedResultsController 让我发疯

    自 1 个月以来 我一直在使用 NSFetchedResultsController 构建应用程序 并在 3 1 2 SDK 上测试该应用程序 问题是我一直在我的应用程序中到处使用 NSFetchedResultsController 并正