NSManagedObjectContext
全部标签 这个问题几乎涵盖了所有内容。如果我将N个block放入NSManagedObjectContext的队列中,它是否会按顺序、保证地执行它们,或者是否有可能其中一些可能被打乱? 最佳答案 我看不出NSManagedObjectContext没有理由不在内部使用GCD,而且GCD队列严格来说是FIFO。当然我没有证据证实这一点,但这对我来说非常有意义,因为performBlock的目标是线程安全,并且在给定的上下文中一次只执行一个操作,苹果为什么要打扰在功能完善的系统(GCD)已经存在的情况下从头开始编写系统。
或者可能是CoreData将保存操作拆分为几个连续的原子步骤?对于我的工作,我必须确保在崩溃后重新访问数据库时,要么所有内容都已保存,要么回滚到保存操作之前的状态。我一定不会遇到这样的情况,即一些修改后的NSObject被保存,而另一些则没有。注意:我正在使用以下SQLitepragma选项(我是否需要其他任何选项来确保原子性?):[pragmaOptionssetObject:@"FULL"forKey:@"synchronous"];[pragmaOptionssetObject:@"1"forKey:@"fullfsync"];[pragmaOptionssetObject:@"
根据WWDC2012视频“核心数据最佳实践”,dispatch_sync应该用于在上下文的performBlock中运行某种回调,创建为一种NSPrivateQueueConcurrencyType。这是为什么?我可以使用dispatch_async(dispatch_get_main_queue(),0)...在私有(private)队列上下文的performBlock中调用一些与UI相关的回调吗? 最佳答案 没有。NSPrivateQueueConcurrencyType管理它自己的内部队列,并且不喜欢你试图离开它的线程之一去做
我在MagicalRecord版本2.0.7中遇到异常每当我启动该应用程序时,它都会因以下异常而崩溃:***Assertionfailurein+[NSManagedObjectContextMR_defaultContext]我正在这样配置核心数据:在appdelegatedidFinishLaunchingWithOptions方法中:[MagicalRecordsetupCoreDataStack];在appdelegateapplicationWillTerminate中:[MagicalRecordcleanUp];我注意到仅当我尝试截断实体中的所有记录时才会发生崩溃:NSM
根据NSFetchedResultsController的苹果文档:YouuseafetchedresultscontrollertoefficientlymanagetheresultsreturnedfromaCoreDatafetchrequesttoprovidedataforaUITableViewobject.根据NSManagedObjectContext的文档:Itsprimaryresponsibilityistomanageacollectionofmanagedobjects.这两个类的目的似乎是重叠的。两者都“管理获取的托管对象”。也许措辞上的差异确实意味着什么
我有一个关于如何传递NSManagedObjectContext的问题。在我的应用程序中,似乎是我的AppDelegate处理NSManagedObjectContext,所以我不应该在我的其他ViewControllers中创建其他NSManagedObjectContexts。所以问题是...有什么惯例或聪明的方法可以做到这一点?谢谢。 最佳答案 我传递NSManagedObjectContext的方式是在您传递给它的每个ViewController中简单地拥有一个iVar。我通常修改初始化程序以包括赋值,比如这样....MyN
当我向类型为NSPrivateQueueConcurrencyType的MOC发送一个performBlock消息时,如下所示:[self.privateManagedObjectContextperformBlockAndWait:^{if([[NSThreadcurrentThread]isMainThread]){NSLog(@"executingonthemainthread!!");}…}];我发现,默认情况下,它在主线程上执行。上面代码中的条件触发,问题导航器指示执行发生在NSManagedObjectQueue中的Thread1上。这让我很费解,因为Apple告诉我们“每
[managedObjectContextrefreshAllObjects]实际上,我在保存上下文期间遇到随机错误,当我在错误后调用[managedObjectContextrefreshAllObjects]时,它允许我保存。谁能指导我了解这种方法。 最佳答案 调用refreshAllObjects会在上下文中的所有对象上调用refreshObject:mergeChanges。您可以在此处查看有关refreshObject:mergeChanges的文档:https://developer.apple.com/library/
一些开发人员已经告诉我,我可以为每个新线程创建一个新的NSManagedObjectContext实例,以使CoreData线程安全。然后我只需要处理之后的合并。对我来说,这听起来像是很多额外的代码和开销。这个解决方案不好是有原因的吗?来了:我不会为每个新线程或每个NSOperation创建一个新的MOC,而是在主线程上执行MOC更改,就像我们从UIKit中了解到的那样。我会调用-performSelectorOnMainThread:...waitUntilDone:YES并摆脱所有核心数据并发问题。优点:-不必为每个线程/NSOperation创建一个新的MOC。-不必将MOC合并
我有一个View,我从主NSManagedObjectContext中检索保存的实体(Route*)。我想将其导入tempContext。按照MarcusZarra的示例,我这样做:NSManagedObjectContext*moc=_route.managedObjectContext;NSManagedObjectID*routeId=[_routeobjectID];NSPersistentStoreCoordinator*psc=moc.persistentStoreCoordinator;self.tempContext=[[NSManagedObjectContextal