내 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 baseUrl
in 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"
답변
- YOURPROJECT-Prefix.pch 파일에 전역 상수를 정의합니다.
#define BASEURl @"http://myWebService.appspot.com/xyz/xx"
-
그런 다음 BASEURL을 사용하는 프로젝트의 모든 위치 :
NSString *LOGIN_URL= [BASEURl stringByAppendingString:@"/users/login"];
업데이트 됨 : Xcode 6에서는 프로젝트에서 생성 된 기본 .pch 파일을 찾을 수 없습니다. 따라서 Xcode 6의 PCH 파일을 사용 하여 프로젝트에 .pch 파일을 삽입하십시오.
업데이트 : SWIFT 용
- 새 Swift 파일 만들기 [클래스없이 비어 있음] [AppGlobalMemebers]라고 말하세요.
-
& 즉시 멤버 선언 / 정의
예:
var STATUS_BAR_GREEN : UIColor = UIColor(red: 106/255.0, green: 161/255.0, blue: 7/255.0, alpha: 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]]