0

我想UITableViewCell根据文档目录中是否存在文件来更改 a 。我觉得这应该是基于通知的,并且应该在对象isAvailable属性发生更改时发送通知。

我不想意外造成线程问题。由于我在主线程上操作我的核心数据对象,是否可以在我的 Concrete 类上设置自定义设置器以发布通知?

最好的方法是什么?我应该创建自己的通知,还是应该挂钩核心数据已经发布的内容?

4

1 回答 1

1

如果您使用NSFetchedResultsController. 此类可以与 a 结合使用,UITableView以减少内存开销并提高响应时间。

你可以在NSFetchedResultsController Class ReferenceNSFetchedResultsControllerDelegate Protocol Reference找到文档。

此外,您可以为NSFetchedResultsController. 实现NSFetchedResultsController委托方法,它允许您侦听数据(NSManagedObjectContext您注册的数据)中的添加、删除、移动或更新等操作,因此也可以在您的表中侦听。

关于该主题的一个非常好的教程是core-data-tutorial-how-to-use-nsfetchedresultscontroller。在这里,您可以找到设置 a UITableView、 aNSFetchedResultsController及其委托的所有元素。

这么说,关于您的问题,您可以使用此技术来更改(特定的)属性更改UITableViewCell时的内容。特别是,您应该实现以下委托方法以响应特定更改(请参阅注释)。isAvailableNSManagedObject

- (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:UITableViewRowAnimationFade];
            break;

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

        case NSFetchedResultsChangeUpdate: // <---- here you will change the content of the cell based on isAvailable property
            [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;
    }
}

希望能帮助到你。

于 2013-02-25T22:03:33.257 回答