gpt4 book ai didi

ios - RestKit 和托管对象上下文

转载 作者:可可西里 更新时间:2023-11-01 04:38:59 26 4
gpt4 key购买 nike

我正在尝试以最佳方式格式化我的项目对 RestKit 和 Core Data 的使用。有几件事我已经开始工作了,但我感觉它们实现得很差,而且可能线程不安全……我有一个对象来管理我所有的数据传输、存储等,它有一个功能设置restkit。我有一个用于 RKObjectManager 的实例变量,在这个设置函数中,我创建了 objectStore,设置了所有属性映射,创建了持久存储,等等——所有正常的 restkit 设置代码。在该函数之外,该对象唯一可用的是 _objectManager 实例变量,我一直将其用于 NSFetchRequests 等。

有两件事我想确保我正确实现,获取托管对象,以及保存对托管对象的更改。

如果我想更新对象的属性,我一直在这样做:

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。对于任意后台线程,您应该要求托管对象存储为您创建一个新的子托管对象上下文并使用它。

关于ios - RestKit 和托管对象上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23348658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com