- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经创建了几个使用 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/
我可能是个白痴,但我还没能弄清楚这个问题。我正在尝试使用数据库为简单的 CRUD 框架设置一些类。 我从 Entity开始 界面和 Users implements Entity 类。 然后作为“da
背景:最近在查看“结构化文本编辑器”时,我注意到他们使用了一个技巧来更改 python/perl/c++/java 等。通过将 XML 潜入相应语言的注释中,将其转化为“结构化”大纲。 我记得我也曾经
此组件的渲染方法确实使用提供给组件的任何 Prop 。 组件是否会在 props 发生变化时重新渲染? class MyComponent extends React.Component { co
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我经常运行 git commit --only --amend 改写我最近一次提交的提交消息。无论我的工作目录是否干净,这都会起作用。 今天我注意到,在执行此操作时,我的 core.editor 中显
我正在尝试制定一个问题,以便只有重写就足够了 来证明目标。我想避免“聪明”地使用命题,而是使用 可以由 Coq 计算的 bool 值。 我定义了一个 bool 测试函数 member如果元素在列表中,
处理数学问题时,我非常喜欢 LINQ to Data。 我想知道当我使用的 IEnumerable 已经是一个数组时,LINQ 是否足够聪明,可以避免像 .ToArray() 这样的转换。请参见下面的
我最近写了下面的代码: Task ExecAsync( string connectionString, SqlCommand cmd, Func resultBuilder, Cancell
诚然,标题可能有点令人困惑,所以我将从一个例子开始。 我有一个包含大量数据的表。我将日期传递给存储过程,该存储过程将用作非常标准的 select 上的 where 的一部分: @MinDate DAT
前段时间发现了一个类似Clever CSS的CSS框架,但是我不记得它的名字了,现在找不到了。 你知道像 Clever CSS 这样的 CSS 框架吗?它就像 Clever CSS,但更强大。 谢谢。
我不知道这是聪明还是愚蠢。我喜欢 CL-WHO,也喜欢 Python,所以我一直在想办法将两者结合起来。我想说的是: tag("html", lst( tag("head"),
我已经创建了几个使用 Core Data 的应用程序并进行了大量实验,但我从未找到实现简单添加/编辑 viewController 的“完美”方法。我只想实现一个能够管理编辑和添加功能的 Contro
我有两列的行:产品 SKU 和类别 ID我只需要返回与 cat_ids 列表匹配的产品 SKU 和它们的 cat_ids在 SQL 中是: SELECT SKU,cat_id FROM myTable
这是导致问题的简单代码: class CoreViewController: UIViewController { private let isPad = UI_USER_INTERFACE_
完整的错误是“IR 生成失败:程序太聪明:变量与现有符号 _TWPSaSs12SequenceType 发生冲突”。 我正在编写一堆函数作为学习 Swift 的练习,尤其是 Swift 泛型。我的最新
未知:0:错误:IR 生成失败:程序太聪明:变量与现有符号 OBJC_CLASS_$_UIDevice 冲突 这是 Xcode 7.0.1 抛出的错误信息。我不知道,我做错了什么让 Xcode 抛出这
我是一名优秀的程序员,十分优秀!