[ios] iOS 애플리케이션에서 전역 상수를 저장할 위치는?

내 iOS 앱의 대부분의 모델은 웹 서버를 쿼리합니다. 서버의 기본 URL을 저장하는 구성 파일을 갖고 싶습니다. 다음과 같이 보일 것입니다.

// production
// static NSString* const baseUrl = "http://website.com/"

// testing
static NSString* const baseUrl = "http://192.168.0.123/"

한 줄 또는 다른 줄을 주석 처리하여 모델이 가리키는 서버를 즉시 변경할 수 있습니다. 제 질문은 iOS에 전역 상수를 저장하는 가장 좋은 방법은 무엇입니까? Android 프로그래밍에는이 내장 문자열 리소스 파일이 있습니다. 모든 활동 ( UIViewController에 해당 )에서 다음을 사용하여 해당 문자열 상수를 검색 할 수 있습니다.

String string = this.getString(R.string.someConstant);

iOS SDK에 상수를 저장할 수있는 유사한 위치가 있는지 궁금합니다. 그렇지 않은 경우 Objective-C의 모범 사례는 무엇입니까?



답변

당신은 또한 할 수 있습니다

#define kBaseURL @"http://192.168.0.123/"

“constants”헤더 파일에서 constants.h. 그런 다음

#include "constants.h"

이 상수가 필요한 모든 파일의 맨 위에 있습니다.

이렇게하면 다음과 같이 컴파일러 플래그에 따라 서버간에 전환 할 수 있습니다.

#ifdef DEBUG
    #define kBaseURL @"http://192.168.0.123/"
#else
    #define kBaseURL @"http://myproductionserver.com/"
#endif


답변

글쎄, 당신은 그것이 관련된 인터페이스에 로컬 선언을 원합니다. 앱 전체 상수 파일은 좋은 것이 아닙니다.

또한 다음을 extern NSString* const사용하는 것보다 단순히 기호 를 선언하는 것이 좋습니다 #define.


SomeFile.h

extern NSString* const MONAppsBaseUrl;

SomeFile.m

#import "SomeFile.h"

#ifdef DEBUG
NSString* const MONAppsBaseUrl = @"http://192.168.0.123/";
#else
NSString* const MONAppsBaseUrl = @"http://website.com/";
#endif

C ++ 호환 Extern 선언을 생략 한 것 외에도 일반적으로 Apple의 Obj-C 프레임 워크에서 사용되는 내용입니다.

상수가 하나의 파일이나 함수에만 표시되어야한다면 static NSString* const baseUrlin your *.m좋습니다.


답변

전역 상수를 정의하는 방법 :


AppConstants.h

extern NSString* const kAppBaseURL;

AppConstants.m

#import "AppConstants.h"

#ifdef DEBUG
NSString* const kAppBaseURL = @"http://192.168.0.123/";
#else
NSString* const kAppBaseURL = @"http://website.com/";
#endif

그런 다음 {$ APP} -Prefix.pch 파일에서 :

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

문제가 발생하면 먼저 Prefix Header 옵션이 NO로 설정되어 있는지 확인하십시오.


답변

다음과 같이 문자열 상수를 연결할 수도 있습니다.

  #define kBaseURL @"http://myServer.com"
  #define kFullURL kBaseURL @"/api/request"


답변

이 작업을 수행하는 또 다른 방법은 훨씬 간단하며 .pch 접두사 파일과 같이 모든 파일이 아닌 필요한 파일에 포함시킬 것입니다.

#ifndef Constants_h
#define Constants_h

//Some constants
static int const ZERO = 0;
static int const ONE = 1;
static int const TWO = 2;

#endif /* Constants_h */

그런 다음 원하는 헤더 파일에이 헤더 파일을 포함합니다. 포함하려는 특정 클래스의 헤더 파일에 포함합니다.

#include "Constants.h"


답변

  1. YOURPROJECT-Prefix.pch 파일에 전역 상수를 정의합니다.
  2. #define BASEURl @"http://myWebService.appspot.com/xyz/xx"
  3. 그런 다음 BASEURL을 사용하는 프로젝트의 모든 위치 :

    NSString *LOGIN_URL= [BASEURl stringByAppendingString:@"/users/login"];

업데이트 됨 : Xcode 6에서는 프로젝트에서 생성 된 기본 .pch 파일을 찾을 수 없습니다. 따라서 Xcode 6의 PCH 파일을 사용 하여 프로젝트에 .pch 파일을 삽입하십시오.

업데이트 : SWIFT 용

  1. 새 Swift 파일 만들기 [클래스없이 비어 있음] [AppGlobalMemebers]라고 말하세요.
  2. & 즉시 멤버 선언 / 정의

    예:

    var STATUS_BAR_GREEN : UIColor  = UIColor(red: 106/255.0, green: 161/255.0, blue: 7/255.0, alpha: 1)  //
    1. Appdelegate 또는 Singleton 클래스 또는 임의의 클래스 파일에서 앱 전역 멤버를 정의하려면 클래스 정의 위에 지정된 멤버를 선언하십시오.

답변

전역 선언은 흥미롭지 만 저에게있어 코딩 방식을 크게 변경 한 것은 전역 클래스 인스턴스를 갖는 것이 었습니다. 작업 방법을 이해하는 데 며칠이 걸렸기 때문에 여기에 빠르게 요약했습니다.

클래스의 글로벌 인스턴스 (필요한 경우 프로젝트 당 1 개 또는 2 개)를 사용하여 핵심 데이터 액세스 또는 일부 거래 논리를 다시 그룹화합니다.

예를 들어 모든 레스토랑 테이블을 처리하는 중앙 개체를 원하면 시작시 개체를 생성하면됩니다. 이 개체는 데이터베이스 액세스를 처리하거나 저장할 필요가없는 경우 메모리에서 처리 할 수 ​​있습니다. 중앙 집중식으로 유용한 인터페이스 만 표시합니다 …!

그것은 큰 도움, 객체 지향적이며 모든 것을 한곳에서 얻을 수있는 좋은 방법입니다.

몇 줄의 코드 :

@interface RestaurantManager : NSObject
    +(id) sharedInstance;
    -(void)registerForTable:(NSNumber *)tableId;
@end 

및 객체 구현 :

@implementation RestaurantManager

+ (id) sharedInstance {
    static dispatch_once_t onceQueue;

    dispatch_once(&onceQueue, ^{
        sharedInstance = [[self alloc] init];
        NSLog(@"*** Shared instance initialisation ***");
    });
    return sharedInstance;
}

-(void)registerForTable:(NSNumber *)tableId {
}
@end

그것을 사용하는 것은 정말 간단합니다.

[[RestaurantManager sharedInstance] registerForTable : [NsNumber numberWithInt : 10]]