2012-09-17 3 views
1

개발중인 앱에 10 개의 컨트롤러가 있습니다. 5 대의 컨트롤러에 화면 설정에서 몇 가지 상태 정보를 공유하고 싶었습니다. 아래 옵션 중에서 가장 좋은 전략은 무엇입니까?iOS 앱에서 데이터를 공유하는 방법은 무엇입니까?

  1. NSUserdefaults를 사용하여 상태 정보를 저장하고 사용하십시오.
  2. AppDelegate에 인스턴스의 상태 정보를 저장하고 상태 정보를 유지하기 위해 싱글 인스턴스를 사용 relavent 컨트롤러
  3. 에서 사용하고 relavent 컨트롤러 하나가 더 나은 것

에 그것을 사용하고 계십니까? 다른 옵션이 있는지 알려주세요.

답변

2

NSUserDefaults 솔루션은 값이 실제로 실제로 자연스럽게 끝나기 만하면 나쁜 것이 아닙니다. 확실히 forget about the singleton idea, 별도의 싱글 톤 클래스 또는 앱 델리게이트 일 수 있습니다.


컨트롤러 간의 커플 링을 줄이는 또 다른 가능성이 있습니다. 대신 개별 컨트롤러의 속성으로 필요한 설정을 속성으로 설정을 노출 것 하나 개 특정 클래스에 의존해야의 :

@interface Controller : UIViewController 
@property(assign) NSUInteger logLevel; // a sample setting 
@end 

그러던 어느 별도의 클래스를 만드는 돌볼 것이라고 (의이 Factory를 호출하자) 컨트롤러. 공장은 모든 설정을 기록하고 컨트롤러에 필요한 설정을 전달합니다. (공장 접근 방식을 보여주는 sample Xcode project on GitHub이 있지만 지금은이 특정 문제의 예는 포함되어 있지 않습니다.)

이 솔루션의 장점은 느슨한 결합입니다. 추가 객체는 필요 없습니다 (앱 대리인 , NSUserDefaults 인스턴스 또는 일부 Settings 클래스 인스턴스)를 사용하여 컨트롤러의 동작을 조정할 수 있습니다. 단점은보다 자세한 컨트롤러 API입니다. 이 방법을 선택할지 여부는 설정의 특성에 따라 다릅니다.

물론 하이브리드 솔루션을 제안 할 수도 있습니다. 모든 설정을 유지하고 좋은 API (더 이상 -objectForKey: 호출)를 사용하지 않고 Settings 클래스를 만들고 모든 컨트롤러에 Settings 개체에 대한 포인터를 공유하십시오. 싱글 톤이 필요하지 않습니다. 위의 링크 된 GitHub 샘플 코드를 참조하십시오. 이는 더 단단한 결합을 의미하지만 인터페이스에서 덜 자세한 정보를 의미합니다.

+0

스토리 보드 기반 앱에서 어떻게 이러한 접근 방식을 유지 하시겠습니까? 저는 주 (state)를 잡고 컨트롤러를 통해 공유 할 중앙 집중식 수업을 갖고 싶습니다. 이 클래스를 컨트롤러에서 느리게 초기화하고 관심 세그먼트 (관심사) (다른 컨트롤러)를 통해 전달해야합니까? 그게 낫지 않을까? –

+0

죄송합니다, 좋은 생각이 없습니다. 저는 여전히 UI 플로우를 손으로 연결합니다. 그 이유 중 하나는 프로세스를보다 잘 제어 할 수 있다는 것입니다. – zoul