2010-03-24 3 views
3

내 앱에 대한 사용자 환경 설정은 NSUserDefaults에 저장됩니다. 여기에는 여러 개의 클래스에서 자주 액세스해야하는 "테마"환경 설정이 포함됩니다. 나는 "[[NSUserDefaults standardUserDefaults] objectForKey : ..."를 반복적으로 불쾌한 코드로 만들면 오버 헤드가 발생할 것이라고 생각합니다. 모든 클래스의 환경 설정에 액세스하기 위해 선호되고 가장 간결한 방법은 무엇입니까?모범 사례 - 전체적으로 환경 설정에 액세스

답변

-1

UPDATE : 그것은 가장 간결한되지 않더라도 통화 기능 [NSUserDefaults standardUserDefaults 같이, 추가적인 오버 헤드를 도입하지 않는다. 가장 간결하지 않을 수있는 유일한 시간은 복합 객체가 환경 설정에 포함되는 경우입니다. 사전이나 배열을 사용할 수 있습니다.이 경우 초기화시 로컬 변수에 할당 할 수 있습니다.

5

사용자 환경 설정에 액세스하는 가장 좋은 방법은 사용자가 취하는 방식이며, 이는 거의 어렵지 않습니다. 실제로 알아 차릴 때까지 오버 헤드를 발생 시켜서는 안됩니다.

그렇다면 시작시 사용자 환경 설정에서 테마 값을 읽은 다음 해당 테마 설정을 테마 개체에 저장하는 것이 좋습니다. 그런 다음이 테마 객체를 여러 클래스에 전달할 수 있습니다. 메소드를 호출하면 해당 객체를 사용할 수 있습니다. 보너스로, 사용자 설정에 상관없이 임의의 테마 객체를 전달할 수있게되어 결국 사용자가 볼 수있는 출력을 포함한다고 가정 할 때 테마 선택 인터페이스에서 테마 미리보기를 위해 출력물을 사용할 수있게됩니다. 고려해야 할 것.

+0

감사합니다. 나는 이것을 사용하기를 원하는 각 클래스에서 속성을 선언, 합성하는 등의 작업을 수행하기 위해 테마 객체를 사용하고 싶지 않다. 나는 단순히 가져올 수있는 환경 설정 클래스와 같은 것을 포함하는 솔루션을 원했고, 그런 것처럼 저장된 기본 설정에 액세스하면 헤더 파일에 저장된 상수에 액세스하게됩니다. 아마도 싱글 톤 클래스가 이것을 얻을 수 있을까요? – RunLoop

+2

이미 + standardUserDefaults가있는 공유 환경 설정 개체에 액세스하고 있습니다. 테마 객체는 각 클래스의 속성으로 설정하는 것이 아닙니다. 대신에 각 클래스의 출력 메소드는 - (NSAttributedString *) outputUsingTheme : (MyTheme *) aTheme와 같은 테마 객체를 인수로 취할 수 있습니다. 중앙 컨트롤러는 테마를 속성으로 저장하여 각 클래스의 출력 메서드에 전달하여 각 결과를 최종 출력에 추가하여 사용자에게 표시 할 수 있습니다. –

3

오버 헤드가 너무 작아서 전혀 문제가되지 않습니다. 나머지는 디자인과 균형에 대한 질문입니다.

@interface ClassThatUsesSomethingFromDefaults : NSObject { 
    NSUserDefaults *prefs; 
} 

@property(retain) NSUserDefaults *prefs; 

그것은 분명이 방법이 클래스의 동작이 다릅니다 것을 : 디자인의 관점에서이 문제를 해결하는 "오른쪽"방법은 클래스 인터페이스에서 출구를 노출시켜 눈에 보이는 사용자의 기본 설정에 대한 종속성을 확인하는 것입니다 사용자 기본값을 사용하는 것이 좋습니다. 또한 클래스의 기본값 ([NSUserDefaults standardUserDefaults] 대신 prefs)을 사용하는 것이 더 쉬워집니다. 클래스를 나머지 시스템과 쉽게 분리 할 수 ​​있습니다. 클래스를 기본값없이 사용할 수도 있고, 스텁 기본 객체 또는 이와 유사한 것을 제공 할 수도 있습니다.

이 솔루션의 단점은 개체를 서로 연결하는 방식을 재고해야한다는 것입니다. 정말 윗부분입니다. prefs과 같은 종속성은 인터페이스 작성기 또는 일부 종류의 팩토리 클래스 에서처럼 "외부 세계에서"개체에 제공해야합니다. (처음에 언급했듯이 균형의 문제입니다. 하나의 기본 설정 문자열이있는 경우 단일 문자열을 얻으려면이 모든 것을 빌드 할 가치가 없을 것입니다.)

싱글 톤은 이것을 해결할 수있는 악마의 방법입니다. Miško Hevery의 블로그 게시물 Singletons are Pathological Liars과 거기에서 링크 된 블로그 게시물을 읽으십시오.

+0

고마워요.하지만 무엇을 제안 하시겠습니까? 우선 클래스에 환경 설정을 할당하는 것 외에도 클래스 당 4 줄의 코드 (변수 선언, 속성 선언, 합성, 릴리스)가 필요합니다. 환경 설정을위한 지역 변수를 만드는 것이 가장 매력적인 옵션처럼 보입니다. – RunLoop