NSManagedObject setValue forKey在线程中循环

时间:2013-08-27 14:58:25

标签: ios loops core-data nsmanagedobject

我正在尝试使用CoreData将一些数据保存到数据库中,因此我使用一些属性创建了名为“Client”的实体。其中两个是'city'和'post_code',两者都是String类型。我还创建了扩展NSManagedObjects的Client类,并在那里编写了一些方法。

-(void) setCity: (NSString*) city
{
    [self setValue:city forKey:@"city"];
}

-(NSString*) getCity
{
    return [self valueForKey:@"city"];
}

-(void) setPostCode: (NSString*) postCode
{
    [self setValue:postCode forKey:@"post_code"];
}

-(NSString*) getPostCode
{
    return [self valueForKey:@"post_code"];
}

getPostCode和setPostCode按预期工作,但调用setCity或getCity会导致问题。应用程序停止,方法在线程中循环,如屏幕截图所示。

enter image description here

Full size image

这就是我称之为那些方法的方法

 if([databaseResult count] > 0)
     c = [databaseResult objectAtIndex:0];
 else
     c = [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:context];

[c setPostCode:[jsonData valueForKey:@"post_code_invoice"]];
[c setClientType:[jsonData valueForKey:@"company_type"]];
[c setCity:[jsonData valueForKey:@"city_invoice"]];

无论我在那里传递什么数据,它总是在setCity上停止,即使该调用不起作用

[c setCity:@"aaa"];

有没有人有类似的问题?

1 个答案:

答案 0 :(得分:0)

setValueForKey方法正在回调同一个函数,因为它具有相同的名称。

来自KVC文档

  

setValue的默认搜索模式:forKey:

     

当为属性调用setValue:forKey:的默认实现时,使用以下搜索模式:

     

在接收者的类中搜索名称与模式集匹配的访问者方法:。

     

如果没有找到访问者,并且接收者的类方法accessInstanceVariablesDirectly返回YES,则在接收者中搜索其名称与模式_,_is,或者按顺序匹配的实例变量。

     

如果找到匹配的访问者或实例变量,则用于设置值。如有必要,将从对象中提取值,如“表示非对象值”中所述。

     

如果找不到合适的访问者或实例变量,则为接收者调用setValue:forUndefinedKey:。

因此,当您使用密钥setValue:forKey:致电city时,实施方案会调用setCity:并执行您的实施电话setValue:forKey:,然后四处转动。

为什么你这样做而不是直接设置值?

或者更好的是仍然使用属性,甚至不需要编写setter或getter。

其他两种方法有效,因为键名不同。 (他们有下划线 )