• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iPhone iOS如何在删除实体时删除从Core Data实体嵌套关系引用的本地文件?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 20:41:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个核心数据模型定义如下:

一个用户有很多事件。每个事件可以有许多图片。关系具有“级联”删除规则。

我正在尝试了解如何在实体消失时删除本地文件。核心数据实体在消失之前是否会调用某种 dealloc 或“finalize”方法?

每个图片实体都有一个对存储在应用文档目录中的本地文件的引用。

当通过table view的commitEditingStyle删除用户时,我可以通过关系逐步删除图像并手动删除文件:

- (void)tableViewUITableView *)tableView commitEditingStyleUITableViewCellEditingStyle)editingStyle forRowAtIndexPathNSIndexPath *)indexPath
{

    {
        // Delete the managed object for the given index path
        NSManagedObjectContext *context = [[[RKObjectManager sharedManager] objectStore] managedObjectContext];

        AppUser* managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];

        //clean up local files before deleting the object
        [self deleteLocalContentForAppUser:managedObject];        

//now delete the object
        [context deleteObject:managedObject];

        // Save the context to remember deletion
        NSError* error = nil;
        if (![context save:&error]) {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }

    }

}

但是,当通过其他方法删除实体时,当我的获取结果 Controller 收到通知时,嵌套关系不包含任何对象。用户的事件集将没有任何实体可以单步执行并删除本地内容。这是为关系设置“级联”删除规则的结果吗?

- (void)controllerNSFetchedResultsController *)controller didChangeObjectid)anObject
       atIndexPathNSIndexPath *)indexPath forChangeTypeNSFetchedResultsChangeType)type
      newIndexPathNSIndexPath *)newIndexPath
{
//    UITableView *tableView = self.tableView;
//     
    AppUser* managedObject = anObject;
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationNone];
//             [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            //             [self configureCell:[tableView cellForRowAtIndexPath:newIndexPath] atIndexPath:newIndexPath];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];


            //these methods cannot find any content to delete
            [managedObject deleteLocalImages];
            [managedObject deleteLocalContent];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[self.tableView cellForRowAtIndexPath:newIndexPath] atIndexPath:newIndexPath];

            [managedObject updateLocalImages];
            break;

        case NSFetchedResultsChangeMove:
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}



Best Answer-推荐答案


您可以在 NSManagedObject 子类中实现 prepareForDeletion 方法。它在删除对象之前自动调用,因此您也可以从那里删除引用的文件。

关于iPhone iOS如何在删除实体时删除从Core Data实体嵌套关系引用的本地文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419201/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap