0

アプリケーション用の一連のモデルがあります。これらすべてのモデル全体で、約 200 または 300 のインスタンス変数があります (存在する予定です)。アプリケーションは永続的なデータを Web ベースのサーバー (MySQL - しかし、その部分は問題ではないと思います) に保存します。モデル iVar が更新されるたびに、サーバーを呼び出して、その iVar の適切な値を更新する必要があります。

私の現在のモデル戦略は(ヘッダーファイル)です:

@interface MyModel : NSObject {

    NSString * firstName;
    NSString * lastName;
}

@property (readwrite, copy) NSString * firstName;
@property (readwrite, copy) NSString * lastName;

@end

(実装ファイル):

@implementation MyModel

@synthesize firstName;
@synthesize lastName;

-(id)init {

    [super init]

    [self setFirstName:@"George"];
    [self setLastName:@"Kastanza"];

    return self;
}

-(void)setFirstName:(NSString *)aName {

    // call method to update server with new value here
    firstName = aName;
}

-(void)setLastName:(NSString *)aName {

    // call method to update server with new value here
    lastName = aName;
}

@end

問題は、200 個または 300 個の iVar がある場合、サーバーへの同じ更新呼び出しをすべて実行する必要があるため、多くのセッターを作成することを意味します。さらに、メソッド呼び出しを変更する必要がある場合は、アプリケーション全体のすべてのセッターのすべてのメソッドをすべて更新する必要があります。

設定する前に、最初にメソッドを介して iVar のすべてのセットを実行できるプロセスはありますか?

NSMutableDictionaryすべての iVar を格納するためにモデルごとのオブジェクトだけを持つことを考えましたが、それはセッターとゲッターを抽象化し、非常に多くの辞書に大きなメモリ フットプリントを導入する可能性があります。ただし、このようにすると、辞書が設定されるたびに、1 つのメソッドを介して渡すことができます。

私が理解しているように、実行時にiVarをオブジェクトモデルに動的に追加することは、モデルに依存する可能性のあるサブクラスを参照するポインターのため、悪いことと見なされます(完全な再コンパイルが行われない限り、サブクラスポインターはオフセットされません)。

どんなアイデアや提案も大歓迎です。

アップデート

Ole の推奨に基づいて、ここに解決策があります (残念ながら、数行よりも少し多くのコードを使用します)...

モデルに、必要なときに設定できるメソッドを追加しました。サーバーから返された一連の結果を追加すると、追加されたすべてのオブジェクトのオブザーバーがトリガーされるため、init からメソッドを直接呼び出しませんでした。そのため、サーバーからの最初のグラブを初期化して更新したにメソッドを呼び出します。

これがコードです...

-(void)registerObservers {

    [self addObserver:self 
           forKeyPath:@"firstName"
              options:NSKeyValueObservingOptionNew 
              context:NULL];

    [self addObserver:self 
           forKeyPath:@"lastName" 
              options:NSKeyValueObservingOptionNew 
              context:NULL];
}

次に、オブザーバーをモデルに追加します。

-(void)observeValueForKeyPath:(NSString *)keyPath
                 ofObject:(id)object
                   change:(NSDictionary *)change
                  context:(void *)context {

    if ([keyPath isEqual:@"firstName"]) {
        // Do whatever I need to do
    }

    if ([keyPath isEqual:@"lastName"]) {
        // Do whatever I need to do
    }
}

self私の実際の実装では、リッスンする必要があるが注意を払っていないもの ( のようなもの) を更新できるように、 に設定されたオブジェクトの通知を投稿することもありNSArrayControllersます。

4

1 に答える 1

0

Key-Value Observingを使用します。ただし、すべてのプロパティのオブザーバーとして自分自身を手動で登録する必要があります。

于 2010-07-30T17:57:04.480 に答える