在使用Core Data和Magical Record并花费了一段时间后出现错误,我正在开发iOS应用程序:
我在这个项目之前并不了解Core Data,事实证明我很天真地认为我可以与Magical Record一起工作而不必担心并发性,因为我没有针对主线程对托管上下文进行任何思考/工作。和背景线程。
在阅读了大量有关核心数据管理对象上下文和魔术记录的内容之后,我了解到:
Entity *localEntity = [entity MR_inContext:localContext]
在后台线程的上下文中处理实体。 saveWithBlock:completion:
和saveWithBlockAndWait:
方法来获取用于后台线程的托管上下文。 有关我的应用程序的一些信息:
现在-我的问题是:
让我知道一切是否清楚。如果没有,我将尝试增加清晰度。
任何帮助或指导方针,将不胜感激。
谢谢!
最佳答案
我没有使用MagicalRecord,但是这些问题与CoreData而不是与MagicalRecord有关,因此,我将尝试回答它们:)。
1)从主(UI)线程获取
设计应用程序模型的方法有很多,因此我几年来使用CoreData学会了两个重要的知识:
NSManagedObjectIDResultType
),将它们存储在数组中(或任何适合您的其他格式),将它们返回到主线程,并仅获取这些ID。请注意,如果由于谓词/sortDescriptor而导致获取时间较长,则此方法将加快处理速度,而不是如果“问题”正处于将错误变为对象的过程中(例如,存储在transformable属性中的大UIImage :))2)在后台创建实体
您可以在后台上下文中创建对象,保存上下文后将其存储为NSManagedObjectID (对象在保存之前只有临时ID),然后将其发送回主线程,在其中您可以按ID进行获取并在主线程中获取对象语境。
3)使用背景上下文
我不知道它是否是最好的,但是我对NSManagedObjectContext的观察和从通知中合并非常满意。退房:
mergeChangesFromContextDidSaveNotification:
因此,您创建背景上下文,将主要上下文添加为更改的观察者(
NSManagedObjectContextObjectsDidChangeNotification
),并且背景上下文会自动向您发送有关所有更改的通知(每次执行保存)–插入/更新/删除的对象(不用担心,您可以通过调用mergeChangesFromContextDidSaveNotification:
合并它)。这具有许多优点,例如:另一方面:
好吧,我希望它能回答您的问题。如果一切顺利,请不要犹豫:)
有关子上下文的旁注
也请看一下 child 的情况。他们也可以强大。基本上,每个子上下文在保存时都会将其更改发送到父上下文(如果是“基础”上下文(没有父上下文),则将其更改发送到持久协调器)。
例如,当您创建编辑/添加 Controller 时,您可以从主上下文中创建子上下文并在其中进行所有更改。当用户决定取消操作时,您只需销毁(删除引用)子上下文,就不会存储任何更改。如果用户决定接受他/她所做的更改,请保存子上下文并销毁它。通过保存子上下文,所有更改都将传播到其父存储(在本示例中为您的主上下文)。只要确保还保存了父上下文(在某个时候)以保留这些更改(save:方法不会进行冒泡)。 checkout documentation of managing parent store。
祝您编码愉快!