更新 NSManagedObject 不会使用 MagicalRecord 调用 NSFetchedResultsControllerDelegate

Posted

技术标签:

【中文标题】更新 NSManagedObject 不会使用 MagicalRecord 调用 NSFetchedResultsControllerDelegate【英文标题】:updating NSManagedObject doesn't call NSFetchedResultsControllerDelegate using MagicalRecord 【发布时间】:2014-07-04 19:17:51 【问题描述】:

我有一个具有这种一对多关系的模型:

Order -->> LineItem 

我在 UITableViewCells 中显示 LineItems:

我使用 UIPickerView 来改变 LineItems 的数量。

GOAL=>通过更改选择器值,重新计算 subTotal。

问题在于通过更新 lineItem,NSFetchedResultsController Delegate 不会调用(我可以再次重新配置单元格并显示更新的数据)。但是当我更新订单时,例如将其设置为已完成 NSFetchedResultsController 将调用委托方法。

为什么更新 lineItem 不会影响要调用的委托方法?

我使用magicRecord,这是我获得NSFetchedResultsController的方法

- (NSFetchedResultsController *)fetchedResultsController

    if (_fetchedResultsController != nil) 
        return _fetchedResultsController;
    
    else
    
        _fetchedResultsController = [Order fetchAllSortedBy:@"orderDate" ascending:YES withPredicate:nil groupBy:nil delegate:self];
    

    return _fetchedResultsController;

我设置表格视图的方式:

ConfigureCellBlock configureCell = ^(OrderDetailsCell *cell, LineItem *lineItem)

    [cell configureForLineItem:lineItem];
;
//set fetchedresults controller delegate
Order *order = [[self.fetchedResultsController fetchedObjects] lastObject];
NSArray *lineItems = [order.lineItems allObjects];

self.ordersDataSource = [[ArrayDataSource alloc] initWithItems:lineItems cellIdentifier:@"lineItemCell" configureCellBlock:configureCell];
self.tableView.dataSource = self.ordersDataSource;

配置单元:

- (void)configureForLineItem:(LineItem *)lineItem


self.menuItemName.text = lineItem.menuItemName;
self.price.text = [lineItem.unitPrice stringValue];
self.quantity.text = [lineItem.quantity stringValue];
self.totalPrice.text = [lineItem.totalPrice stringValue];

self.pickerController.model = lineItem;
self.picker.delegate = self.pickerController;
self.picker.dataSource = self.pickerController;
[self.picker setSelectedNumber:lineItem.quantity];

获取 obj1 然后更新 obj3 会导致调用 NSFRC 委托方法吗?

【问题讨论】:

【参考方案1】:

FRC 只会观察到它直接感兴趣的对象的变化,而不是与它们相关的任何对象。

您应该配置自己的观察,直接使用 KVO 或保存的上下文,并使用它来触发 UI 刷新。

【讨论】:

是的,我没有获取订单,而是获取了 lineItems 并为它们设置了 FRC 委托。谢谢

以上是关于更新 NSManagedObject 不会使用 MagicalRecord 调用 NSFetchedResultsControllerDelegate的主要内容,如果未能解决你的问题,请参考以下文章

保存上下文不会保留更新的 NSManagedObject

NSManagedObject 已删除,但关系未更新

xCode 8 会自动更新 NSManagedObject,是吗?

Core Data 不会将属性更新保留到数据库

NSManagedObject changedValues 不正确

使用不同的 NSManagedObjectContexts 时更新 NSManagedObject