【发布时间】:2014-07-15 10:23:13
【问题描述】:
我有一个带有一些属性的NSManagedObject(文件),我编写了一些代码,根据NSManagedObject 中的信息下载带有AFNetworking 的文件 - 下载工作正常!
现在我想更改completion block 中的一些元数据,并使用Magical Record 将更改保存到CoreData。这基本上可以工作,除了我必须重新启动应用程序才能获得 NSManagedObject 的新值 - 这就是问题所在。在一个生命周期中,我无法获得更新的NSManagedObject。我什至尝试重新获取对象...
我不明白,为什么我必须重新启动 App 才能获取更新的信息?有context 问题吗?没看到。
我从defaultContext 获取文件对象:
NSManagedObjectContext *managedObjectContext = [NSManagedObjectContext MR_defaultContext];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"File" inManagedObjectContext:managedObjectContext]];
这是我的下载方法:
- (void)downloadFile:(File*)fileObject {
...
completionBlock:^(AFHTTPRequestOperation *operation, id responseObject) {
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
File *localFile = [fileObject MR_inContext:localContext];
localFile.downloadStatus_ = [NSNumber numberWithInt:DownloadStatusCompleted];
}];
NSLog(@"State: %@"fileObject.downloadStatus_);
}
}
更新: 我改变了线路并且它起作用了。我很困惑。我猜想,localContext 实际上应该是当前上下文。哪个应该是对象的那个。
File *localFile = [fileObject MR_inContext:localContext];
到
File *localFile = [fileObject MR_inContext:[NSManagedObjectContext MR_defaultContext]];
【问题讨论】:
-
你什么时候运行你的提取?如果您正在阻塞和等待,为什么要使用本地上下文?您是否考虑过使用获取的结果控制器?
-
在下载文件之前进行提取。据我了解,先生应该使用 localContext。
-
你说
I even tried to refetch the object...- 你在哪里试过? -
在NSLog语句之后(那个时候应该更新属性。
-
您应该验证
MR_inContext:在该上下文中返回一个实例(因为它可能会失败并返回 nil)。
标签: ios objective-c block nsmanagedobject magicalrecord