Tag: nsmanagedobjectcontext

将managedObjectContext传递给UITabBarController的视图

我有一个应用程序是基于实用程序模板(您翻转视图看到另一个)。 在第一个视图中有一个login屏幕,然后翻转显示一个UITabBar风格的界面。 我无法解决如何从App Delegate(创build它的位置)一直到每个Tab Bar的视图传递managedObjectContext。 应用程序委托的managedObjectContext传递给FrontLoginViewController传递给BackViewTabBarViewController ..下一步? BackViewTabBarViewController的笔尖有一个UITabBarController,每个标签有一个UINavigationController。

将子项ManagedObjectContext所做的更改复制到实体的父级

我期望(甚至希望)这将是一个愚蠢的问题,但经过这个问题摔跤了好几个小时,我需要一些见解。 我的iOS 5.1应用程序使用嵌套的MOC(具有PrivateQueueConcurrency子MOC),将其称为MOC-Child,其父母是MainQueueConcurrency MOC,将其称为MOC-Parent。 MOC-Parent支持显示其实体的表视图。 MOC-Child被parsing器使用,该parsing器在非主线程上asynchronous运行,以创build与从URL连接parsing的XML实体描述对应的新实体,然后将新实体推送到MOC-Parent,通过保存在MOC-Child上,以表格forms显示它们。 这很好用: 1) Parser creates entity in MOC-Child 2) Parser saves MOC-Child 3) New entity is added to MOC-Parent 4) New entity is displayed in MOC-Parent's table view 但是,此提要中任何给定实体的描述可能会随时间而改变,以便它所描述的实体需要在应用中进行修改,并更新表视图中的单元格。 因此,对于Feed中的每个实体描述,parsing器都会尝试获取MOC-Child中与所描述的实体具有相同ID的实体(如果有的话),如果有人将现有实体的值与描述值进行比较,看看是否有任何改变。 当parsing器以这种方式检测到实体已被修改时,它用MOC-Child中的新值更新MOC-Child中现有实体的值,然后保存MOC-Child以将更改推送到MOC-Parent。 这是事情出错的地方。 我曾经想过,对MOC-Child中的获取实体所做的更改,如果通过保存而被推送给父项,则会简单地“出现”到MOC-Parent中的“相同”实体中。 但是,我所看到的情况是,将来自MOC-Child的已更改的实体添加到MOC-Parent, 好像它是一个完全独立的新实体 ; 结果是MOC-Parent以及它驱动的表视图对于每个被修改的实体最终有两个实体: 1) Parser modifies existing entity in MOC-Child 2) Parser saves MOC-Child 3) Modified […]

在XCode中debugging:exception断点

我正在debugging一个随机的SIGTRAP崩溃,现在只是在后台发生。 这可能是一个NSManagedObjectContext地方。 除此之外,我试图用一个exception断点来debugging它,至less可以找出它来自哪里。 唯一的问题是崩溃/断点发生在0 objc_exception_throw中,这对我没有帮助。 我回来的数据是这样的: libobjc.A.dylib`objc_exception_throw: 0x32a3a960: push {r4, r5, r6, r7, lr} // breakpoint stops here 0x32a3a962: add r7, sp, #12 0x32a3a964: mov r4, r0 0x32a3a966: movs r0, #16 0x32a3a968: blx 0x32a46854 ; symbol stub for: -[NSObject isEqual:] 所以我的问题是,我如何创build一个exception断点来提前启动? 我试图让崩溃之前发生在实际的Objective-C代码的最后一个断点。 我已经尝试编辑要共享的断点,断开抛出,然后打破捕获,并已经改变了Objective-C,C ++和“所有”之间的exceptiontypes,没有运气。 我怎样才能使更早的exception断点抛出? 除非有办法破译我发布的代码。 如果可能的话,请给我一个简短的解释它是什么意思,以及如何破译它,所以我也可以学习这样做:) 感谢大家! 如果我让程序运行… 它继续崩溃,看起来像这样: libsystem_kernel.dylib`mach_msg_trap: 0x30830ea0: mov r12, sp […]

在iOS 7上使用Private Queue Deadlocks Parent的子级上下文执行块locking和等待

我有两个名为importContext和childContext NSManagedObjectContext 。 childContext是childContext的子importContext ,它们都是NSPrivateQueueConcurrencyType 。 为了避免主线程,我在importContext的队列上做了一堆工作。 这个工作涉及到大量的提取和保存,所以将整个事件封装到importContext的performBlockAndWait:中是很importContext (因为在performBlockAndWait之后的代码依赖于它的结果, 所以需要通过同步操作)。 在这个工作的某个时候,我可能需要从JSON结果创build新的托pipe对象。 这些JSON值可能是无效的,并且我的validation失败,所以在创build对象之后,如果它们不好,我需要将它们排除。 这是childContext进来的地方。我插入我的新对象,如果它的JSON属性最终没有意义,我抛弃了childContext 。 问题来了,当我需要保存childContext 。 我期望它有自己的私人队列,从其父队列分开。 但是,这只会导致iOS 7(不是iOS 8)上的死锁。 当我在iOS 8模拟器和设备上运行相同的代码时, childContext会在单独的线程上创build自己的队列并正确保存。 看起来好像当我运行iOS 7时, childContext试图save:在父队列中,但是父母正在等待其导致死锁的孩子。 在iOS 8中,这不会发生。 有谁知道为什么? 这是简化的代码: -(NSManagedObjectContext *)importContext { NSManagedObjectContext* moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; moc.persistentStoreCoordinator = [self storeCoordinator]; return moc; } -(void)updateItems:(NSArray*)ItemDescriptions { [self.importContext performBlockAndWait:^{ //get info and update … […]

无法将NSManagedObjectContext传递给我的视图控制器

好的,我可能会在这里头,但怀疑我错过了一些非常基本的东西。 我已经在堆栈和其他论坛上寻找帮助寻找解决scheme。 我尝试了所有我find的解决scheme,但没有为我的情况工作,我看不到我失踪。 我已经创build了一个CoreData应用程序。 在我的appDelegate中使用NSManagedObjectContext读取和写入数据到CoreData存储的所有工作都很好。 我已经检查,看看是否NSManagedObjectContext设置在我的AppDelegate,它是。 传递给我唯一的viewController后,我检查它是否设置,它不是。 所以这显然是我的问题。 我已经尝试了一切,无法摸索解决方法,现在累了,想要去睡觉。 我对iOS很新,所以我相信这是根本。 这是我的代码,因为它代表。 AppDelegate.m #import "AppDelegate.h" #import "ViewController.h" #import "Recipe.h" @interface AppDelegate() @property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; @property (nonatomic, strong) NSManagedObjectModel *managedObjectModel; @property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (nonatomic, strong) ViewController *viewController; @end @implementation AppDelegate @synthesize managedObjectModel, managedObjectContext, persistentStoreCoordinator, viewController; @synthesize window = _window; – (BOOL)application:(UIApplication *)application […]

如何在托pipe对象上下文保存时避免UI冻结?

我想实现一个响应UI的下载和parsing大型数据集,并使用Core Data进行保存。 我的设置: 我在自定义视图控制器中显示下载的内容。 我不使用NSFetchedResultsController。 有3个MOC: masterMOC(负责保存到磁盘,NSPrivateQueueConcurrencyType) mainMOC(由UI使用,NSMainQueueConcurrencyType是masterMOC的子项) backgroundMOC(负责从JSON导入,在一个单独的线程中创build,masterMOC的一个子节点) 我正在批量导入 – 我按以下方式每50个项目进行MOC储存: NSError *error; [backgroundMOC save:&error]; NSManagedObjectContext *masterMOC = backgroundMOC.parentContext; //set during initialization [masterMOC performBlock:^{ NSError *parentContextError = nil; [masterMOC save:&parentContextError]; }]; 我希望在主MOC被保存后,主MOC中的变化。 如果在masterMOC正在保存时尝试访问某个随机pipe理对象的某个关系(保存需要一些时间),则UI将挂起,直到保存完成。 问题 :如何在masterMOC保存时避免UI冻结?

合并后台线程更新后,NSFetchedResultsController不会触发委托方法

我有一个NSFetchedResultsController和一些操作,通过NSOperationQueue在单独的线程上插入和更新托pipe对象。 FRC看起来像这样,请注意,我已将caching设置为零: [NSFetchedResultsController deleteCacheWithName:nil]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 每个线程操作都有自己的托pipe对象上下文,并在每次保存更改时触发mergeChangesFromContextDidSaveNotification到主MOC。 我用来合并上下文的代码如下所示: – (void)mergeContextChanges:(NSNotification *)notification { NSManagedObjectContext *context = [fetchedResultsController managedObjectContext]; if([NSThread isMainThread] == NO) { [self performSelectorOnMainThread:_cmd withObject:notification waitUntilDone:NO]; return; } NSSet *updated = [[notification userInfo] objectForKey:NSUpdatedObjectsKey]; for(NSManagedObject *thing in updated) { NSLog(@"Background thread updated %@", [thing description]); } for(NSManagedObject *thing […]

核心数据多级父 – 子上下文

在我的应用程序中,我有UITableViewController显示事件列表。 该控制器使用ManagedObjectContext说ParentContext 。 现在,如果select了任何事件,则会显示详细的视图控制器,用户可以在其中编辑事件的详细信息。 所以我创build了一个小孩的上下文说, ChildContext with type "NSPrivateQueueConcurrencyType" ChildContext whose parent Context is "ParentContext". 我的代码是: NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; childContext.parentContext = self.context ; 现在又有一些领域和关系需要再次深入研究。 所以我为新的视图控制器创build了另一个ChildContext说, GrandChildContext with type "NSPrivateQueueConcurrencyType" GrandChildContext whose parent context is "ChildContext" 这个过程进行到另一个级别(从父级(tableView)到子级总共4级) self.context – Parent Context | | ChildContext | | GrandChildContext | | GrandGrandChildContext 我的实体看起来像这样 EntityA — […]

NSManagedObjectContext保存性能显着降低

当它试图从服务器发送的数据构build初始数据库时,我遇到了基于CoreData的iOS应用程序的问题。 基本上,服务器发送1MB大小的对象(每块大约3000个),iOS客户端将它们反序列化并将它们写入磁盘。 我所看到的是,前面的8个区块(44个区块)一切都很顺利,然后性能急剧下降,每个区块开始花费越来越长的时间,如下图所示。 几乎所有的时间都在[NSManagedObjectContext save]被使用,就像你在Instruments分析数据中看到的一样,但是由于某种原因,它似乎已经不在100%的CPU上运行,就像它正在等待磁盘I / O或者其他的东西。 关于我如何做这件事的一些重要事实: 每个块在自己的NSManagedObjectContext都有自己的NSAutoreleasePool ,因此在处理块之间没有对象build立在非刷新的上下文中。 在任何上下文中都没有设置NSUndoManager 。 没有mergeChangesFromContextDidSaveNotification:继续(即块的上下文没有把他们的变化推到“主”的上下文) 我在iOS 4.3上使用基于SQLite的数据存储。 正在写入的logging确实有索引。 整个同步作业在单个GCD后台线程(即dispatch_queue_create()和dispatch_async() )上处理。 我不知道为什么表演突然脱落,或者可以做些什么来解决这个问题。 我捅了一下,看了下面的内容,但是还没有什么可以跳出来的: http://cocoawithlove.com/2008/03/testing-core-data-with-very-big.html 保存ManagedObjectContext的性能取决于包含的(不变的)对象的数量? 任何想法或指针,使这个应用程序扩展到数据库100,000logging将不胜感激。 编辑 – 额外统计 这个Instruments图表显示了与上面相同的模拟(在iPad2上),但包括了磁盘活动统计信息,您可以很清楚地看到,所有“不在100%CPU”运行的时间似乎都被写入磁盘。 我也跑在iOS模拟器上运行相同的同步尝试。 除了包含对象ID的字典(随着时间的推移略微增长(但这些不是CoreData对象或任何会影响保存的对象,它们只是NSNumbers)),每个块的总体内存使用量或多或less是不变的。 这个字典与整个堆相比是less量的内存,所以问题不是内存不足。 这个testing的有趣之处在于CoreData Save工具报告连续保存的时间大致相同,这显然与第一组结果中的CPU分析信息冲突。 似乎CoreData认为将更改推送到数据库需要花费相同的时间,但数据库本身(即SQLite)突然花费很多时间才能将这些更改实际传输到磁盘。

在多个选项卡中使用相同的NSManagedObjectContext

我有一个标签栏控制器与不同的视图控制器都使用相同的pipe理对象上下文,设置如下: – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { RootViewController *rootVC = [[RootViewController alloc] initWithStyle:UITableViewStyleGrouped]; rootViewController.managedObjectContext = self.managedObjectContext; UINavigationController *rootNavCon = [[UINavigationController alloc] initWithRootViewController:rootVC]; [rootVC release]; SettingsTableViewController *settingsVC = [[SettingsTableViewController alloc] initWithStyle:UITableViewStyleGrouped]; settingsVC.managedObjectContext = self.managedObjectContext; UINavigationController *settingsNavCon = [[UINavigationController alloc] initWithRootViewController:settingsVC]; [settingsVC release]; tabBarController = [[UITabBarController alloc] init]; NSArray *controllers = [NSArray arrayWithObjects:rootNavCon, settingsNavCon, nil]; tabBarController.viewControllers = […]