9

私の iPhone アプリケーションでは、AFHTTPClient のサブクラスを使用して残りの Web サービスにアクセスしています。すべてのリクエストを API クライアントの 1 つのインスタンスで処理したいので、シングルトン パターンを使用します。

これは、サービスが 1 回限りの URL で実行されている場合にうまく機能します。定数値を使用して URL を設定できます。

アプリケーションの最終バージョンでは、各アプリは企業ネットワークにインストールされる別のサービスと実際に通信します。

したがって、リモート構成からサービス URL を取得します。ここでもシングルトン パターンは適切な選択ですか? アプリの実行中に URL が実際に変更される可能性がある場合、どのようにパラメーター化する必要がありますか?

乾杯

#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
4

2 に答える 2

1

シングルトン パターンは拘束衣である必要はありません。

この教訓はココアタッチから学んだ。フレームワークには共有インスタンスを使用するクラスがいくつかありますが、必要に応じて独自のインスタンスを柔軟に作成できます。NSNumberFormatter、NSDateFormatter、NSBundle、NSFileManager など、必要に応じて独自のインスタンスを作成できるクラスの例です。

あなたの場合、インスタンスを返す 2 つのクラス メソッドがあります。

+ (instancetype)sharedClient {
    static FooAPIClient *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:kFooAPIBaseURLString]];
    });

    return instance;
}

static FooAPIClient *FooSharedCorporateInstance;

+ (instancetype)sharedCorporateClient {
   @syncronized (FooSharedCorporateInstance) {
       return FooSharedCorporateInstance;
   }
}

+ (void)setSharedCorporateClientWithURL:(NSURL *)URL {
   @syncronized (FooSharedCorporateInstance) {
       FooSharedCorporateInstance = [[self alloc] initWithBaseURL:URL];
   }
}

副次的な利点として、これにより、シングルトン クラスでは曖昧になりがちなクラスとインスタンスの責任を分離することが強制されます。

于 2013-09-03T19:59:37.540 に答える