有两件事我想确保我正确实现,获取托管对象,以及对托管对象的储蓄更改.
如果我想更新对象的属性,我一直这样做:
object.whatever = @"something here"; NSError *error; if (![object.managedObjectContext save:&error]) { // log the error here }
这是更新/保存对象属性的正确方法吗?是否直接访问对象的托管对象上下文保存在代码中的任何一点,或者这应该只在后台/前台进行?我当前的实现可能会在后台和前台调用它,我只是想确保这是可以接受的.
当我想获取一个对象时,我编写了一个函数,它接受一个实体名称,一个谓词数组和一个排序描述符作为参数,以便可以重用它:
NSManagedObjectContext *managedObjectContext = // I DONT KNOW WHAT TO PUT HERE! // NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]; [fetchRequest setEntity:entity]; NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates]; [fetchRequest setPredicate:compoundPredicate]; NSError *error; NSArray *fetchedRecords = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; if (error) { // log error } // if we were given a sort descriptor,sort the array appropriately if (sortDescriptor) { fetchedRecords = [fetchedRecords sortedArrayUsingDescriptors:@[sortDescriptor]]; } return fetchedRecords;
我的问题是创建/访问正确的托管对象上下文.我该怎么做?我是否在我之前创建的RKObjectManager上访问某些属性,例如:
_objectManager.managedObjectStore.mainQueueManagedObjectContext
或者这不是线程安全,因为它的主线程?我该怎么做才能确保我使用正确的托管对象上下文,并且它是线程安全的?我用的是:
_objectManager.managedObjectStore.persistentStoreManagedObjectContext
但我被告知这绝对不是最佳做法,并且不是线程安全的,所以我试图确定最佳解决方案.
编辑 – 也许我可以调用此函数来获取上下文每当我想要获取对象?
- (NSManagedObjectContext *)getManagedObjectContext { if ([NSThread isMainThread]) { return _objectManager.managedObjectStore.mainQueueManagedObjectContext; } else { return [_objectManager.managedObjectStore newChildManagedObjectContextWithConcurrencyType:NSPrivateQueueConcurrencyType tracksChanges:YES]; } }
解决方法
if (![object.managedObjectContext save:&error]) {
你应该做:
if (![object.managedObjectContext saveToPersistentStore:&error]) {
这样更改就会一直持续到磁盘存储上.您应该只在创建/获取托管对象的线程上执行此操作(因此维护MOC的线程所有权).
前景/背景并不重要,因为每个线程都使用了MOC.如果MOC线程所有权得到尊重,那么你应该没问题.
同样适用于提取.对于UI更新,您必须使用主线程和mainQueueManagedObjectContext.您永远不应该直接使用persistentStoreManagedObjectContext.对于任意后台线程,您应该要求托管对象库为您创建一个新的子托管对象上下文并使用它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。