我想使用刚刚保存在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)
答案 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
属性。