在保存完成魔法记录中使用保存的项目

时间:2014-08-04 13:18:00

标签: core-data objective-c-blocks magicalrecord magicalrecord-2.2

我想使用刚刚保存在Magical Record saveWithBlock方法的完成块中的项目。例如:

//Get the ID of an existing NSManagedObject to use in the save block (if it exists)
NSManagedObjectID *objectRef = [self.object objectID];

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
    //This method either loads an existing object and makes changes or creates  a new entity in localContext
   NSManagedObject *itemToSave = [self prepareItemInContext:localContext WithID: objectRef];
 } completion:^(BOOL success, NSError *error) {
     if (success) {
          //here I want to get at the object 'itemToSave' that was either created in the save block (with a new objectID) or updated (with the ID objectRef)

2 个答案:

答案 0 :(得分:1)

好吧,您需要引用外部上下文来加载具有该ID的对象:

NSManagedObjectContext *outsideContext = //...
NSManagedObjectID *objectID = //...

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {

} completion:^(BOOL success, NSError *error) {

    NSManagedObject *newlySavedObject = [outsideContext existingObjectWithID:objectID];
    //...do stuff here
}];

但是,一般来说,我会劝阻这种用法。我建议保留任何谓词或手段重新加载数据集,并从商店转储和重新获取新数据。这将为您提供适当的对象引用。在其他上下文中更新对象的另一种更精确的方法是侦听NSManagedObjectContextDidSaveNotification并将此更新合并到您的上下文中。从那里,您的数据将被“刷新”,只要您是KVO的财产,或者使用NSFetchedResultsController与代理,您的更新将传播到UI(或其他目的地)。

答案 1 :(得分:0)

要么只使用self.object,要么如果你创建一个新对象并插入它(大概是因为objectRef为nil),那么你应该从主线程上下文中获取相应的新对象并使用它。

你如何做到这一点是一个有趣的部分。目前还不清楚你为什么要使用背景上下文,所以你也可以考虑改变它,这样可以消除所有的复杂性。

如果你需要保留背景上下文,那么你需要决定如何将数据恢复到主线程。通常,您可以在当前块中使用performBlockAndWait:从主上下文中获取新对象,然后将其存储到类的属性中,以便在完成块中使用它。这将设置self.object属性。