2012-02-12 2 views
36

JSON API에서 리소스를 가져 오는 앱을 지금 개발하고 있습니다. iOS 앱에 상수를 저장하는 가장 좋은 곳은 어디입니까?

모든 리소스

는 동일한 기본 URL이 있습니다

나는 그것이 자원 URL을 작성할 때 약간의 중복을 제거, 내 컨트롤러와 모델 모두에 사용할 수 있도록 http://api.mysite.com/ 문자열을 저장할
http://api.mysite.com/resources.json 
http://api.mysite.com/other_resources.json 

.

어디에서이 작업을 수행 할 수 있습니까? -prefix.pch 파일?

은 어떤 조언을 나는 싱글을 만들거나 AppDelegate에 사용하고 거기에 상수를 넣어 것

답변

64

나는 중요한 추가와 알렉스 코플란의 대답에 동의합니다.

가 (당신이 원하는/E 또는 W) "Constants.h"라는 이름의 파일에 모든 상수를 넣어

는 편집 :

내가 3 년 전에이 질문에 대답
  • , 나는에 있었다 #define 악 대차, 아래에서 수정 버전을 확인하십시오.

Constants.h

#define kFilterDate @"date" 
#define kFilterRadius @"radius" 
#define kFilterSort @"sort" 

//Global Strings 
#define kDividingString @"/" 

//Strings 
#define kTour @"Tour" 
#define kToursKey @"tours" 

당신의 모든 헤더 프로젝트를 통해 자동으로 가져올 수 있도록하지만 그 대신 당신이 그것을 필요로하는 어떤 파일을 가져 오는, 당신의 접두사 파일에서 가져옵니다.

Project_Prefix.pch

// 
// Prefix header for all source files of the project 
// 

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
    #import "Constants.h" 
#endif 

개정

이전의 모든 정보가 여전히 작동 모든하지만

, 우리는 조금 더 안전한 우리의 상수에 대한 일을 할 수있는 몇 가지가 있습니다.

이 여전히 위처럼 접두사 파일로 가져올 수 있습니다 Constants.m

//Filters 
NSString *const kFilterDate = @"date"; 
NSString *const kFilterRadius = @"radius"; 
NSString *const kFilterSort = @"sort"; 

//Global Strings 
NSString *const kDividingString = @"/"; 

//Strings 
NSString *const kTour = @"Tour"; 
NSString *const kToursKey = @"tours"; 

당신의 Constants.h 파일 const를 변수

//Filters 
FOUNDATION_EXPORT NSString *const kFilterDate; 
FOUNDATION_EXPORT NSString *const kFilterRadius; 
FOUNDATION_EXPORT NSString *const kFilterSort; 

//Global Strings 
FOUNDATION_EXPORT NSString *const kDividingString; 

//Strings 
FOUNDATION_EXPORT NSString *const kTour; 
FOUNDATION_EXPORT NSString *const kToursKey; 

과에서를 사용하여 귀하의 상수를 작성,하지만 진정으로 상수를 사용 그렇게하기 위해 파일에 전역. 많은 곳에서 자주 사용되는 것들. 모든 상수를이 파일에 덤프하면 상수를 사용하는 코드가 상수 파일에 결합됩니다. 따라서 코드를 재사용하려고하면 상수 파일이 있어야합니다.이것은 항상 반드시 나쁜 것은 아니며, 여러 번 의도되었지만 (괜찮습니다), 의존성을 제한하는 것은 항상 좋은 생각입니다. 개정에 대한

몇 가지 : extern

  • FOUNDATION_EXPORT. 첫 번째 컴파일은 C 및 C++에서 서로 다릅니다. 기본적으로 extern을 의미하지만 C++에서는 "C"플래그가 추가됩니다.
  • constsdefines. consts 유형 안전하고 존경 범위입니다. defines은 정반대입니다.
+0

전역 상수에'.h .m'을 사용하는 것이 싫다. 각 변수 이름을 두 번 쓰면 고통이됩니다! – Hlung

+3

깨끗하고 일관성 있고 읽기 쉬운 코드는 통증의 두 배에 달하는 10 배의 가치가 있습니다. – ColdLogic

+0

다음과 같은 경우 어떻게해야합니까? 나는 "초기화 요소가 USER_LIST_URL에 대해 시간 상수를 컴파일하지 않는다"라고 말합니다. –

4

감사.

+0

싱글 톤을 만들기 전에 아주 신중하게 생각할 것입니다. 단위 테스트를 매우 어렵게 만들고 일반적으로 하나도없이 똑같은 것을 달성 할 수 있습니다. 응용 프로그램 대리자를 사용하는 것이 더 나은 솔루션이지만 여전히 이상적은 아닙니다. 많은 사람들이 앱 위임자에게 너무 많은 책임을 부여하는 것이 나쁜 디자인이라고 생각할 것입니다. 필자는 개인적으로 Alex Coplan의 답변에 따라 상수 만 포함 된 글로벌 헤더 파일을 만들 것을 선택했습니다. –

+0

@WillPragnell 헤더 파일은 싱글 톤보다 단위 테스트를 쉽게 만듭니다. 일반적으로 싱글 톤은 단위 테스트를 어렵게 만듭니다. 그러나 이것은 싱글 톤이 빛나는 곳과 똑같습니다. – Jackson

11

난 그냥 다음과 같은 뭔가 Globals.h라는 파일을 만듭니다

#define kBaseURL @"http://api.mysite.com/" 

그런 다음 사용 :

#import "Globals.h" // at the top 

NSString *url = [NSString stringWithFormat:@"%@resources.json",kBaseURL]; 
+0

이것이 최선의 방법이라고 생각합니다. –

4

예, 글로벌 헤더가 이상적인 솔루션입니다. 데이터 저장소 관리와 같은 다른 용도로 사용하지 않는다면 싱글 톤 패턴까지 가지 않을 것입니다. 전역을위한 싱글 톤은 다소 과잉이다.

48

개인적으로 나는 정의보다는 실제 const 변수를 선호합니다. MyConstants.m 파일에서

는 내가 가진 : XY 내 이니셜 또는 다른 "독특한"접두어

NSString *const kXYMySiteBaseURL = @"http://api.mysite.com/"; 
NSString *const kXYSomeOtherURL = @"http://www.google.com/"; 

다른 상수와의 충돌을 피하기 위해.

가 그럼 난 이런 MyConstants.h 파일이 있습니다 ColdFusion에서 같은 미리 컴파일 된 헤더는 그의 대답에 제안에 이러한 상수에 접근 할 필요가 얼마나 많은 파일에 따라

extern NSString *const kXYMySitBaseURL; 
extern NSString *const kXYSomeOtherURL; 

을, 나는 그것을 포함 할 수 있습니다.

이것은 Apple이 대부분의 핵심 프레임 워크에서 상수를 정의하는 방식입니다.

+2

나는 그다지 차이가 ​​없다는 것을 알고 있습니다. 그러나 한 번 상수를 정의하는 메모리에 미치는 영향은 무엇입니까? 인스턴스/로컬 변수는 사용 된 매크로를 사용하고 즉시 GC로 처리됩니까? – bodacious

+0

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html에서 Apple은 #define 매크로를 사용하지 말 것을 권장합니다. 그게 내가 이전 대답보다이 대답을 선호하는 이유이다. – voghDev

+0

그것은 약간의 메모리 절감이다. 또한 isEqual : isEqualToString과 같은 장점은 동일한 포인터이기 때문에 문자열을 비교하는 것을 신경 쓰지 않습니다. – gnasher729

관련 문제