2009-03-11 8 views
2

나는 지금 내 벨트 아래에 몇 가지 애플 리케이션을 가지고 있지만, 난 여전히 비교적 새로운거야. 내가 아는 사람이라면 모범 사례 조언이나 심지어 인식하지 못했던 코코아 터치 프레임 워크의 기능을 찾고 있습니다.iPhone 응용 프로그램에서 어떻게 도메인 객체를 처리합니까?

첫 번째 응용 프로그램에서 응용 프로그램 대리인에 도메인 개체를 만든 다음 필요에 따라이를 내 ViewController에 전달했습니다. 예를 들어 App Delegate에서 메모리에서 사용자의 계정을로드하려고 시도하고 거기에 있었다면 initWithCoder를 사용하여 Account 객체를 만들 수 있습니다. 그런 다음 Account 개체가 필요한 ViewController를 인스턴스화 할 때마다 자체 계정 속성이있는 ViewController로 전달합니다.

그러나 내 애플 리케이션에 코드가 너무 많아서 내 ApplicationDelegate가 내 도메인 객체를 관리하도록 결정했습니다. ViewController가 필요할 때마다 다음과 같이 ApplicationDelegate에 질의합니다.

MyAppDelegate* myAppDelegate = [UIApplication sharedApplication].delegate; 
ADomainObject* anObject = myAppDelegate.anObject; 

이것은 미친 짓입니까? 좋은 생각입니까? 나는 내 자신으로 그것을 완전히 만들었으므로 나는 더 나은 것이 있는지 궁금해하고있다. 나는 dev에 익숙하지 않기 때문에 일을하는 가장 좋은 방법을 배우려고 노력하고 있습니다 ...

답변

2

설명 된 내용이 작동합니다. 필자는 데스크톱에서 핵심 데이터를 처리 할 때 동일한 전략을 사용했습니다. 여기서 응용 프로그램 컨트롤러가 소유 한 단일 관리 객체 컨텍스트가 내 응용 프로그램에 있습니다. Alex가 언급 한 것처럼 싱글 톤 외에 다른 일반적인 전략은 도메인 객체를로드하고 관리하는 논리를 처리하는 "데이터 컨트롤러"를 구현하는 것입니다. 이 경우 응용 프로그램 컨트롤러는 데이터 컨트롤러와 뷰 컨트롤러 간의 관계를 초기화하고 관리해야하지만 모델 개체 관련 코드가 복잡하지는 않습니다.

2

아니요, 나쁜 디자인이 아닙니다. Singleton 패턴을 대안으로 사용하거나 App Delegate 아이디어를 보완 할 가능성이 있습니다. 객체를 얻으려면

[ADomainObject sharedDomainObject] 

과 같은 것을 쓸 수 있습니다. 클래스 메소드는 단일 문서 응용 프로그램에서 도메인 객체를 얻는 좋은 방법이기도합니다. 모든 iPhone 응용 프로그램은 단일 문서이므로 예를 들어 계층 구조가 Folder 인 경우 특정 개체 그룹을 얻으려면 + (NSArray *)rootFolders 또는 + (NSArray *)allEmptyFolders과 같은 클래스 메서드가있을 수 있습니다.

+0

흥미롭지 만 모든 도메인 개체가 싱글 톤에 적합하지는 않습니다. 예를 들어, Domain Objects 모음입니다. 이 경우에도 Collection 클래스에 대한 Category를 만들 수 있다고 생각합니까? "단일 문서"응용 프로그램이 의미하는 바를 명확히 생각해보십시오. – bpapa

+1

컬렉션에 대한 접근자를 해당 도메인 객체 클래스의 클래스 메서드로 구현할 수 있습니다. 그들이 카테고리에 살고 있는지 여부는 당신에게 달려 있습니다. 바탕 화면에서 여러 파일에 대해 여러 개의 창을 가질 수 있습니다. 이것은 iPhone에는 적용되지 않지만 NSDocument에 관심있는 아이디어가 있습니다. – Alex

+1

Appkit 기반의 Cocoa 응용 프로그램은 "문서 기반"또는 "단일 창"(일명 "단일 문서") 응용 프로그램 인 경우가 많으므로 한 번에 하나의 문서 만 열거 나 여러 문서를 열 수 있습니다 . Alex가 말하는 것은 iPhone 앱이 후자와 더 비슷하다는 것입니다. – erikprice

1

내가 한 Cocoa 이외의 응용 프로그램 개발에서 객체가 종속성 객체 (이 경우 도메인 객체)를 외부에서 가져 오는 DI 접근 방식을 사용하는 것이 유용하다는 것을 알았습니다. 밖으로 도달하고 명시 적으로 요청하는 것보다 "명시 적으로 요청하는 것"은 현재 수행중인 작업의 일부를 의미합니다. 응용 프로그램 대리인의 속성을 통해 액세스 할 수 있습니다. ViewController가 명시 적으로 요청할 필요가 없도록 ViewController와 도메인 객체 간의 연결을 어떤 방식으로 만들 수 있는지 여부가 쉽고/어리석은가요? 예를 들어 펜촉에 이러한 관계를 설정하는 방법이 있습니까? 나는 코코아에 대한 전문 지식이 없으므로 조언하지 않고 묻습니다. (이 질문에 피기 백하지만 유감스럽게도 원래 질문과 관련이 있습니다.)

+0

저는 주로 Java 녀석이자 Spring Framework의 큰 팬이므로 DI에 대해 매우 잘 알고 있습니다 ... 여기에서 나의 접근 방식에 대해 다소 차이가 있습니다. 당신은 정확하지만 내 ViewController는 이제 App Delegate에 종속됩니다. – bpapa

1

애플 리케이션 델리게이트가 전혀 필요 없습니다. View Controller는 해당 객체를 사용하는 컨트롤러가 하나 뿐인 경우 모델 객체를 인스턴스화하고 소유합니다. 그렇지 않으면 + [DatabaseModel sharedDatabaseModel] 메서드를 사용하여 클래스 수준 메서드를 사용하여 모델의 정적 인스턴스를 검색합니다.

관련 문제