0

これは奇妙に聞こえるかもしれません。

シナリオ

AFOauthClient の実装

サブクラスを作成し、baseurl とすべての共有インスタンスを作成しました

+ (GYMAFOAuthClient *)sharedClient {
    static GYMAFOAuthClient *_sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        NSURL *url =[NSURL URLWithString:[[NSUserDefaults standardUserDefaults] stringForKey:@"kServer_Address"]];
        if (url==nil) {
            [[[UIAlertView alloc]initWithTitle:@"Required" message:@"Please enter the required fields in the settings page of the application" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]show];
        }
        else
        {
             _sharedClient = [GYMAFOAuthClient clientWithBaseURL:url clientID:kClientID secret:kClientSecret];
        }       
    });
    return _sharedClient;
}

完璧に動作します。

しかし

現在、他のサーバーに切り替える必要があり、dispatch_once メソッドを使用しているため、再初期化が面倒です。新しい URL を割り当てて、baseurl を新しい URL として共有インスタンスを作成するにはどうすればよいですか。

私が試したこと:

ユーザーデフォルトに URL を設定する目的で設定バンドルを使用しています。クライアントを作成して応答の取得を開始するだけで済みます。どうすればそれを達成できますか?

説明:

サーバーを変更する...つまり、5つのVCと1つのログインVCがあり、ユーザーが設定ページに移動して編集するまで、すべてのサーバーベースURLは同じです。つまり、設定を編集した後、ユーザーはアプリケーションの再ログインを開始してからすべてを取得する必要がありますサービス。

4

3 に答える 3

4

明らかに、共有/シングルトン インスタンスは問題の正しいアーキテクチャではありませんでした。ここでの使用を取り除こうとすることから始めてsharedClient、インスタンスをそれを必要とするものに渡すだけです。そうすれば、必要に応じてそれを破棄し、新しいものを作成できます。

シングルトンを深く巻き込みすぎたためにそれが実用的でない場合はGYMAFOAuthClient、「is-a」ではなく「has-a」になるように変更する必要がありますGYMAFOAuthClient。そうすれば、再構成できるようになります。

于 2013-03-19T14:44:34.927 に答える
0

これについてはRobに同意しますが、AFOSharedClientのプロパティとしてURLを作成することもできます.

その後、メモリ内のスポットへの単なるポインターであるため、更新できるはずです。

于 2013-03-19T21:30:55.790 に答える
0

このコードを使用して autorelease オブジェクトを取得できます

+ (GYMAFOAuthClient *) clientWithURL:(NSURL*) url {

 GYMAFOAuthClient *client = nil;
    if (url==nil) {
        [[[UIAlertView alloc]initWithTitle:@"Required" message:@"Please enter the required fields in the settings page of the application" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]show];
    }
    else
    {
        client = [GYMAFOAuthClient clientWithBaseURL:url clientID:kClientID secret:kClientSecret];
    }
return client;
}
于 2013-03-19T14:54:05.190 に答える