Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

対多プロパティのキー値監視

タグ: Objective-C

対多リレーションシップのプロパティをキー値監視したい場合、インスタンス変数名をプロパティキーにしてmutableArrayValueForKeyを使うのが一番手っ取り早い。

#import <Foundation/Foundation.h>

@interface Model : NSObject
{
	NSMutableArray* array;
};

@end

@implementation Model

- (id)init
{
	if(self = [super init])
	{
		array = [[NSMutableArray alloc] init];
	}
	return self;
}

- (void)dealloc
{
	[array release];
	[super dealloc];
}

@end

@interface View : NSObject
{
	Model* model;
};

- (id)initWithModel:(Model*)targetModel;

@end

@implementation View

- (id)initWithModel:(Model*)targetModel
{
	if(self = [super init])
	{
		model = [targetModel retain];
		[model addObserver:self
		        forKeyPath:@"array"
		           options:NSKeyValueObservingOptionNew
		           context:NULL];
	}
	return self;
}

- (void)dealloc
{
	[model removeObserver:self forKeyPath:@"array"];
	[model release];
	[super dealloc];
}

- (void)observeValueForKeyPath:(NSString*)keyPath
                      ofObject:(id)object 
                        change:(NSDictionary*)change
                       context:(void*)context
{
	NSLog(@"%@", change);
}

@end

int main (int, const char*)
{
	NSAutoreleasePool*
		pool = [[NSAutoreleasePool alloc] init];

	Model* model = [[[Model alloc] init] autorelease];
	[[[View alloc] initWithModel:model] autorelease];

	NSMutableArray* array =
		[model mutableArrayValueForKey:@"array"];
	[array addObject:[NSNumber numberWithInt:10]];
	[array addObject:[NSNumber numberWithInt:201]];
	[array removeObjectAtIndex:1];
	
    [pool drain];
	
    return 0;
}

ただ、この方法はコード的に「arraymutableArrayValueForKeyでいじって良いこと」を伝えることができないので、何かしらコメントを残しておく必要がある。

/// mutableArrayValueForKey でいじってね(´З`)
NSMutableArray* array;

NSMutableArrayのインスタンスをインスタンス変数にしたくない」とか「インスタンス変数名とプロパティキーを別にしたい」場合、Modelクラスに以下のメソッドを実装する(「Array」の部分がプロパティキー)。

- (unsigned int)countOfArray;
- (id)objectInArrayAtIndex:(unsigned int)index;
- (void)insertObject:(id)anObject inArrayAtIndex:(unsigned int)index;
- (void)removeObjectFromArrayAtIndex:(unsigned int)index;

そしたら、あとはまたmutableArrayValueForKeyを使うなり、実装したメソッドを直接呼び出すなり、好きにする。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/129-c579e9a8
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。