2012-03-13 3 views
4

값을 설정하기 전에 NSEntityDescription 키가 있는지 확인해야합니다. JSON의 데이터 사전을 가지고 있으며 객체에 존재하지 않는 키를 설정하려고하지 않습니다.NSEntityDescription 키가 있는지 확인하십시오.

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]]; 
for (id key in dict) { 
    // Check if the key exists here before setting the value so we don't error out. 
     [appointmentObject setValue:[dict objectForKey:key] forKey:key]; 
} 

답변

12

선택자를 확인하지 않아야합니다. entity 또는 managedObjectContext이라는 키를 상상해보십시오. NSManagedObject 클래스는 확실히 그 셀렉터에 응답하지만, 뭔가 잘못 지정하려고하면 일어날 수있는 가장 좋은 일은 코드가 즉시 충돌하는 것입니다. 조금 덜 행운과 같은 뭔가가 전체 코어 데이터 파일 및 모든 사용자 데이터를 파괴합니다.

NSEntityDescription에는 attributesByName이라는 메서드가 있으며 사용자의 특성 이름과 그에 해당하는 NSAttributeDescriptions의 사전을 반환합니다. 따라서 이러한 키는 기본적으로 사용할 수있는 모든 속성입니다. 이 같은

뭔가 작업을해야합니다 :

Appointment *appointmentObject = [NSEntityDescription insertNewObjectForEntityForName:@"Appointments" inManagedObjectContext:[[DataManager sharedInstance] managedObjectContext]]; 
NSArray *availableKeys = [[appointmentObject.entity attributesByName] allKeys]; 
for (id key in dict) { 
    if ([availableKeys containsObject:key]) { 
     // Check if the key exists here before setting the value so we don't error out. 
     [appointmentObject setValue:[dict objectForKey:key] forKey:key]; 
    } 
} 
+0

당신은 아주 좋은 지적을했습니다! JSON 응답을 사용하여 키를 제공하기 때문에 일반 선택자에 응답하는 키를 가질 수 있습니다. – Bot

+1

왜 누군가는 이것을 downvote 했습니까? – Bot

-1

저는 여러분이 약속 객체가 속성에 응답하는지 확인하고 싶습니다. 이 경우 :

if([appointmentObject respondsToSelector:NSSelectorFromString(key)])... 

게터에 해당하는 것은 propertyName입니다. 해당 setter는 setPropertyName입니다.

+0

이'respondsToSelector과 동일합니다 :'(키) @selector? 그렇다면 나는 그것을 시도하고 그것은 작동하지 않았다. – Bot

+0

은 키 문자열 또는 다른 유형의 객체입니까? 나는 그것이 문자열이라고 생각했다. – Gobot

+0

모든'@ property'는'NSNumber'를 제외하고는'NSString'이지만,'Appointment' 클래스에없는 키를 만나면 에러가납니다. – Bot

5

확인이,

BOOL hasFoo = [[myObject.entity propertiesByName] objectForKey:@"foo"] != nil;

+1

좋아요! 확인하는 아주 우아한 방법. – mpemburn

관련 문제