2013-04-26 45 views
1

我的问题是关于协调核心数据对对象(包括关系)的更改的意识并将此更新发布到服务器。有没有办法清除核心数据中某些NSMangedObjects的-changedValues?

例如:

  1. 说我有一个2一对多关系的管理对象。我做了一个服务器来获取两个关系中包含的对象。对于关系A,服务器返回1个对象所属的。对于关系B,服务器返回没​​有。因此,对于A,我将JSON响应解析为NSManagedObject并将其插入到关系A中。对于B,我什么都不做。在这一点上,如果我在rel A中查询-changedValues唯一的对象,它会说relA的反函数已经改变了,因为它被插入到rel A.因为我想从服务器获取对象到代表“默认”或“最后提交”状态,我发出一个核心数据上下文保存,此时,changedValues不再反映插入。到现在为止还挺好。

  2. 接下来,我在本地(不是通过从服务器获取)创建2个对象。我在rel A(它现在有2个对象)和rel B(现在有1个对象)中插入一个。

  3. 在这一点上,我希望整个系统知道这样一个事实,即rel A中的第一个对象是在那里开始的,因此不需要做任何事情。 A中的第二个插入是新插入,因此它需要发布到服务器,第三个对象是rel B中唯一的对象,也是一个新插入,因此需要POST。

我试图查询该有用于-valueChanged结束后的适当关系[的逆评为键的值相应的关系目的实体的所有对象的上下文接近这一点。这是与这些关系的一些对象x,目前的状态是:

x.relA = <NSSet: obj1, obj2> 
x.relB = <NSSet: obj3> 

,查询基本上是

// For each relationship: 
NSError *error = nil; 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:mapping.entityName]; 
     NSArray *fetchResult = [self.context executeFetchRequest:fetchRequest error:&error]; 
    NSArray *deletedObjects = [fetchResult filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     id relationship = [evaluatedObject changedValues][<inverseOfRelationship>]; 
     return relationship && ![relationship containsObject:x]; 
    }]]; 

    NSArray *insertedObjects = [fetchResult filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
     id relationship = [evaluatedObject changedValues][<inverseOfRelationship>]; 
     return relationship && [relationship containsObject:x]; 
    }]]; 

这工作原则。但问题是,比如我首先评估rel A.我得到删除和插入列表(不包括默认情况下已存在的列表),并为这两个数组发出相应的DELETE和POST到服务器。到现在为止还挺好。但是,现在我发出coredata上下文保存,以便此关系当前状态成为“默认”状态。好。肯定...但是...保存也消除了在rel B中obj3的变化。所以,如果我现在尝试使用上面的代码来查询该关系,obj3s'changedValues将不会报告任何值,因为理论上obj3在rel中的成员资格B是默认值(自上次保存至少)。

所以我需要一种方法来为某些对象做一个选择性上下文保存(我相信这是不可能的,因为这是一个“上下文”保存而不是保存对象),或者某种方式来选择性地清除changedValues for例如,我已经使用服务器处理过的对象。

另一种方法是在ManagedObjects中插入额外更新/删除的标志,并通过我自己的代码手动处理这些标志。似乎是可行的,但有点贫民窟,因为它基本上重新调整管理对象已经在与上下文相关的标志。

任何想法或想法?

+0

你有没有考虑在你的OBJ 2加入了短暂的“脏”属性。因此,你只能上山肮脏的物体。瞬态属性不会被保存到商店中。 – 2013-04-26 22:19:29

+0

好吧,这就是我对问题的结尾提出的建议,为脏,删除等添加了一些标记......事情是,我将如何处理临时脏布尔更改为是,每当一个对象被添加到关系自动?想到的一个想法是nsmanagedobject上的一个类别,如果它中的任何关系发生变化,它会将其自己的脏布尔值设置为yes,但效率不高。 – SaldaVonSchwartz 2013-04-26 22:29:24

回答

0

您可以轻松地从iOS5及以上版本操作。

您可以使用父子关系创建多个上下文存储。当你保存一个子上下文时,它基本上被推送到父上下文。因此,对于您的示例,您将拥有一个用于RelA更改的子上下文,以及另一个子上下文用于对RelB所做的更改。

然后,您将在用于更改RelA的上下文中保存更改,然后保存父上下文。用于更改RelB的上下文不受此影响。

这篇文章有如何编写这一个极好的说明:http://www.cocoanetics.com/2012/07/multi-context-coredata/

相关问题