Tag: nsmanagedobjectcontext

处理来自服务器的JSON数据并添加/更新CoreData中的对象

我正在使用coreData的应用程序,我有两个实体称为文件夹和笔记 。 所以他们是文件夹 – >笔记之间的一对多关系 。 即1文件夹=许多笔记。 我已经使用了文件夹的抓取结果控制器 ,并且它显示在UITableView上,当用户单击一个文件夹时,他转到注释表,该注释表在特定文件夹内显示注释。 用户可以添加和删除文件夹/注释。 一切工作正常。 这里的一切都离线了。 现在我试图与服务器同步这个数据,以便我可以将这个数据同步到多个设备。 我不做盲目同步,我只同步更改的数据。 我使用NSURLConnection默认是asynchronous的 ,它具有从服务器提供json数据的委托函数。 现在我正在尝试处理这个JsonData ,我正在遵循FindOrCreate方法。 所以如果文件夹/ Notes存在,那么只需要更新它或者创build一个新的文件并保存coreData。 我正在使用相同的managedObject和后处理发生在主线程。 面临的问题。 (这是现实世界的案例) 1)当拉动发生,用户可能会添加新的文件夹/笔记和UI应该是响应,但在我的情况下UI卡住了 。 所以我想知道如何stream畅地创build/更新来自服务器的新数据,并且UI也是响应式的。 2)我尝试使用后台队列中的后台进程 dispatch_async(dispatch_get_global_queue(0,0),^ { } 但在这里我观察到的是,我得到一个崩溃,其中说*终止应用程序由于未捕获exception'NSGenericException',原因:'*集合<__ NSCFSet:0x1557ecd0>被列举时发生了变异。

NSFetchedResultsController似乎是插入空的对象数组?

我不确定发生了什么问题。 我的数据模型中有一个实体,名为Quote,其中大约3000个存储在.sqlite中。 我只是试图通过NSFetchedResultsController的方式获得这些实体的属性之一到一个UITableView的单元格。 我得到的错误是在这行代码: NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest managedObjectContext: [self managedObjectContext] sectionNameKeyPath: nil cacheName: @""]; 看来问题在于它试图将一个空对象加载到数组中。 我猜这意味着它没有find.sqlite文件中的对象。 这可能是这样吗? 如果是这样,我该如何开始追查为什么可能呢? 这里有一些代码,如果你需要更多,请问: 从AppDelegate.m: – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UINavigationController *nav = (UINavigationController *) self.window.rootViewController; FQQuotesTableViewController *quotesTableViewController = (FQQuotesTableViewController *) [[nav viewControllers] objectAtIndex: 0]; quotesTableViewController.managedObjectContext = self.managedObjectContext; quotesTableViewController.test = @"Hello!"; return YES; } – […]

合并到父/主上下文后,子上下文对象变空

我正在使用核心数据的multithreading应用程序。 具有讽刺意味的是,当我得知Core Data不是线程安全的时候,我认为应用程序已经接近完成了…因此,我现在添加了多上下文,而不是从Xcode模板获得的单一上下文一直工作到目前为止,真的,但是这比我所猜测的技巧更有运气) 我试图使用与父/子上下文,这将适合我想要做的,但是当我在我的子上下文中插入有效的数据/属性的有效的对象的iOS 5.0的方法,他们都成为零,或0(取决于属性types)在父上下文中。 我注意到有类似的post,但没有任何答案。 家长MOC获取来自儿童MOC的空数据的变化 NSManagedObject值是正确的,然后在从父对象到子对象NSManagedObjectContext合并更改时不正确 这里有一些代码来获得这个想法。 我有一个单独的pipe理器,用户界面用来“做东西”,然后在任务完成时使用委托或callback。 那个经理又有一个模型pipe理者来处理持久的数据pipe理,还有一些其他的comm-managers跟web / REST-API等等。 – (void) doSomeStuff:(NSString*)someParam callbackObject:(NSObject*)object onSuccess:(SEL)successSelector onFailure:(SEL)failureSelector { //Kick as an async thread since we don't want to disturb the UI dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { //Ask model manager for a nice context to work with… //NOTE; All contexts (private ones) are stored […]

撤消视图控制器中所做的所有更改

是否有可能撤消视图控制器中所做的所有更改,而不影响在其父视图控制器中所做的更改? 顺便说一句。 它们具有相同的managedObjectContext。 PS。 我有两个实体A和B. A与B具有多对多关系。视图控制器VCA用于在A中执行一些更改。视图控制器VCB用于在B中执行一些更改。VCA是VCB的父视图控制器。

逐个保存NSUndoManager事务

我不仅需要将更改保存在Core Data ,还需要保存在服务器上。 我担心的是,在我的情况下,用户可以在很短的时间内做一堆交互。 在交互之间没有足够的时间来接收从服务器返回的成功消息。 因此,要么lockingGUI,直到下一个消息返回 – 现在就是这种情况 – 或者select一种不同的方法。 我的新方法是让用户做很多交互,并将事务放到NSUndoManager提供的undo stack ,在NSManagedObjectContext启用, 但是只保存/提交接收到成功消息的事务 。 如何一次移动一个撤消“游标”,逐个提交logging,尽pipe上下文中已经包含了未经保存的更改?

部分保存managedObjectContext

我有3个事务已经在NSManagedObjectContext : A , B , C 。 他们按相同的顺序执行/添加到上下文中。 我怎样才能保存第一个A事务,但保持未保存的B , C上下文。 insert A , insert B , insert C , commit A ,.. 不幸的是NSManagedObjectContext不能commit A ,而是保存所有的事务。

如何防止temporaryContext与migratePersistentStore同时运行

我有一个代码部分,我调用migratePersistentStore ,我想阻止任何temporaryContext在同一时间做任何事情,如何? 我的想法是基于semaphore和dispatch_group 。 代码A: dispatch_group_wait(dgLoadMain, DISPATCH_TIME_FOREVER) dispatch_semaphore_wait(semaLoadMain, DISPATCH_TIME_FOREVER) mainMOC!.performBlockAndWait({ mainMOC!.persistentStoreCoordinator!.migratePersistentStore(/* … */) }) dispatch_semaphore_signal(semaLoadMain) 代码B: dispatch_group_enter(dgLoadMain) dispatch_semaphore_wait(semaLoadMain, DISPATCH_TIME_FOREVER) dispatch_semaphore_signal(semaLoadMain) let context = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) context.parentContext = mainMOC var context: NSManagedObjectContext context.performBlockAndWait({ // .. some code I do not want to run when migrating persistent store context.save(nil) }) mainMOC.performBlockAndWait({ mainMOC.save(nil) }) dispatch_group_leave(dgLoadMain) 你怎么看待这件事? 任何bette解决scheme? 在这种情况下可以使用dispatch_barrier_async吗?

如何回滚临时上下文的变化?

我创build一个像这样的temporaryContext: let temporaryContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) temporaryContext.parentContext = Utility.managedObjectContext() temporaryContext.performBlockAndWait({ // .. here I have done some changes on temporaryContext let success = temporaryContext.save(nil) //GUI get updated, GUI use MAIN context }) 我想回滚更改,所以我这样做: temporaryContext.performBlockAndWait({ temporaryContext.rollback() let success = temporaryContext.save(nil) //GUI not get restored to the default variable }) 但它没有效果,父上下文不会回滚,为什么?

核心数据上下文和单身数据控制器

我有一个单身数据控制器来保存一个对象的数组。 看看我的解决scheme香蕉问题: singelton dataController banansArray 现在我想将香蕉arrays保存到持久状态。 这个核心数据教程: 核心数据存储图像使我对Core Data有了很好的总体理解,在将我的数据Controller更改为singleton之前,我可以将它包含在我的应用程序中。 现在什么是最好的? 我是否需要将生成的核心数据堆栈在应用程序委托内移动到pipe理香蕉数组的单一数据控制器? 或者,我必须像使用Core Data模板生成的Master-View控制器那样在应用程序委托中设置单例的上下文? 在那种情况下,我如何在appDelegate中设置上下文? 这在AppDelegate应用程序didFinishLaunchingWithOptions:不起作用(它适用于模板中的masterView) didFinishLaunchingWithOptions: DataControllerSingleton *dataController; dataController.managedObjectContext = self.managedObjectContext; 在提供的beerDataModel示例中,ManagedObjectCode是: if (_mainContext == nil) { _mainContext = [[NSManagedObjectContext alloc] init]; _mainContext.persistentStoreCoordinator = [self persistentStoreCoordinator]; }

通过prepareforsegue传递ManagedObjectContext

首先, 这是我的基本设置 。 我试图从我的AppDelegate传递一个NSManagedObjectContext(MOC)到选定的自定义ViewController。 首先,在“AppDelegate.m”中,我做了: UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; FirstTableViewController *tableVC = (FirstTableViewController *)navigationController.topViewController; tableVC.managedObjectContext = self.managedObjectContext; 将MOC传递给位于navigationController和自定义ViewController之间的tableViewController。 到目前为止,这不会导致错误。 然而,在tableViewController“FirstTableViewController.m”,然后我想通过使用prepareforsegue将MOC传递到自定义ViewController: – (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"mapClicked"]) { CustomScrollViewController *customSVC = [segue destinationViewController]; NSManagedObjectContext *context = self.managedObjectContext; [customSVC setManagedObjectContext:context]; } } 然后在自定义ViewController“CustomScrollViewController.m”中调用以下方法: – (void)setManagedObjectContext:(NSManagedObjectContext *)context { self.managedObjectContext = context; } 这是卡住的地方。 它似乎执行一遍又一遍的方法,( […]