2010-06-26 4 views
4

CoreData로 첫 번째 앱 작성. 제가 안내하는 데 사용하는 책에는 다음과 같은 코드가 있습니다 :KVC/valueForKey 대 NSManagedObject 필드 액세스 - 속성이 더 좋습니까?

// 'Person' is my managed object class 
Person *newPerson = [NSEntityDescription 
    insertNewObjectForEntityForName:@"Person" 
    inManagedObjectContext:self.managedObjectContext]; 

[newPerson setValue:nameField.text forKey:@"name"]; 

이 책에는 다음과 같은 속성 스타일을 사용한다고 나와 있습니다.

newPerson.name = nameField.text; 

은 작동하지만 것이 내가 KVC의 접근 방식을 사용하는 이유 중 하나를 볼 수 없습니다, 나에게

"KVC의 접근을 코어 데이터 코드 사용을보고 매우 일반적입니다"; 매직 문자열은 런타임 오류를 간청하고 더 많은 타이핑을합니다.

내가 말했듯이, 내 습관을 배우고 싶습니다. 지금 일을하는 "iPhone Way"에 관한 것입니다.

이러한 접근 방식에는 차이점이 있으며, 대부분의 사람들이 첫 번째 KVC 접근 방식을 사용한다면 왜 ...?

+0

어떤 책을 사용하고 있습니까? – Yuji

+0

Dudney와 Adamson의 PragProg 책 – davetron5000

답변

3

대부분의 사람들은 내가 본 KVC 방식을 사용하지 않습니다. 나는 당신이 묘사하는 이유들 때문에 그렇지 않습니다.

당신의 접근을 구축 할 Mogenerator를 사용하여, 당신의 정신을 저장하려면 :

http://rentzsch.github.com/mogenerator/

그것은 몇 가지 편리한 방법으로, 당신은 CoreData 개체를 가져 오는 데 사용할 수있는 프록시 객체를 생성하는 명령 줄 도구 -하지만도 더 좋게는 데이터 모델에서 클래스를 다시 생성 할 때 자신의 메서드를 추가 할 수있는 일부 범주 오버레이는 삭제되지 않습니다.

XCode도 모델에서 데이터 객체를 생성 할 수 있지만 클래스는 더 간단합니다 (액세서리 만). mogenerator는 반복적으로 사용하기가 더 쉽습니다 (시간이 지남에 따라 모델을 많이 변경하는 경향이 있으므로 중요합니다) . 아마도 다음 XCode가 더 좋습니다.

일반적으로 모든 데이터 모델 클래스는 "DataObjects"라는 클래스 아래의 하위 디렉토리에 생성됩니다. 그런 다음 데이터 모델의 클래스를 다시 생성 할 때마다 해당 전체 디렉토리를 다시 추가하면 새로운 클래스가 생성됩니다 새 엔티티가 있음). 주어진 데이터 모델에서 현재 디렉토리에 클래스를 생성합니다

mogenerator -m ../MyProject.xcdatamodeld/MyProject-v1.xcdatamodel 

(이 경우 그냥 첫 번째 버전과 버전 모델이) : 샘플 명령 줄 실행처럼 보인다.

+0

KVC를 사용하여 관리 대상 개체의 속성을 설정하는 것은 매우 유용합니다. 예를 들어 JSON 사전을 전달하는'NSManagedObject'에 카테고리를 만들면 MO 속성이 자동으로 사전의 값으로 채워집니다. 또는'setValue : forKey'를 확장하는 카테고리를 만들지 만 이전 값과 다른 경우에만 새 값을 설정합니다. 데이터 변경을 감시하는 NSFetchedResultsControllers가 있고 tableView가 가짜 변경 사항을 지속적으로 애니 메이팅하는 것을 원하지 않으면 그 중 하나가 반드시 필요합니다. – memmons

+0

모건 생성 클래스를 사용하여 동일한 사전 입력 범주를 만들 수 있습니다. 모원 클래스는 관리 대상 개체로 수행 할 수있는 작업을 확장합니다 ... 또한 모건 템플릿을 조정하여 새 값을 설정하기 전에 비교 검사를 추가 할 수 있습니다 개인적으로 나는 모든 삽입물의 잠재적 인 오버 헤드 또는 저장 장치의 읽기가 이따금 중복 값을 저장하는 것보다 더 많은 것이라고 생각할 것입니다. –

0

name은 NSEntityDescription 속성이므로 newPerson.name은 정상입니다.

그러나 사용자 지정 엔터티에 사용자 지정 속성을 추가하면 런타임에만 알 수 있습니다. 따라서 newPerson.favouriteRestaurant은 컴파일 시간 경고를 표시합니다.

이것은 성가신 일입니다. 그것을 제거하는

한 가지 방법은 런타임 마법을 사용하는 징 할 때 여러 가지 다른 시나리오에서 잔소리 컴파일러를 중지하는 유용한 방법이 될 수

[newPerson setValue:@"Crazy Maria's" forKey:@"favouriteRestaurant"] 

이를 사용하는 것입니다.

+0

'@ interface'에'favouriteRestaurant' 속성을 추가하여 원하는 경우 컴파일러를 종료 할 수 있습니다. – Yuji

+0

엔티티에 대한 사용자 정의 클래스를 추가하면됩니까? – hooleyhoop

1

속성을 사용하면 직접 KVC 사용량보다 성능이 약간 향상됩니다. 그러나 KVC는 특히 key이 아니라 keyPath으로 작업 할 때 사용합니다.

KVC는 개체의 값을 검색하거나 동적으로 액세스 할 때도 유용합니다.

매일 사용하기 위해, 켄달은 확실히 맞습니다. 모게너를 사용하고 특성을 이용하십시오. 코드 작성이 쉬우 며 유지 관리가 쉽습니다. 그러나 KVC는 분명히 그 자리를 차지하고 매우 유용합니다.

관련 문제