- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个带有谓词的fetchedResultsController,其中"isOpen == YES"
当调用 closeCurrentClockSet 时,我将该属性设置为 NO。因此,它不应再出现在我的 tableView 上。
出于某种原因,这没有发生。
有人可以帮我解决这个问题吗?
-(void)closeCurrentClockSet
{
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"isOpen == YES"];
NSArray *fetchedObjects =
[self fetchRequestForEntity:@"ClockSet"
withPredicate:predicate
inManagedObjectContext:[myAppDelegate managedObjectContext]];
ClockSet *currentClockSet = (ClockSet *)fetchedObjects.lastObject;
[currentClockSet setIsOpen:[NSNumber numberWithBool:NO]];
}
--
我还有几个方法,使用完全相同的方法,通过调用自定义的 fetchRequestForEntity:withPredicate:inManagedObjectContext 方法。
在这些方法中,当更改属性时,tableView 会正确更新!但是上面的这个 (closeCurrentClockSet) 没有!我不明白为什么。
--
我的 fetchedResultsController 实现来自 Apple 的文档。
还有一个细节。如果我将我的应用程序发送到后台。关闭它并重新打开,tableView 显示已更新!
我已尽力在 stackOverflow 上关注之前的问题。没运气。我也 NSLogged 到骨头。正在正确获取对象。这是正确的。 isOpen 属性 已正确更新为NO。但出于某种原因,我的 fetchedResultsController 没有更新 tableView。
我确实尝试了几个“锤子”解决方案,例如 reloadData 和调用 performFetch。但这没有用。或者使用它们是有意义的......
编辑:从头开始,它确实有效,在我的 resultsController 上执行 performFetch 后立即调用 reloadData,但使用 reloadData 正在敲定一个解决方案。另外,它会删除所有动画。我希望我的 Controller 自动更新我的 tableView。
谁能帮我解决这个问题?
非常感谢任何帮助!
谢谢,
努诺
编辑:
完整的实现。
fetchedResultsController 非常标准和直接。其他一切都来自 Apple 的文档
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController) {
return _fetchedResultsController;
}
NSManagedObjectContext * managedObjectContext = [myAppDelegate managedObjectContext];
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"ClockPair"
inManagedObjectContext:managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
NSString *predicate = [NSString stringWithFormat: @"clockSet.isOpen == YES"];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:predicate]];
NSSortDescriptor *sortDescriptor1 =
[[NSSortDescriptor alloc] initWithKey:@"clockIn" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setFetchBatchSize:20];
NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:nil
cacheName:@"Root"];
_fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
Apple 文档中的样板代码:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
// The fetch controller is about to start sending change notifications, so prepare the table view for updates.
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationTop];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationLeft];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationTop];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller
didChangeSection:(id )sectionInfo
atIndex:(NSUInteger)sectionIndex
forChangeType:(NSFetchedResultsChangeType)type
{
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
第一次更新:
Tracking [managedObjectContext hasChanges] 确实返回 YES,这是应该的。但是 fetchedResultsController 没有更新 tableView
第二次更新
didChangeObject:atIndexPath: 没有被调用 对于这种特殊情况!我还有 2 个方法,使用完全相同的代码,它们只是碰巧是不同的实体。他们工作得很好。感谢@Leonardo 指出这一点
第三次更新 这个方法遵循同样的规则。但确实有效。
- (void)clockOut
{
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"isOpen == %@", [NSNumber numberWithBool:YES]];
NSArray * fetchedObjects =
[self fetchRequestForEntity:@"ClockPair"
withPredicate:predicate
inManagedObjectContext:[myAppDelegate managedObjectContext]];
ClockPair *aClockPair = (ClockPair *)fetchedObjects.lastObject;
aClockPair.clockOut = [NSDate date];
aClockPair.isOpen = [NSNumber numberWithBool:NO];
}
有人对我可能遗漏的内容有任何其他想法吗?
谢谢,
努诺
最佳答案
OK,我会解释你的问题,然后让你判断是不是FRC的bug。如果您认为这是一个错误,那么您真的应该向 Apple 提交错误报告。
你的获取结果 Controller 谓词是这样的:
NSString *predicate = [NSString stringWithFormat: @"clockSet.isOpen == YES"];
这是 bool 值的有效谓词。它将遵循 clockSet
实体的关系并获取其 isOpen
属性。如果是 YES
,那么这些对象将被接受到对象数组中。
我认为我们到此为止都很好。
现在,如果您将 clockSet.isOpen
属性之一更改为 NO
,那么您希望看到该对象从您的 TableView 中消失(即,它不应再匹配谓词,因此它应该从获取的对象数组中删除)。
所以,如果你有这个......
[currentClockSet setIsOpen:[NSNumber numberWithBool:NO]];
然后,无论哪个顶级对象与 currentClockSet
有关系,都应该从您的 FRC 获取结果数组中“消失”。
但是,您并没有看到它消失。原因是FRC监控的对象没有变化。是的,谓词键路径发生了变化,但 FRC 包含实体 ClockPair
和 ClockSet
实体实际上发生了变化。
您可以观看通知飞来飞去,看看幕后发生了什么。
无论如何,FRC 将在您进行抓取时使用关键路径,但它不会监视对不在其实际抓取对象集中的对象的更改。
最简单的解决方法是为包含此关键路径对象的对象“设置”一个属性。
例如,我注意到 ClockPair
也有一个 isOpen
属性。如果你有逆向关系,那么你可以这样做......
currentClockSet.isOpen = NO;
currentClockSet.clockPair.isOpen = currentClockSet.clockPair.isOpen;
请注意,您实际上根本没有更改该值。然而,setter 被调用,这触发了 KVO,因此私有(private)的 DidChange 通知,然后告诉 FRC 对象改变了。因此,它会重新评估检查以查看是否应包含该对象,发现 keypath 值已更改,然后执行您期望的操作。
因此,如果您在 FRC 谓词中使用关键路径,如果您更改该值,则需要蠕动回到 FRC 数组中的所有对象并“弄脏它们”,以便这些对象位于传递有关对象更改的通知。这很丑陋,但可能比保存或更改您的提取请求并重新提取要好。
我知道你不相信我,所以继续尝试吧。请注意,要使其正常工作,您必须知道 FRC 对象数组中的哪些项目会受到更改的影响,并“戳”它们以使 FRC 注意到更改。
如前所述,另一种选择是保存上下文并重新获取值。如果您不想保存上下文,则可以使获取包含当前上下文中的更新,而无需从存储中刷新。
我发现,对 FRC 正在监视的对象进行伪造更改是完成对作为其他实体的关键路径的谓词进行重新评估的最佳方式。
好的,所以,这是否是错误还有待商榷。就我个人而言,我认为如果 FRC 要监控 key 路径,它应该一直监控,而不是像我们在这里看到的那样部分监控。
我希望这是有道理的,我鼓励您提交错误报告。
关于objective-c - 更改托管对象属性不会触发 NSFetchedResultsController 更新 TableView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12370521/
SO亲爱的 friend 们: 2014 年 3 月 18 日。我正在处理一种情况,在使用 ng-repeat 时,数组内的元素(我从 Json 字符串中获取)更改了原始顺序。 需要明确的是,数组中的
有很多问题询问如何在 JavaScript 单击处理程序中更改 div 的类,例如,此处:Change Div style onclick .我理解得很好(只需更改 .className),并且它有效
我从access导入了一个数据库到mysql,但其中一个表的列名“股数”带有空格,但我尝试更改、替换甚至删除列名,但失败了。任何人都可以帮助解决这一问题 String UpdateQuary = "U
我正在做一个随机的学校元素。 目前,我有一个包含两个 CSS 的页面。一种用于正常 View ,一种用于残障人士 View 。 此页面还包括两个按钮,它们将更改使用的样式表。 function c
我需要使用 javascript 更改 HTML 元素中的文本,但我不知道该怎么做。 ¿有什么帮助吗? 我把它定义成这样: Text I want to change. 我正在尝试这样做: docum
我在它自己的文件 nav_bar.shtml 中有一个主导航栏,每个其他页面都包含该导航栏。这个菜单栏是一个 jQuery 菜单栏(ApyCom 是销售这些导航栏的公司的名称)。导航栏上的元素如何确定
我正在摆弄我的代码,并开始想知道这个变化是否来自: if(array[index] == 0) 对此: if(!array[index] != 0) 可能会影响任何代码,或者它只是做同样的事情而我不需
我一直在想办法调整控制台窗口的大小。这是我正在使用的函数的代码: #include #include #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd;
我有很多情况会导致相同的消息框警报。 有没有比做几个 if 语句更简单/更好的解决方案? PRODUCTS BOX1 BOX2 BOX3
我有一个包含这些元素的 XELEMENT B Bob Petier 19310227 1 我想像这样转换前缀。 B Bob Pet
我使用 MySQL 5.6 遇到了这种情况: 此查询有效并返回预期结果: select * from some_table where a = 'b' and metadata->>"$.countr
我想知道是否有人知道可以检测 R 中日期列格式的任何中断的包或函数,即检测日期向量格式更改的位置,例如: 11/2/90 12/2/90 . . . 15/Feb/1990 16/Feb/1990 .
我希望能够在小部件显示后更改 GtkButton 的标签 char *ButtonStance == "Connect"; GtkWidget *EntryButton = gtk_button_ne
我正在使用 Altera DE2 FPGA 开发板并尝试使用 SD 卡端口和音频线路输出。我正在使用 VHDL 和 C 进行编程,但由于缺乏经验/知识,我在 C 部分遇到了困难。 目前,我可以从 SD
注意到这个链接后: http://www.newscientist.com/blogs/nstv/2010/12/best-videos-of-2010-progress-bar-illusion.h
我想知道在某些情况下,即使剧本任务已成功执行并且 ok=2,ansible 也会显示“changed=0”。使用 Rest API 和 uri 模块时会发生这种情况。我试图找到解释但没有成功。谁能告诉
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: add buttons to push notification alert 是否可以在远程通知显示的警报框中指定有
当您的 TabBarController 中有超过 5 个 View Controller 时,系统会自动为您设置一个“更多” View 。是否可以更改此 View 中导航栏的颜色以匹配我正在使用的颜
如何更改.AndroidStudioBeta文件夹的位置,默认情况下,该文件夹位于Windows中的\ .. \ User \ .AndroidStudioBeta,而不会破坏任何内容? /编辑: 找
我目前正在尝试将更具功能性的编程风格应用于涉及低级(基于 LWJGL)GUI 开发的项目。显然,在这种情况下,需要携带很多状态,这在当前版本中是可变的。我的目标是最终拥有一个完全不可变的状态,以避免状
我是一名优秀的程序员,十分优秀!