111 votes

Où stocker les constantes globales dans une application iOS?

La plupart des modèles dans mon application iOS requête à un serveur web. Je voudrais avoir un fichier de configuration de stocker l'URL de base du serveur. Il ressemblera à quelque chose comme ceci:

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

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

En commentant une ligne ou l'autre, je peux changer de serveur de mes modèles. Ma question est, quelle est la meilleure pratique pour stocker des constantes globales dans iOS? Dans Android de programmation, nous avons cette intégrés dans les chaînes de fichier de ressources. Dans toute Activité (l'équivalent d'un UIViewController), nous pouvons récupérer ces constantes de chaîne avec:

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

Je me demandais si le SDK iOS est un analogue de place pour stocker des constantes. Si non, quelle est la meilleure pratique en Objective-C pour le faire?

169voto

justin Points 72871

Eh bien, vous voulez la déclaration locale pour les interfaces elle concerne l'application à l'échelle de fichier de constantes n'est pas une bonne chose.

Ainsi, il est préférable de simplement déclarer un extern NSString* const symbole, plutôt que d'utiliser 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

En dehors de l'omission du C++ compatible déclaration Extern, c'est ce que vous voyez généralement utilisé dans Apple Obj-C cadres.

Si la constante doit être visible pour juste un fichier ou d'une fonction, alors static NSString* const baseUrl votre *.m est bon.

144voto

Cyrille Points 11109

Vous pouvez aussi faire un

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

dans un fichier d'en-tête "constantes", dites constants.h . Alors fais

 #include "constants.h"
 

en haut de chaque fichier où vous avez besoin de cette constante.

De cette façon, vous pouvez basculer entre les serveurs en fonction des drapeaux du compilateur, comme dans:

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

39voto

Piotr Tomasik Points 2550

La façon dont je définis les 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
 

Ensuite, dans votre fichier {$ APP} -Prefix.pch:

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

Si vous rencontrez des problèmes, vérifiez d’abord que l’option En-tête de préfixe de précompilation est définie sur NO.

5voto

Martin Reichl Points 578

Vous pouvez également concaténer des constantes de chaîne comme ceci:

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

2voto

Gregoire Mulliez Points 328

Déclarations globales sont intéressantes, mais, pour moi, ce qui a changé profondément le chemin de mon code était à l'échelle des instances de classes. Il m'a fallu quelques jours pour vraiment comprendre comment travailler avec elle, j'ai donc rapidement résumées ici

J'utilise mondial des instances de classes (1 ou 2 par projet, si nécessaire), à regrouper les données de base de l'accès, ou de certains métiers de la logique.

Par exemple, si vous voulez avoir un objet central de la manipulation de toutes les tables du restaurant vous créez vous vous opposez au démarrage et c'est tout. Cet objet peut gérer les accès base de données OU la poignée en mémoire, si vous n'avez pas besoin de l'enregistrer. Il centralisée de vous montrer seulement utile interfaces ... !

Il est d'une grande aide, orienté objet et un bon moyen d'obtenir tous vous des trucs à la même place

Quelques lignes de code :

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

et l'objet de la mise en œuvre :

@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

pour l'utiliser c'est très simple :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X