w mojej aplikacji iPhone, używam podklasy AFHTTPClient, aby uzyskać dostęp do usługi internetowej odpoczynku. Chcę, aby wszystkie moje żądania były obsługiwane przez jedną instancję mojego klienta API, więc używam wzorca singleton.Singleton wzór z parametrem
Działa to dobrze, gdy usługa działa tylko raz pod adresem URL. Mogę użyć stałej wartości do ustawienia adresu URL.
Teraz, w ostatecznej wersji aplikacji, każda aplikacja będzie komunikować się z inną usługą, która zostanie zainstalowana w sieci korporacyjnej.
Tak więc otrzymam URL usługi ze zdalnej konfiguracji. Czy wzór singletonowy nadal jest dobrym wyborem? Jak mam go sparametryzować, jeśli URL może się nawet zmienić w czasie działania aplikacji?
okrzyki
#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
Myślę, że będziesz musiał napisać jakiś kod. Jeśli adres URL zmienia się cyklicznie, jest to prosta funkcja "zmiany adresu URL" w swoim singletonie. Jeśli możesz mieć wiele adresów URL aktywnych w tym samym czasie, potrzebujesz jakiegoś katalogu lub tablicy instancji, lub masz instancję "posiadaną" przez kod, który używa tego kodu, a adresowana jest pojedynczo. –
Może istnieć tylko jeden adres URL naraz. Problem polegał na tym, że po utworzeniu instancji program AFHTTPClient nie może zmienić adresu URL. Tak więc rozwiązaniem jest posiadanie całego AFHTTPClient jako prywatnej własności mojego własnego klienta, zamiast rozszerzania go. Jeśli adres URL ulegnie zmianie, mogę po prostu utworzyć nowy agent AFHTTPCl w moim singletonie. Że należy to zrobić. – Jan