objective c - tengo - ¿Dónde está el mejor lugar para almacenar constantes en una aplicación de iOS?
programas para guardar archivos (5)
Estoy desarrollando una aplicación ahora que busca recursos de una API JSON.
todos los recursos tienen la misma URL base:
http://api.mysite.com/resources.json
http://api.mysite.com/other_resources.json
Quiero almacenar la cadena http://api.mysite.com/
para que esté disponible para todos mis Controladores y Modelos, eliminando algunas duplicaciones al escribir las URL de recursos.
¿Dónde está el mejor lugar para hacer esto? El archivo -prefix.pch ?
Cualquier consejo apreciado
Crearía un singleton o usaría AppDelegate y pondría las constantes allí.
Estoy de acuerdo con la respuesta de Alex Coplan con una importante adición.
Coloque todas sus constantes en un archivo llamado "Constants.h" (o w / e que desee)
EDITAR:
- Cuando respondí esta pregunta hace tres años, estaba en el carro de
#define
, revise a continuación para una revisión.
Constantes.h
#define kFilterDate @"date"
#define kFilterRadius @"radius"
#define kFilterSort @"sort"
//Global Strings
#define kDividingString @" / "
//Strings
#define kTour @"Tour"
#define kToursKey @"tours"
Pero en lugar de importarlo en cualquier archivo que necesite, impórtelo en su archivo de prefijo para que todos sus encabezados lo importen automáticamente a lo largo de su proyecto.
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
REVISIÓN
Aunque toda la información anterior seguirá funcionando, hay algunas cosas que podemos hacer para estar un poco más seguros con respecto a nuestras constantes.
Crea tus constantes en tu archivo Constants.h
usando variables 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;
Y en 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";
Esto todavía se puede importar a su archivo de prefijo como se indicó anteriormente, pero solo use constantes que sean verdaderamente globales en el archivo para hacer eso. Los que se utilizan con frecuencia en muchos lugares. Volcar todas sus constantes en este archivo hará que su código que usa cualquier constante se acople al archivo de constantes. Por lo tanto, si intenta volver a utilizar el código, el archivo de constantes debe venir con él. Esto no siempre es necesariamente malo, y muchas veces está destinado (lo cual está bien), pero limitar las dependencias siempre es una buena idea.
Algunas cosas sobre la revisión:
-
FOUNDATION_EXPORT
vsextern
. El primero compila diferentes para C y C ++. Básicamente significaextern
, pero en C ++ agregará la bandera "C". -
consts
vsdefines
.consts
son de tipo seguro y respetan el alcance.defines
son exactamente lo contrario.
Personalmente, prefiero usar variables de const reales en lugar de definirlas.
En un archivo MyConstants.m tengo:
NSString *const kXYMySiteBaseURL = @"http://api.mysite.com/";
NSString *const kXYSomeOtherURL = @"http://www.google.com/";
donde XY son mis iniciales o algún otro prefijo "único" para evitar colisiones con otras constantes.
Entonces tengo un archivo MyConstants.h como este:
extern NSString *const kXYMySitBaseURL;
extern NSString *const kXYSomeOtherURL;
Dependiendo de cuántos archivos necesiten acceder a estas constantes, podría incluirlo en el encabezado precompilado como sugiere ColdFusion en su respuesta.
Así es como Apple define sus constantes en la mayoría de los frameworks Core.
Sí, un encabezado global sería una solución ideal. No llegaría tan lejos como un patrón único, a menos que planee usarlo para otras cosas como administrar su almacén de datos. Un singleton para globales es algo exagerado.
Solo creo un archivo llamado Globals.h
con algo como lo siguiente:
#define kBaseURL @"http://api.mysite.com/"
Entonces para usar:
#import "Globals.h" // at the top
NSString *url = [NSString stringWithFormat:@"%@resources.json",kBaseURL];