4

私がやりたいことは、Web サイトから設定を取得する (ストリーム キャプチャ) アプリのユーティリティ クラスを作成することだけです。他のファイルからシンプルに呼び出したい[RemoteConfig updateSettings];

私の目標は、リモート設定を取得するあらゆる状況でオブジェクトを作成せずに、このリモート構成ユーティリティを使用することです。

Objective C の static/class 変数とメソッドに関する情報は漠然としていて、非常に独断的です。しかし、それはおかしいようで、何かが間違っていると思います。

RemoteConfig.hは、 +(void) updateSettingsメソッドを宣言するだけです。

これは私のRemoteConfig.mです:

#import "RemoteConfig.h"

static NSMutableData* _configData;
static NSString* url = @"http://local.namehidden.com:90/json.html";
static int try;

@implementation RemoteConfig

+(void) updateSettings
{
    NSString *identifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

    //Create URL request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
                                                           cachePolicy: NSURLRequestReloadIgnoringCacheData
                                                       timeoutInterval: 10];

    [request setHTTPMethod: @"POST"];
    NSString *post = [NSString stringWithFormat:@"id=%@", identifier];
    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:postData];

    NSURLConnection* connection = [NSURLConnection connectionWithRequest:request
                                                                delegate:self];
    [connection start];
}

///////////////////////////// DELEGATE METHODS ///////////////////////////////////

+(void)connection:(NSConnection*)conn didReceiveResponse:(NSURLResponse*)response
{
       if (_configData == NULL) {
        _configData = [[NSMutableData alloc] init];
    }
    [_configData setLength:0];
    NSLog(@"didReceiveResponse: responseData length:(%d)", _configData.length);
}

/// and so on...

@interface/@implementation の上に C スタイルの変数を置いて、ファンキーに見えます。多くの人がプロパティを使用しようと言い、静的メソッド シングルトン トリックを行うと言う人もいます。シングルトンを処理する小さなライブラリを見てきましたが、これが私が見つけた最も簡単な解決策でした。

私の質問-

  • これはことわざ的に悪いですか?
  • これにはどのような制限がありますか?
  • 代替案は何ですか、そして何が最善ですか?
4

2 に答える 2

0

このように静的変数を使用することは、Singleton を使用することよりも安全です。スレッドセーフに関しても同じ問題が残ります。たとえば、シングルトンはもちろんモックの方が簡単なので、シングルトンの利点になる可能性があります。

どちらの場合も、グローバルな可変状態を導入しています (グローバルな不変状態は問題ありません)。これがどの程度問題になるかは、呼び出し階層のどこにこれらの変数が存在するかによって異なります。コードの大部分が、グローバルな可変状態に基づいて出力を変更する関数の上に構築されている場合、コードのテストと分析が難しくなります。

したがって、グローバルな可変状態を導入する場合は、次のいずれかを試してください。

  1. レイヤードでできるだけ高い位置に置きます。他のコードがこのコードに依存することをできるだけ少なくすることを意味します。

  2. 状態の変更によって、それを使用する関数の出力が変更されないことを確認してください。たとえば、キャッシュだけのグローバル可変状態が機能する可能性があります。

  3. プログラムのコード全体が小さい場合は、500 行のプログラムのグローバル変数と 500 行のクラスのメンバー変数にほとんど違いがないため、グローバル状態を使用できます。

于 2014-03-26T18:01:35.677 に答える