Dans mon application iPhone, j'utilise une sous-classe de AFHTTPClient pour accéder à un service Web de repos. Je veux que toutes mes demandes soient traitées par une instance de mon client API, donc j'utilise un pattern singleton.Modèle singleton avec le paramètre
Cela fonctionne correctement lorsque le service s'exécute sur une seule URL. Je peux utiliser une valeur constante pour définir l'URL. Maintenant, dans la version finale de l'application, chaque application communiquera avec un autre service qui sera installé dans le réseau de l'entreprise. Je vais donc obtenir l'URL du service à partir d'une configuration distante. Le motif singleton est-il toujours un bon choix ici? Comment suis-je supposé le paramétrer si l'URL peut même changer pendant l'exécution de l'application?
acclamations
#import "FooAPIClient.h"
#import "AFJSONRequestOperation.h"
static NSString * const kFooAPIBaseURLString = @"http://192.168.0.1";
@implementation FooAPIClient
+ (instancetype)sharedClient {
static FooAPIClient *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:kFooAPIBaseURLString]];
});
return _sharedClient;
}
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setDefaultHeader:@"Accept" value:@"application/json"];
return self;
}
@end
Je pense que vous devrez écrire du code. Si l'URL change en série, il s'agit simplement d'une fonction de "changement d'URL" sur votre singleton. Si vous pouvez avoir plusieurs URL actives en même temps, vous avez besoin d'une sorte de répertoire ou d'un tableau d'instances, ou bien d'avoir l'instance "possédée" par le code qui l'utilise, vs étant adressée via un singleton. –
Il ne peut y avoir qu'une seule URL à la fois. Le problème était que, une fois instancié, l'AFHTTPClient ne peut pas changer son URL. Donc la solution est d'avoir AFHTTPClient entier comme une propriété privée de mon propre client au lieu de l'étendre. Si l'URL change, je peux juste instancier un nouveau AFHTTPClient dans mon singleton. Ça devrait le faire. – Jan