0

我有一个 IOS 应用程序,它使用核心数据库来存储缩略图照片图像及其用户选择的评级。我为此使用了多个托管对象上下文。

问题是,当第一次安装和启动应用程序(并因此创建一个新数据库)时,主 MOC 看不到来自正在更改照片评级的临时 MOC 的更新。然而,在应用程序的后续启动(即数据库已经存在)中,每次都运行良好。

此外,在新应用启动时,即使评分未显示在主视图控制器中,我也知道它们已保存到磁盘,因为在应用重新启动时,我会看到用户输入的评分。

主 MOC 是一个显示照片的列表视图控制器。当用户从列表中选择一张照片时,它会启动另一个视图控制器(将临时 MOC 绑定到同一个持久性存储),用户在其中选择照片评级。但是在应用程序的新启动时,照片评级设置永远不会传播回列表视图控制器。

我已经包含了一些代码。将不胜感激任何见解。

在主列表视图控制器中创建数据库

if ([fileManager fileExistsAtPath:[urlForPhotosDb path]]) {

if (photosDB.documentState == UIDocumentStateClosed) {
   [photosDB openWithCompletionHandler:^(BOOL success) {

        ......(additional code here).........

}];     
}
} else {
[photosDB saveToURL:urlForPhotosDb forSaveOperation:UIDocumentSaveForCreating
completionHandler:^(BOOL success) {
[PhotosDatabase populatePhotosDb];

......(additional code here).........
];
}

return photosDB;
}

在主 listView 控制器中查看加载

(void)viewDidLoad
{
[super viewDidLoad];


[PhotosDatabase getPhotosDbForOpenBlock:^(UIManagedDocument  *doc) {
self.psc = [doc.managedObjectContext persistentStoreCoordinator];
[self setupFetchedResultsController:doc];
[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(contextSaved:)
                                      name:NSManagedObjectContextDidSaveNotification
                                      object:nil];
}];
}

在 main 的委托方法中设置临时 MOC

从辅助视图控制器调用的列表视图控制器

-(void)didSelectPhotoRating:(NSDictionary *)photoInfo Rating:(NSNumber *)rating
{
NSManagedObjectContext *newContext = [[NSManagedObjectContext alloc] init];
[newContext setPersistentStoreCoordinator:self.psc];
Photos *photo = [Photos findPhoto:photoInfo
           inManagedObjectContext:newContext];
if (photo) {
photo.rating = rating;
NSError *error;
[newContext save:&error];
}

}

主列表视图控制器中用于合并更改的方法

-(void)contextSaved:(NSNotification *)notification
{
if ([notification object] != self.document.managedObjectContext) {
    [self.document.managedObjectContext

mergeChangesFromContextDidSaveNotification:notification];
[self performFetch];
[self.tableView reloadData];
}
}

在上面的 contextSaved 方法中,通知确实包含用户为照片选择的评分。但它并没有反映在主列表视图控制器中。

4

1 回答 1

0

开始使用嵌套上下文。它在每个可能的级别上都容易得多并且同步。目前尚未更新核心数据编程指南以很好地涵盖它。

http://www.cocoanetics.com/2012/07/multi-context-coredata/

于 2013-01-25T03:42:32.280 回答