didChangeObject:未调用 NSFetchedResultsController

2024-04-11

我几乎尝试了所有方法,但无法找出问题所在。我有一个 NSFetchedResultsController 并从核心数据中获取一些帖子。然后我有一个方法,可以将新帖子插入到同一上下文中并保存上下文。通常,现在应该调用 didChangeObject: 方法,但事实并非如此。我有一个类似的视图控制器,我在不同的表(=ns Managed 对象)上执行基本相同的操作,并且 didChangeObject: 方法被成功调用。

到目前为止我已经尝试过:

  • 专门为此视图控制器创建了另一个上下文

  • 删除了 NSFetchedResultsController 的缓存

以下方法从核心数据数据库中提取数据并将其“存储”到 NSFetchedResultsController 中(变量:controller).

//reloading newsgroups from coredata
- (void)reloadNewsgroupsFromCoreData
{    
    //creating fetch request
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Post"];

    //sorting by transient date (hour and secons cutted off)
    NSSortDescriptor *sortByDate = [[NSSortDescriptor alloc] initWithKey:@"dateCreatedTransient" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByDate, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    //where clause
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ref_subscribed_newsgroup == %@ AND references == nil", self.newsgroup]];

    //setting fetchrequest
    self.controller = [[NSFetchedResultsController alloc]
                       initWithFetchRequest:fetchRequest
                       managedObjectContext:self.context
                       sectionNameKeyPath:@"dateCreatedForSections"
                       cacheName:nil]; //todo, maybe add a cache here!

    //fetch
    NSError *error;
    [self.controller performFetch:&error];

    if (error) {
        NSLog(@"%@", error);
    }
}

此外,根据文档,我将 NSFetchedResultsController 的委托设置为我的视图控制器(这与前面提到的 fetch 方法所在的位置相同)。

In viewDidLoad:

self.controller.delegate = self;

然后我实现了协议中的方法,还有didChangeObject:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {    
    UITableView *tableView = self.tableView;   

  // I HAVE ADDED A BREAKPOINT HERE BUT IT NEVER STOPS HERE.

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

            break;
        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath]
                    atIndexPath:indexPath];

            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray
                                               arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray
                                               arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }

}

然后我有另一种方法将一些帖子存储到核心数据中。我认为这很重要:该方法是通过另一个线程的委托调用的。 (服务器连接使用它调用它performSelectorOnMainThread:...)

- (void)storeIntoCoreData:(NSArray*)postsArray
{ 
...
        Post *entity = [NSEntityDescription insertNewObjectForEntityForName: @"Post" inManagedObjectContext:context];

        entity.inReply = dummy.in_reply;
        entity.body = dummy.body;
        entity.email = dummy.email;
        entity.from = dummy.from;
        entity.messageIdentifier = dummy.message_identifier;
        entity.references = dummy.references;
        entity.subject = dummy.subject;
        entity.dateCreated = dummy.date;
        entity.unread = [NSNumber numberWithInt:1];
...
    [self.context save:&error];
    if (error)
    {
        NSLog(@"error: %@", error);
    }

// IMPORTANT: CURRENTLY I AM CALLING THIS METHOD AGAIN HERE, WHICH 
// FETCHES ALL POSTS OUT OF CORE DATA.
// THIS IS SO UGLY AND NOT PERFORMANT. 
// THEN I INVOKE RELOADDATA ON THE TABLEVIEW TO RELOAD THE ENTIRE TABLE
// BUT THERE WAS JUST ONE INSERT SO A ENTIRE RELOAD WOULD NOT BE NECESSARY. 
    [self reloadNewsgroupsFromCoreData];
    [self.tableView reloadData];

// I HAVE TO DO THIS BECAUSE THE didChangeObject METHOD GETS NOT CALLED.
}

有人有什么提示或建议可能是错误的吗?

感谢致敬, 克里斯


问题是您正在设置控制器委托viewDidLoad然后分配一个新的控制器reloadNewsgroupsFromCoreData。您新分配的控制器没有设置委托。尝试直接设置委托reloadNewsgroupsFromCoreData.

您通常不想分配新的NSFetchedResultsController每当您的数据发生变化时。整个使用点NSFetchedResultsController是通过获取委托消息NSFetchedResultsControllerDelegate当事情发生变化时。您只需要分配一个新的NSFetchedResultsController如果您的获取请求发生变化。我建议再看一下苹果文档 http://developer.apple.com/library/ios/#DOCUMENTATION/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html.

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

didChangeObject:未调用 NSFetchedResultsController 的相关文章

  • NSURL URLWithString:引发异常

    简而言之 NSURL URLWithString 似乎引发了一个例外 根据文档 如果字符串格式错误 则返回 nil 没有提到在任何情况下都会引发异常 除此之外 我还对 URL 进行编码并检查nil在将字符串转换为 URL 之前 任何人都可以
  • 由于语言错误,Itunes Connect 无法提交

    Thats all it shows https i stack imgur com 0aZm8 png 我不确定它没有告诉我出了什么问题 it shows its linked to the language https i stack
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • Swift 3:如何去除UITableView屏幕截图的灰色区域

    我在从桌面视图的屏幕截图中删除灰色区域时遇到了问题 这是我尝试截图时的输出UITableView 实际上我隐藏了一些tableViewCell这是不需要的 可能这就是区域显示灰色的原因 任何帮助表示赞赏 非常感谢 Answer 我通过使用
  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • 自动布局、UIDynamics 和动画

    我对自动布局还很陌生 并且对如何为视图设置动画感到困惑 我读了很多 我知道你必须遵守限制 编辑它 然后包装layoutIfNeeded in an UIView动画块 但当真正要做的时候 我却有点失落 我很乐意有人能向我解释如何做这个动画
  • UITextFieldDelegate 与 UITextField 控件事件

    如果我想处理 UITextField 的更改 例如用户在其中键入 看起来这可以通过将委托分配给该文本字段 然后让委托实现 shouldChangeCharactersInRange 来完成 或者通过将目标添加到文本字段并处理 UIContr
  • 玻璃效果 UIView

    我想知道如何在 UIView 上添加玻璃效果 我想像这样的效果 http pttrns com pickers detail 0dc9d9f6c6a7577613b3453768eee3b3在灰色半透明视图上 您 可以在这里看到 Thank
  • Transit MKDirectionsRequest 产生 null 错误 Error Domain=MKErrorDomain Code=5 "(null)"

    我正在尝试使用 MapKit Directions Request 来获取两个坐标之间的交通方向 当我切换到其他 非 Transit 类型时 下面的代码可以工作 但是当我切换到 Transit 时 它会抛出一个错误 该错误在 Apple 文
  • iOS 8 中的 UISplitViewController 状态恢复

    在 iOS 8 上 UISplitViewController 似乎可以保存和恢复其子视图的状态 例如 主视图是否隐藏 这是不可取的 因为我的应用程序应该始终以横向方式显示主视图 并始终以纵向方式隐藏它 如果用户以横向模式关闭应用程序 保存
  • 如何从代码隐藏中设置 CarouselView 的项目?

    我有一个 CarouselView 它绑定到图像的 ItemsSource 但我想通过更改 CarouselView 的索引来更改当前显示的图像 我尝试使用 CarouselView Position 作为必须选择的元素的索引 但不幸的是这
  • 在 Swift 中自动移动 UISlider

    我想在按下按钮时将 UISlider 从 minValue 循环移动到 maxValue 并在再次按下按钮时将其停止在当前位置 我想使用 Swift 我遇到的主要问题是函数 slider setValue 太快了 我希望动画更慢 IBAct
  • iPhone 快照,包括键盘

    我正在寻找拍摄整个 iPhone 屏幕 包括键盘 的正确方法 我找到了一些截取屏幕的代码 CGRect screenCaptureRect UIScreen mainScreen bounds UIView viewWhereYouWant
  • iOS WKWebView.scrollView委托导致BAD_ACCESS

    我的 viewController 有一个 UIView 属性 其中包含一个 WKWebView 我将 WKWebView rollView 委托设置为我的 viewController 它是我的 UIView 子类的公共函数 并在我的 v
  • 对使用phonegap和钛的质疑[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近我听说了 PhoneGap 和 Titanium 移动网络应用程序的开发 我分析了这两个 Web 应用程序 并了解了如何使用它们以
  • Xcode 9 中的“addingPercentEncoding”是否损坏?

    在 Swift 3 x 和 Xcode 9 beta 2 中 使用addingPercentEncoding https developer apple com documentation swift string 1690785 addi
  • 当您感兴趣的任务完成时,是什么让完成处理程序执行该块?

    我一直在询问并试图了解完成处理程序是如何工作的 我用过很多 也读过很多教程 我将在这里发布我使用的代码 但我希望能够创建自己的代码 而无需使用其他人的代码作为参考 我理解这个完成处理程序 其中调用者方法 void viewDidLoad n
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s
  • 为什么这个 SKPhysicsJointPin 不能将这 2 个精灵保持在一起?

    我显然不太了解 SKPhysicsJoint 但是除了 Apple 文档之外 网上的信息还很少 下面的代码有什么问题 我认为应该保持头部和颈部永久连接 我的意图是它们就像两张带有大头针的纸 这样它们可以旋转一点 但不仅仅是完全分开 当我运行
  • ActionScript、NetStream.Play.Failed iOS AIR 移动设备

    我正在尝试以类似于 Tiberiu Ionu Stan http stackoverflow com questions 2036107 aac mp4 not working in actionscript 3s netstream 的方

随机推荐

  • 自动调整 NumPy 重新数组的大小

    我想创建 numpy recarray 的子类 当数据添加到当前长度之外的行时 它会自动调整大小 下面的代码完成了我想要的大部分功能 class autorecarray numpy recarray def init self args
  • p:对话框在验证失败时不隐藏

    我遇到无法关闭 PrimeFaces 对话框的问题 输入字段 用户名 是必需的
  • 单个 Django 模型,多个表?

    我在 MySQL 数据库中有几个临时表 它们共享相同的架构并具有动态名称 我将如何使用 Django 与这些表交互 单个模型可以从多个表中提取数据吗 我相信 您可以创建一个工厂函数 该函数会以动态方式返回您的模型db table http
  • Magento - 没有新闻通讯订阅和取消订阅事件

    为什么在客户或新闻通讯模块中的新闻通讯订阅 取消订阅过程中或周围没有调度任何事件 我目前面临的唯一选择是使用订阅者模型的重写来适应这里的一些代码 有没有其他人有一个好的替代方案 或者我错过了什么 我遇到了需要监听订阅 取消订阅事件的情况 我
  • 将连续整数分组在一起

    有以下代码 import sys ints 1 2 3 4 5 6 8 9 10 11 14 34 14 35 16 18 39 10 29 30 14 26 64 27 48 65 ints sort ints list set ints
  • 代理设计模式的使用

    我试图理解代理设计模式 但我无法理解代理设计模式的用法 我从维基百科得到了这个代码示例 interface Image public void displayImage on System A class RealImage impleme
  • 编辑器中的 Unity 模糊和像素化精灵(无像素艺术)

    我目前正在 Unity 中制作一款类似移动三消游戏 我已经在 Inkscape 中以 256x256 制作了宝石 用于匹配的对象 的所有图形 并以 90 dpi 导出它们 PNG 文件 也尝试使用 360 但没有任何改变 我的问题是 当我在
  • 在 TPL 中返回空静态任务是一种不好的做法吗?

    在某些情况下 我想有条件地运行任务 我使用某种扩展方法 如下所示 public static class MyTaskExtension private static Task theEmptyTask Task Factory Start
  • 如何在 Laravel 5.5 中获取验证消息

    大家好 我正在开发 Laravel 5 5 在这里我需要显示我的 API 的验证消息 到目前为止我已经这样做了 validator Validator make request gt all first name gt email requ
  • grep 时间命令输出

    Using time ls 我有以下输出 time ls l total 2 rwx 1 FRIENDS None 97 Jun 23 08 59 location txt rw r r 1 FRIENDS None 10 Jun 23 0
  • JavaScript OOP 原型在构造函数之外?

    我正在阅读developer mozilla org 的 OOP JS 指南 并发现了以下代码片段 function Person gender this gender gender Person prototype gender Pers
  • 标签 在 Google 脚本中意味着什么?

    是否是标签Google 脚本的特定语法或者它可以在纯 html javascript 页面中工作吗 有没有相关的描述 这类似于PHP 标签 但当我看到这个时我怀疑 正式地 这些代码在 GAS 文档中被称为 scriptlet 它们是用于服务
  • 缓存 auth_request 中的令牌

    我想缓存请求标头字段授权中的令牌 Authorization Bearer abcdefghijklmnopqrstuvwxyz 我的目标是 我不必验证验证服务器上的每个请求 如果授权令牌已缓存 且有效 则请求应调用 API 而无需验证 l
  • 如何有效地逐行迭代“Vec>”?

    我正在写一个图书馆 它采用了Vec
  • 为什么 PostgreSQL 在 Windows 上这么慢?

    我们有一个使用 MySql 运行的应用程序 在我们发现 MySql 不支持 PostGIS 所具有的某些 GIS 功能后 我们发现它不适合我们的应用程序 注意 mysql 仅支持最小边界矩形 GIS 搜索 所以我们将数据库更改为 Postg
  • 导入模块时内存使用差异

    我想知道以这些方式导入模块时内存使用情况有什么区别 import Mod1 from Mod1 import from Mod1 import a b c 主要介于前两者之间 第一个使用最少的内存 因为它只在模块范围中创建单个名称 第二个使
  • libgcc.a 和 libgcc_s.a 之间的区别?

    我们已经安装了 GCC 和libgcc在 AIX 6 1 上使用 RPM 文件 我想知道的是为什么 libgcc s a 没有在以下文件夹下创建 opt freeware lib gcc powerpc ibm aix6 1 0 0 4 2
  • ASP.NET 母版页 DefaultButton 覆盖

    我有一个带有表单元素的母版页 并将 defaultbutton 属性设置为服务器端 ImageButton 在我的其中一个页面上 我想通过在 Page Load 事件中设置 Forms DefaultButton 来 覆盖 母版页默认按钮属
  • UILabel 文本没有改变,但是 xx.title 正在工作

    我有两个视图控制器 在第一个视图控制器中 我有名称列表 当我单击它时 我希望在第二个视图控制器中显示相同的名称 我有下面的代码 void tableView UITableView tableView didSelectRowAtIndex
  • didChangeObject:未调用 NSFetchedResultsController

    我几乎尝试了所有方法 但无法找出问题所在 我有一个 NSFetchedResultsController 并从核心数据中获取一些帖子 然后我有一个方法 可以将新帖子插入到同一上下文中并保存上下文 通常 现在应该调用 didChangeObj