gpt4 book ai didi

ios - UITableViewController 和 NSFetchedResultsController 编辑问题

转载 作者:行者123 更新时间:2023-12-01 16:41:45 26 4
gpt4 key购买 nike

在我的应用程序中,我使用 CoreData 作为后备存储来管理音乐文件库。效果很好。我也使用 NSFetchedResultsController将数据绑定(bind)到表格 View 进行显示,这也很好。当我尝试在表格 View 上启用编辑时,就会出现问题。

像往常一样,我返回 YES来自 tableView:canEditRowAtIndexPath:允许编辑行,使滑动删除 UI。这很好用并且显示正确。但是,在删除文件等之后,UITableView开始出现一些奇怪的渲染问题:

uitableview issues

我不会向 tableview 发送任何消息来明确请求 UI 更新,因为获取的结果 Controller 会通知我的 UITableViewController它的子类,然后发送适当的消息:

/**
* Handler for changing an entire section at once
*/
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationRight];
break;

case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationLeft];
break;
}
}

/**
* Handler for changing a single object, usually a row.
*/
- (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:@[newIndexPath]
withRowAnimation:UITableViewRowAnimationRight];
break;

case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationLeft];
break;

case NSFetchedResultsChangeUpdate:
[tableView reloadRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;

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

/**
* Called when the fetched results controller begins sending update messages.
*/
- (void) controllerWillChangeContent:(NSFetchedResultsController *) controller {
[self.tableView beginUpdates];
}

/**
* Called when the fetched results controller finishes sending updates.
*/
- (void) controllerDidChangeContent:(NSFetchedResultsController *) controller {
[self.tableView endUpdates];
}

阅读完文档后,我很确定我需要做的就是从上下文中删除对象,如下所示:
- (void) tableView:(UITableView *) tableView commitEditingStyle:(UITableViewCellEditingStyle) editingStyle forRowAtIndexPath:(NSIndexPath *) indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// perform on the object context's background queue
[[SQUPersistence sharedInstance].managedObjectContext performBlock:^{
[[SQUPersistence sharedInstance].managedObjectContext deleteObject:[_fetchedResultsController objectAtIndexPath:indexPath]];

// Save database
[[SQUPersistence sharedInstance] save:nil];
}];
}
}

最终,UI 进入了一个奇怪的状态,如上所示,表格与后备存储不同步,并且没有执行任何动画。我做这整个删除的事情是错的,还是我遇到了苹果类的错误?

最佳答案

我怀疑这是线程问题。如果您在后台队列中删除,但从主队列中引用对象,[_fetchedResultsController objectAtIndexPath:indexPath] ,我相信这会导致问题。

马上,我会尝试确认:

- (void) tableView:(UITableView *) tableView commitEditingStyle:(UITableViewCellEditingStyle) editingStyle forRowAtIndexPath:(NSIndexPath *) indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSManagedObjectContext *context = _fetchedResultsController.managedObjectContext;
[context deleteObject:[_fetchedResultsController objectAtIndexPath:indexPath]];

// Save database (You do not have to do this here)
[context save:nil];
}
}

如果您这样做没有问题,我建议您离开它。在后台删除单个对象可能没有什么好处。您可能会挂起的是保存操作,您实际上不需要在这里执行此操作。您可以保留保存,直到用户退出或其他任何延迟都会被 UI 更改掩盖的点。

关于ios - UITableViewController 和 NSFetchedResultsController 编辑问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23692083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com