iPhone KVCで値が変更したら通知を受ける

iPhone開発において、ある値が変更されたら通知を受ける仕組みがある。
例えばネットワークに接続中かどうかのフラグがあり、それが変更するたびに、インジケータをまわす、止めるを制御したいなどなど

  • NetWorkManagerクラス
NetWorkManager.h
@property (nonatomic, readonly, getter=isNetworkAccessing) BOOL networkAccessing;

NetWorkManager.m

- (BOOL)isNetworkAccessing {
return [_requests count] = 0;
}

- (void) requestXXX {
NSRequest* reqeust;
// 省略
[self willChangeValueForKey:@"netWorkAccesing"];
[_requests addObject:request];
[self didChangeValueForKey:@"netWorkAccesing"];
}

  • ObserverReciveSampleクラス
ObserverReciveSample.m
- (id)init{
// 省略

// キー値監視の登録
_netWorkManager = [[[NetWorkManager* alloc] init];
[netWorkManager addObserver:self forKeyPath:@"networkAccessing" options:0 context:NULL];
}

- (void)observeValueForKeyPath:(NSString*)keyPath
ofObject:(id)object
change:(NSDictionary*)change
context:(void*)context {
// networkAccessingキーの場合
if ([keyPath isEqualToString:@"networkAccessing"]) {
// ネットワークアクティビティを更新する
[UIApplication sharedApplication].networkActivityIndicatorVisible = _netWorkManager.networkAccessing;
}
}

今回は明示的にwillChangeValueForKeyやdidChangeValueForKeyをしていますが、それを指定しない場合、以下のように監視する方法もあるみたいです。
※上記の場合だと、パラメータが存在しなくても動作します。



+ (BOOL)automaticallyNotifiesObserversForKey:(NSString*)key {
if ([key isEqualToString:@"networkAccessing"]) {
return YES;
}
return [super automaticallyNotifiesObserversForKey:key];
}





0 件のコメント:

コメントを投稿

ReactNativeでAndroid対応する話

前提 ReactNativeでiOS版のアプリをリリースしていて、Android版をリリースする話 トラブルシューティング Build.VERSION_CODES.Q が存在しないエラー compileSdkVersionを29以上にすると解決 メモリー足りないエラー Execu...