合并后我知道我在这里丢失了不少,但我无法找到任何代码的教程和它被我逼疯。创建ManagedObjectContext和并发核心数据更新
我有一个应用程序,示出了在可经由上拉至刷新被更新的表图(从核心数据拉动)项。更新程序从REST API中提取新数据并将其存储在核心数据中,并刷新TableViewController中包含的主数据集。
很显然,我想拉来刷新是非阻塞的,所以我一个MOC内实现它:performBlock方法调用。一切似乎工作,但我的模型中执行数据库操作时,我得到随机的应用程序崩溃,我知道这是因为我管理我的MOCS和持久对象模型不正确。如果有人能指出我的方向正确,我会很感激。
下面是实际执行数据和表刷新方法。下面我将列出一堆辅助代码可能有用:
-(void)refresh {
NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:self.db];
[child performBlock:^{
model = [[CustomersModel alloc] init];
self.custs = [model getUpdatedCustomers:self.db];
self.workingSet = self.custs;
dispatch_async(dispatch_get_main_queue(), ^{
[super performSelector:@selector(stopLoading) withObject:nil afterDelay:1.0];
});
}];
}
-(void)stopLoadingComplete {
...
[self.tableView reloadData];
}
这里设立商务部,持久性数据存储等我的appdelegate代码:
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
这里是我的分配MOC应用程序委托代码到UITableViewControllers:
CustomerListViewController *clvc = [[CustomerListViewController alloc] initWithNibName:@"CustomerListViewController" bundle:nil withManagedContext:self.managedObjectContext];
clvc.detailViewController = detailViewController;
UINavigationController *clvcNav = [[UINavigationController alloc] initWithRootViewController:clvc];
这里是我的客户列表视图控制器的分配MOC代码:
customerlistview.h:
#import <UIKit/UIKit.h>
#import "CustomersModel.h"
#import "SearchBarTableViewController.h"
@interface CustomerListViewController : SearchBarTableViewController
{
CustomersModel *model;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withManagedContext:(NSManagedObjectContext *)db;
@property (retain) IBOutlet UISearchBar *searchBar;
@property (strong, nonatomic)NSManagedObjectContext *db;
@property (strong, nonatomic)NSArray *custs, *workingSet;
@end
customerlistview.m:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withManagedContext:(NSManagedObjectContext *)passedDB {
self.db = passedDB;
return [self initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}
不知道这实际上是答案,但加入[self.db保存]后self.workingSet = self.custs;似乎已经做了诀窍 - 我只是没有保存父上下文后,子上下文完成其事情。我认为这很复杂,但考虑到子上下文已经正确设置了父项,保存父项后似乎已将子项的保存传播给父项。 – Darrrrrren