2009-10-05 2 views
2

이것은 Objective-J/Cappuccino에 대한 질문이지만 프레임 워크가 매우 유사하므로 코코아 태그를 추가했습니다.CoreData없이 역 관계 관리

카푸치노의 단점 중 하나는 CoreData가 아직 포팅되지 않았기 때문에 모든 모델 객체를 수동으로 만들어야한다는 것입니다.

CoreData에서 역 관계가 자동으로 관리됩니다 ... 다른 개체의 다기구 관계에 개체를 추가하면 두 방향으로 그래프를 탐색 할 수 있습니다.

CoreData가 없으면 이러한 반비례 관계를 자동으로 설정할 수있는 명확한 방법이 있습니까?

보다 구체적인 예로, 일반적인 Department 및 Employees 예제를 살펴 보겠습니다. 레일 용어를 사용하기 위해 Department 객체에는 많은 Employees가 있고 Employee는 Department에 속합니다.

그래서 우리 부서 모델에는 NSMutableSet (또는 CPMutableSet) "employees"세트가 있고 Employee 모델에는 해당 부서 모델을 다시 가리키는 변수 "department"가 있습니다.

새로운 Employee 모델을 세트에 추가 할 때 반비례 관계 (employee.department)가 자동으로 설정되도록하는 쉬운 방법이 있습니까? 또는 그 반대의 경우 : 직원의 부서 모델을 설정하면 해당 부서의 직원 세트에 자동으로 추가됩니다.

오른쪽 저는 모든 모델 하위 클래스 인 "ValidatedModel"객체를 만들고 있습니다. KVO를 사용하여 역 관계를 설정하는 몇 가지 메서드를 추가합니다. 그러나 나는 무의미한 일을 많이하고 있으며, 이미이 일을하는 더 쉬운 방법이 있음을 두려워합니다.

누군가 내 걱정거리를 풀 수 있습니까?

답변

2

Objective-J에 대해 구체적으로 말할 수는 없지만 코어 데이터없이 이것을 수행하는 일반적인 방법은 설정자에 역관계를 설정하는 것입니다. 그래서, 직원/부서 예제를 사용하여, 당신은 같은 것을 할 것입니다 :

- (void)setDepartment:(Department *)aDepartment { 
    if (department == aDepartment) 
     return; 

    [department release]; 
    department = [aDepartment retain]; 

    [department addEmployee:self]; 
} 

당신은 새로운 값이 이미 기존의 값과 일치하는 경우 인스턴스 변수를 업데이트하지 있는지 확인해야합니다. 그렇지 않은 경우 setDepartment:addEmployee:으로 전화하고 addEmployee:setDepartment:을 무한 루프로 호출합니다.

또한 보관주기에 대한 공개 초대입니다. 그것은 당신의 모델이 어떻게 구조화되어 있느냐에 달려 있지만, 다른 하나를 "소유"하는 것은 retain이어야합니다. 그래서 나의 예는 아마 부서가 직원을 "소유하고있다"고 말하는 것이 더 정확하기 때문에 아마 최고가 아닐 수도 있습니다.

+0

고마워요, 기본적으로 제가하고있는 일입니다. (KVO를 사용하여 양쪽이 바뀌면 트리거하고 다른 하나를 추가하는 것을 제외하고) 그래서 나는 올바른 길을 가고있는 것 같습니다. –

+0

그게 당신이하는 일이라면, 당신은 올바른 길을 가고 있습니다. 나는 내 접근 방식이 KVO를 수행하는 오버 헤드 때문에 조금 더 쉬울 것이라고 생각하지만 어느 쪽이든 제대로 작동해야합니다. – Alex

+0

KVO를 사용하는 주된 이유는 생성 된 접근자를 수정하지 않기 위해서입니다. 대신 내 init 메서드에서 관계 유형, 사용할 속성 및 역 관계 속성을 설명하는 메서드를 호출합니다. 이렇게하면 옵저버 등이 자동으로 설정됩니다. 모든 코드가 작동 한 후에 코드를 공유합니다. –

2

아마도 세터에서 관계를 설정하고 싶을 것입니다. 당신의 예제를 사용하여 Objective-J 코드는 이와 비슷하게 보일 것입니다.

- (void)setDepartment:(Department)aDepartment { 
    if (department === aDepartment) 
     return; 

    [department addEmployee:self]; 
} 

보시다시피 보존/해제 할 필요가 없습니다. Objective-J는 가비지 수집되는 자바 스크립트를 기반으로합니다.모든 메모리 관리 방법을 실시하지만이 유형 평등에 대한 자세한 내용은 유형 평등 (===)를 확인하기 위해 일반적으로 권할 자바 스크립트이기 때문에 또한

(코드의 혼란에서 떨어져) 아무것도하지 않고있다가 참조 : http://www.webreference.com/js/column26/stricteq.html

+0

예, 유지/해제에 대해 걱정할 필요가 없다는 것이 좋습니다. 유형 평등을 염두에 두겠습니다. 감사합니다. –

2

이 280 명의 북한 직원으로부터 카푸치노 확장 프로그램을 확인하십시오 : http://github.com/nciagra/Cappuccino-Extensions

ActiveRecord 포트가 포함되어 있습니다. 나는 아직까지 이걸 보지 못했지만 너를 도울지도 모른다.

  • 요하네스
+0

매우 시원하게 보입니다. 그 이상을 탐험해야합니다. 내가 잘못 생각하지 않는다면, 서버 측에서 대부분의 유효성 검사 등을 담당한다고 생각합니다. 물론 그렇게하는 것이 중요하지만 사용자에게 빠른 경험을주기 위해 클라이언트 측 유효성 검사를 수행하는 것이 중요하다고 생각합니다. –