2011-09-12 3 views
2

내 모델 개체가 SQLite 데이터베이스에서 지연로드됩니다. 이유를 묻지 말고 코드에서 QuickLite을 사용하여 개체를 채 웁니다. 즉, 처음으로 접근자가 사용되기 전에 일부 정리 작업을 수행해야합니다. @ synthesize'd 접근 자 이전에 작업을 수행하는 방법은 무엇입니까?

나는 단순히 필요한 경우 DB에서 개체를 채우기 위해 사람들이 방법을 과부하 수 있도록 valueForKey:setValue:forKey:가의 @synthesize 'D 접근에 의해 호출 될 것이라고 순진하게 생각했다. 불행히도 작동하지 않습니다. '접근자는 명시된 값을 가져 오거나 설정하는 데 KVC를 사용하지 않습니다.

질문 : 따라서 모든 getters/setters를 직접 작성하지 않고 @property에 액세스하기 전에 코드를 호출하는 방법이 있습니까?

답변

1

모델 개체가 NSManagedObject의 하위 클래스 인 경우 접근자는 KVC를 사용합니다 (속성을 선언 한 다음 .m 파일에서 '@synthesize'대신 '@dynamic'을 사용하여 접근자를 나타냄). 다른 코드로 처리).

기본적으로 핵심 데이터에서 오류 동작을 다시 구현하는 것처럼 들립니다.

귀하의 의견을 기반으로, 내가 이것을 할 수있는 유일한 방법은 귀하의 실제 개체를 포함하는 일종의 프록시 개체를 갖는 것입니다. 그래서 프록시 객체는 실제 객체 인 하나의 visible 속성을 가지며, 접근 자에서이 특정 객체에 대한 데이터베이스로 이동했는지 확인합니다. 그렇지 않으면 가사 작업을 수행합니다. .

그래서, 통화가 proxyObject 내

NSString *someProperty = proxyObject.realObject.someProperty; 

될 것 realObject에 대한 접근이 수동으로 접근을 작성하거나 핵심 데이터 마이그레이션보다 더 많거나 적은 노력 여부

if (beenToTheDatabase) 
    return realObject; 
else 
{ 
    // Do your business 
    beenToTheDatabase = YES; 
    return realObject; 
} 

, 나는 모른다.

+0

나는 그것을하고 싶습니다. 그리고 앱의 다음 주요 릴리즈에서 그렇게 할 것입니다.하지만 지금 당장의 문제는 제가 레거시 코드를 다루고 있으며, 리팩토링하지 않으려 고합니다. 쪽으로. 핵심 데이터 경로를 사용하지 않고 이런 종류의 동작을 얻는 방법에 대한 아이디어가 있습니까? – DaGaMs

+0

업데이트 된 답변에 반쯤 구운 아이디어. – jrturton

+0

고마워, 그건 흥미로운 해킹이야 ... 내가 그 길을 갈 것이라는 것을 확신하지는 않지만 내 질문에 대한 유효한 대답이다. – DaGaMs

관련 문제