在新数据库上发出合并多个MOC之间的更改

时间:2013-01-25 03:33:23

标签: iphone ios core-data

我有一个使用核心数据库存储的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];
}];
}

在主

的委托方法中设置临时MOC

从辅助视图控制器调用的listview控制器

-(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方法中,通知 确实包含用户为照片选择的评级。 但它没有反映在主列表视图控制器中。

1 个答案:

答案 0 :(得分:0)

开始使用嵌套的上下文。它在每个可能的级别上都非常容易和同步。目前还没有更新核心数据编程指南以便很好地介绍它。

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