NSPredicate状态恢复

时间:2014-05-28 13:57:33

标签: ios objective-c core-data

当我创建谓词时,我使用了一些实体

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"location IN %@", anno.locationsArray];
//locationArray contains SMLocation Entity

知道文件说明:

  

如果需要谓词的持久表示,请创建存档(NSPredicate采用NSCoding协议)。

我希望没有任何问题,但在内部时:

-(UIViewController*)application:(UIApplication *)application viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder

我打电话:

NSPredicate* predicate = [coder decodeObjectForKey:@"predicate"];

我收到了错误:

  

[SMLocation initWithCoder:]:无法识别的选择器发送到实例

因此,似乎用于创建谓词的实体,也必须采用NSCoding协议。我觉得非常不自然,尤其是实施很多很麻烦的关系。

我虽然使用像这里的ManagedObjectID(http://aplus.rs/2013/using-state-preservation-with-core-data/)保留实体,然后重新创建谓词,但在我看来,它会以非常笨拙的方式实现我的目标。

问题

是否有任何聪明的解决方法来恢复NSPredicate?

1 个答案:

答案 0 :(得分:1)

出于有限的目的,您似乎可以通过编码NSCoding来实现managedObjectID,您实际上不需要保存和恢复整个对象,只需将ID保存在编码中并从initWithCoder

返回正确的对象

类似的东西:

-(void)encodeWithCoder:(NSCoder*)coder
{
    [coder encodeObject:[self.managedObjectID URIRepresentation] forKey:@"managedObjectID"];
}

-(id)initWithCoder:(NSCoder*)coder
{
    NSURL*               url = [coder decodeObjectForKey:@"managedObjectID"];
    NSManagedObjectID*   oid = [persistentStoreCoordinator managedObjectIDForURIRepresentation:url];
    return [managedObjectContext objectWithId:oid];
}