2013-08-27 69 views
0

我想使用CoreData將一些數據保存到數據庫中,所以我創建了一個名爲'Client'的實體,並帶有一些屬性。其中兩個是'city'和'post_code',都是String類型。我還創建了擴展NSManagedObjects的Client類,並在那裏寫了一些方法。NSManagedObject setValue forKey循環在線程

-(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"]; 

有沒有人有SIM卡伊拉爾問題?

+0

嘗試一次將方法名稱'setCity:'更改爲其他值。 – Exploring

+0

我想因爲它會再次調用setter,所以它正在遞歸。 – Exploring

回答

0

setValueForKey方法正在調用回同一個函數,因爲它具有相同的名稱。

從KVC文檔的setValue

默認搜索模式:forKey:

setValue時的默認實現:forKey:被調用,使用下面的搜索模式的特性:

接收方的類將被搜索一個名稱與模式集合相匹配的訪問方法:

如果沒有找到訪問者,並且接收者的類方法accessInstanceVariablesDirectly返回YES,則接收者將按照該順序搜索名稱與模式_,_is,或者名稱相匹配的實例變量。

如果找到了匹配的存取器或實例變量,則用它來設置值。如有必要,將按照「代表非對象值」中所述從對象中提取值。

如果未找到適當的訪問者或實例變量,則會爲接收者調用setValue:forUndefinedKey:。

所以,當你調用setValue:forKey:用鑰匙city,在實現調用setCity:和你的執行需要setValue:forKey:,和團團你走。

爲什麼你這樣做,而不是直接設置值?

或更好的仍然使用屬性,你甚至不需要編寫setters或getters。

其他兩種方法的工作原理是因爲鍵名不同。 (它們有下劃線 )

+0

謝謝,我是ios新手,不知道它是如何工作的。 – Greg

+0

在這種情況下[可可核心競爭力](https://developer.apple.com/library/ios/documentation/general/conceptual/devpedia-cocoacore/KeyValueCoding.html#//apple_ref/doc/uid/TP40008195-CH25 -SW1)將對你有用。有關更詳細文檔鏈接的簡要說明。 – Abizern