quedan - Dónde almacenar constantes globales en una aplicación de iOS?
donde se guardan los archivos descargados de safari en iphone (11)
- Defino la constante global en el archivo YOURPROJECT-Prefix.pch.
-
#define BASEURl @"http://myWebService.appspot.com/xyz/xx"
entonces en cualquier lugar del proyecto para usar BASEURL:
NSString *LOGIN_URL= [BASEURl stringByAppendingString:@"/users/login"];
Actualizado: En Xcode 6 no encontrará el archivo .pch predeterminado creado en su proyecto. Por lo tanto, utilice PCH File en Xcode 6 para insertar el archivo .pch en su proyecto.
Actualizaciones: para SWIFT
- Crear nuevo archivo Swift [vacío sin clase] decir [AppGlobalMemebers]
& Inmediatamente declarar / definir miembro
Ejemplo:
var STATUS_BAR_GREEN : UIColor = UIColor(red: 106/255.0, green: 161/255.0, blue: 7/255.0, alpha: 1) //
- Si desea definir el miembro global de la aplicación en cualquier archivo de clase, digamos Appdelegate o Singleton class o any, declare el miembro dado por encima de la definición de la clase
La mayoría de los modelos en mi aplicación iOS consultan un servidor web. Me gustaría tener un archivo de configuración que almacene la URL base del servidor. Se verá algo como esto:
// production
// static NSString* const baseUrl = "http://website.com/"
// testing
static NSString* const baseUrl = "http://192.168.0.123/"
Al comentar una línea o la otra, puedo cambiar instantáneamente a qué servidor apuntan mis modelos. Mi pregunta es, ¿cuál es la mejor práctica para almacenar constantes globales en iOS? En la programación de Android, tenemos este archivo de recursos de cadenas integrado. En cualquier Activity (el equivalente de un UIViewController ), podemos recuperar esas constantes de cadena con:
String string = this.getString(R.string.someConstant);
Me preguntaba si el iOS SDK tiene un lugar análogo para almacenar constantes. Si no, ¿cuál es la mejor práctica en Objective-C para hacerlo?
Bueno, desea la declaración local para las interfaces a las que se refiere: el archivo de constantes para toda la aplicación no es bueno.
Además, es preferible simplemente declarar un símbolo extern NSString* const
, en lugar de usar un #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
Además de la omisión de la declaración externa compatible con C ++, esto es lo que generalmente verá utilizado en los marcos Obj-C de Apple.
Si la constante necesita ser visible para un solo archivo o función, entonces static NSString* const baseUrl
en su *.m
es buena.
Creo que otra forma de hacerlo es mucho más simple y solo la incluirá en los archivos en los que los necesita, no en TODOS los archivos, como con el archivo de prefijo .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 */
Después de eso, incluye este archivo de encabezado en el archivo de encabezado que desea. Lo incluye en el archivo de encabezado para la clase específica en la que desea que esté incluido:
#include "Constants.h"
La forma en que defino las constantes globales:
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
Luego, en su archivo {$ APP} -Prefix.pch:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "AppConstants.h"
#endif
Si tiene algún problema, primero asegúrese de tener la opción de encabezado del prefijo Precompilar en NO.
La respuesta aceptada tiene 2 debilidades. En primer lugar, como otros señalaron el uso de #define
que es más difícil de depurar, use en su lugar extern NSString* const kBaseUrl
estructura extern NSString* const kBaseUrl
. Segundo, define un solo archivo para constantes. OMI, esto es incorrecto porque la mayoría de las clases no necesitan acceso a esas constantes o para acceder a todas ellas más el archivo puede hincharse si todas las constantes se declaran allí. Una mejor solución sería modular constantes en 3 capas diferentes:
Capa del sistema:
SystemConstants.h
oAppConstants.h
que describe las constantes en el alcance global, a las que se puede acceder desde cualquier clase del sistema. Declare aquí solo las constantes a las que se debe acceder desde diferentes clases que no están relacionadas.Capa de módulo /
ModuleNameConstants.h
:ModuleNameConstants.h
, describe un conjunto de constantes que son típicas para un conjunto de clases relacionadas, dentro de un módulo / subsistema.Capa de clase: Constantes reside en la clase y solo la usa.
Solo 1,2 están relacionados con la pregunta.
Las declaraciones globales son interesantes pero, para mí, lo que cambió profundamente mi camino al código fue tener instancias globales de clases. Me tomó un par de días entender realmente cómo trabajar con él, así que lo resumí rápidamente aquí
Utilizo instancias globales de clases (1 o 2 por proyecto, si es necesario) para reagrupar el acceso a los datos centrales, o algunas lógicas comerciales.
Por ejemplo, si desea tener un objeto central manejando todas las tablas de restaurante que crea, objeta al inicio y eso es todo. Este objeto puede manejar accesos a la base de datos O manejarlo en la memoria si no necesita guardarlo. ¡Está centralizado, muestra solo interfaces útiles ...!
Es una gran ayuda, orientada a objetos y una buena forma de obtener todo lo que tienes en el mismo lugar
Algunas líneas de código:
@interface RestaurantManager : NSObject
+(id) sharedInstance;
-(void)registerForTable:(NSNumber *)tableId;
@end
y la implementación de objetos:
@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
para usarlo es realmente simple:
[[RestaurantManager sharedInstance] registerForTable: [NsNumber numberWithInt: 10]]
Para un número puedes usarlo como
#define MAX_HEIGHT 12.5
También podrías hacer un
#define kBaseURL @"http://192.168.0.123/"
en un archivo de encabezado "constantes", diga constants.h
. Entonces hazlo
#include "constants.h"
en la parte superior de cada archivo donde necesitas esta constante.
De esta forma, puede cambiar entre servidores dependiendo de los indicadores del compilador, como en:
#ifdef DEBUG
#define kBaseURL @"http://192.168.0.123/"
#else
#define kBaseURL @"http://myproductionserver.com/"
#endif
También puede concatenar constantes de cadena como esta:
#define kBaseURL @"http://myServer.com"
#define kFullURL kBaseURL @"/api/request"
Un enfoque que he usado anteriormente es crear un archivo Settings.plist
y cargarlo en NSUserDefaults
al iniciar usando registerDefaults:
A continuación, puede acceder a su contenido con lo siguiente:
// Assuming you''ve defined some constant kMySettingKey.
[[NSUserDefaults standardUserDefaults] objectForKey:kMySettingKey];
Si bien no he hecho ningún desarrollo de Android, parece que es análogo al archivo de recursos de cadenas que describió. El único inconveniente es que no puede usar el preprocesador para intercambiar configuraciones (por ejemplo, en el modo DEBUG
). Sin embargo, supongo que podrías cargar un archivo diferente.
plist
un objeto de configuración que se inicializa desde un plist
. ¿Por qué molestar a otras clases con cosas externas irrelevantes?
eppz!settigns
por este motivo. Vea el artículo Una forma simple y avanzada de guardar en NSUserDefaults para incorporar valores predeterminados de un plist
.