0

合并后我知道我在这里丢失了不少,但我无法找到任何代码的教程和它被我逼疯。创建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]; 
} 
+0

不知道这实际上是答案,但加入[self.db保存]后self.workingSet = self.custs;似乎已经做了诀窍 - 我只是没有保存父上下文后,子上下文完成其事情。我认为这很复杂,但考虑到子上下文已经正确设置了父项,保存父项后似乎已将子项的保存传播给父项。 – Darrrrrren

回答

0

我确实要回答这个问题 - 因为保存父上下文的语境孩子做了之后的事情,我没有收到一个程序崩溃。