2015-01-06 3 views
2

현재 다음과 같이 CoreData Entity의 모든 속성에 하나씩 할당하고 있습니다.NSManagedObject 하위 클래스에 웹 서비스 응답 데이터 할당

employee.first_name = [responseDict valueForKey:@"first_name"]; 
employee.last_name = [responseDict valueForKey:@"last_name"]; 
employee.middle_name = [responseDict valueForKey:@"middle_name"]; 

// And So On... for say, like 100+ more attributes. 

문제 : 많은 기관이 있습니다 내가 이러한 수동 할당을 피하려고 & 소개하려고합니다.

질문 :이를 수행하는 더 똑똑한 방법이 있습니까?

희망 나는 나 자신을 분명히하고 있습니다. 필요한 정보가 있으면 알려주십시오. 당신이 경우

+0

당신은'Employee' 클래스에 사용자 정의'initWithDictionary' 방법을 추가 할 수 있지만 기본적으로해야을, 아니 그것을해야합니다 동일한 논리를 사용합니다. – Droppy

+0

많은 다른 엔티티 (직원, 부서 등) 또는 많은 다른 속성 (firstName, middleName 등) 또는 많은 다른 객체 (예 : Employee 클래스의 인스턴스)가 있습니까? 아니면 세 가지 조합? – pbasdf

+0

문제는 모든 속성에 대해 이러한 할당을 피하기 위해서입니다. 하나의 명령문으로 모든 키와 값을 삽입하는 로직과 같습니다. 희망, 나는 여기에 의미가 있습니다. – Anon

답변

2

특정 들어오는 사전 키는 관리 대상 개체의 모든 현재, 당신은 setValuesForKeysWithDictionary:

[employee setValuesForKeysWithDictionary:responseDict]; 

를 사용하여 한 번에 할당 할 수 있습니다 있습니다 그러나 나는 것에 대해 그것을 의미하는 것이 어떤. responseDict에있는 모든 키에 대해 employeesetValue:forKey:이 호출됩니다. responseDictemployee이 인식 할 수없는 키가 포함되어있는 경우 employee이 키의 키 - 값 코딩을 준수하지 않는다는 예외가 발생합니다.

확실하지 않은 경우 안전한 방법은 employeeNSManagedObject 하위 클래스를 만들고 해당 하위 클래스가 웹 서비스에서 수신 할 것으로 예상되는 속성 이름 목록을 선언하도록하는 것입니다. 예를 들어 Employee 클래스는 안쪽의 NSArray가 있다면 :

self.webServicePropertyNames = @[ @"first_name", @"last_name", @"middle_name"]; 

... 당신은 그 배열을 반복하고 모든 값을 할당 setValue:forKey를 사용하지만, 일반적인 코드를 사용할 수 있습니다.

Objective-C 런타임을 사용하여 등록 정보 이름을 employee에서 찾은 다음 responseDict에서 찾을 수 있습니다. 이것은 setValuesForKeysWithDictionary:과 같이 작동하지 않을 수 있습니다. 단, 존재하지 않는 키 값을 지정하지 않아도됩니다. 이것은 사소한 것이 아니라 I wrote up a blog post describing the process a while ago입니다.

+0

블로그 게시물을 읽는 중입니다. 유망한 해결책으로 보입니다. +1 – Anon

2

예전에 나는 약 35 개의 개체와 수백 개의 속성을 새로운 웹 API로 포팅했습니다. 내가 한 일은 다음과 같습니다 :

먼저 웹 API 엔티티와 속성 이름을 내 코어 데이터와 일치시키는 매핑 사전 (plists)을 만들었습니다. 웹 API는 코어 데이터의 예약어 인 "id" 또는 "description"과 같은 이름을 사용하기 때문에 종종 필요합니다.

데이터 형식 유효성 검사가 필요하지 않은 경우 이제 KVC를 사용하여 이와 같은 특성을 할당 할 수 있습니다.

for (NSString *key in responseDictionary.allKeys) { 
    NSString *entityKey = mappingDictionary[key]; 
    [entityInstance setValue:responseDictionary[key] forKey:entityKey]; 
} 

데이터 형식을 비교하려면 좀 더 복잡해집니다. 도움이 될 NSAttributeDescription 개의 API를 살펴보십시오. name 속성 (위 entityKey과 동일)을 포함하는 NSPropertyDescription을 상속합니다.당신은 빠른 열거하여 attributesByNameNSEntityDescription의 모든 속성이나 (관계 포함)의 모든 속성을 얻을 수 있습니다 :

NSEntityDescription *anEntity = ...; 
for (NSPropertyDescription *property in anEntity) { 
    // property is each instance of NSPropertyDescription in anEntity in turn 
} 
+0

데이터 형식 유효성 검사가 있는데 NSAttributeDescription API를 살펴 봅니다. 감사 +1 – Anon