NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete
我有一个NSFetchedResultsController以下列方式启动:
NSEntityDescription *myEntity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:myEntity]; [fetchRequest setFetchBatchSize:10]; [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]]; NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]; [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor, nil]]; myFetchedResults = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil]; myFetchedResults.delegate = self; [myFetchedResults performFetch:nil];
一些事实:
-
wasDeleted是MyEntity的一个NSNumber属性(BOOL)
-
如果我更新此属性
[NSNumber numberWithBool:YES]
NSFetchedResultsControllerDelegate调用didChangeObject但触发NSFetchedResultsChangeUpdate而不是NSFetchedResultsChangeDelete 。 -
然而,如果我popup视图,并再次获取结果控制器,该对象不存在了,显示
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]];
作品。 -
在这NSFetchedResultsChangeUpdate后,当cellForRow被调用,我打印wasDeleted,它被设置为YES。
这里有什么可能是错的?
(换句话说,如果对象仍然存在于上下文中,NSFetchedResultsChangeDelete可以被调用,但是不适合谓词?)
当然changeUpdate
而不是changeDelete
。 你只更新了一个值,并没有删除整个项目。 如果你从你的数据库中删除该项目,那么它会调用changeDelete
。 并且它不会显示在新的init之后,因为您的表正在基于此属性进行筛选。
您需要监听wasDeleted
并检查属性wasDeleted
已更改。 如果是这样,更新您的表视图为您的需要,例如。 删除特定的行。
我做了同样的事情在我的应用程序,并已注意到-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath
委托第一次调用-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath
更改types后跟第二次调用-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPath
更改types调用。
NSFetchedResultsChangeUpdate
可能是预期的行为,但是没有解释的是为什么第一次调用NSFetchedResultsChangeDelete
失败。 你能确认你正确处理这个案子吗?
我有和你一样的问题。
不要使用wasDeleted
作为你的属性名称。 处理CoreData对象时,不应使用deleted
的变体。
我将我的属性重命名为hidden
,并将其用于谓词。 一切都如你所愿。
- AlertController每次在swift ios嵌套条件下被popup
- 使com.apple.CoreData.ConcurrencyDebug 1工作
- NSManagedObjectContext executeFetchRequest返回不稳定的对象,导致EXC_BAD_ACCESS,SIGABRT等
- iOS TableView解散模态后重新加载
- Swift中的核心数据:只保存for循环中的最后一个对象
- Mogenerator和ARC在XCode 4.6
- 如何通过CoreData模型创build一个新的实体(表)?
- 正确实现父/子NSManagedObjectContext
- 使用AFIncrementalStore和NSFetchedResultsController死锁