gpt4 book ai didi

ios - 核心数据 : A clever way to implement Add/Edit functionality

转载 作者:行者123 更新时间:2023-11-29 12:33:17 25 4
gpt4 key购买 nike

我已经创建了几个使用 Core Data 的应用程序并进行了大量实验,但我从未找到实现简单添加/编辑 viewController 的“完美”方法。我只想实现一个能够管理编辑和添加功能的 Controller ,我不想创建两个不同的 Controller 。

目前我正在使用这种方法(让我们以经典的 Person NSManagedObject 为例)

1)addEditViewController 中我添加了一个 currentPerson 属性

var currentPerson:Person? 

2) 当我在 Add-Mode 中显示 Controller 时,此属性为 nil

3) 当我在 Edit-Mode 中显示 Controller 时,此属性是对要编辑的 Person 的引用

4) 当我需要保存用户操作时,我只检查是否设置了 currentPerson 并且我知道我是否需要在上下文中创建一个新对象或者只保存我需要编辑的对象.

好的,这种方法可行,但我想采用另一种似乎更安全的编辑操作方法。检查这个可怕的错误!

假设此人具有 Address 属性,需要使用不同的 viewController 进行编辑。

1) 按照我之前的逻辑,我可以将 currentPerson 属性传递给我将要展示的 addressViewController:

addressVC.currentPerson = currentPerson
presentAddressVC()

2) 现在,当用户完成编辑操作并点击“保存”时addressVC 调用 saveContext 函数。

问题出在哪里?好吧...如果用户开始在 addEditViewController 中编辑 currentPerson,然后返回到之前的 Controller ,currentPerson 仍会存储用户的编辑,并尽快由于上下文将保存在任何其他 Controller 中,因此不需要的数据将被存储并变得持久化。

如果用户点击 addEditViewController 上的后退按钮,我可能可以执行 rollback,但我真的不喜欢这种行为,它看起来很糟糕。

我想使用多个上下文或在 nil 上下文中插入 NSManagedObjects 并仅在操作结束时将它们移动到主上下文,但我也不确定这个选择。

我知道这是一个复杂而冗长(乏味)的问题,但我希望你能就这个问题给我一些启发。你如何对待这种情况?您如何看待我的方法和我提出的方法?

最佳答案

在我看来,您的问题是维护与单个 NSManagedObjectContext 的连接,而您真正想要的是建立一棵树。上下文的构造相当便宜,因此您应该为每个 ViewController 创建一个上下文。

因此,当您显示 addEdit Controller 时,您可以简单地使用新上下文创建它:

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
context.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy;
context.parentContext = //parentContext
context.undoManager = nil;

将这些新上下文视为用于编辑托管对象的草稿本。唯一要记住的是,当您调用 save 时,它​​会保存到父上下文,而不是一直保存到商店。为此,您将需要一直递归调用父级以进行保存。这是一个基本的递归保存:

- (void)saveChangesToDiskForManagedObjectContext:(NSManagedObjectContext *)context {
if (context && [context hasChanges]) {
[context save:nil];
NSManagedObjectContext *parentContext = context.parentContext;
[parentContext performBlock:^{
[self saveChangesToDiskForManagedObjectContext:parentContext];
}];
}
}

在应用程序中保留可在其他屏幕上删除的托管对象并不是很好的做法。所以你应该做的也许是在你的 View Controller 中获取这些对象, View 将出现方法。或者调用 refreshObject(mergeChanges:) 将您的托管对象与另一个屏幕所做的更改同步。

我真的不喜欢在用户返回时调用 save 的想法,应该有一个保存按钮,当我按下返回时我试图关闭屏幕,我希望如果我想保存更改,请选择“完成”。

别忘了您还可以使用 NSUndoManager 来跟踪所有更改,这就是上下文具有 undoManager 的原因:)

关于ios - 核心数据 : A clever way to implement Add/Edit functionality,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26992272/

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