2016-07-26 6 views
0

オブジェクトのNSArrayでKVOをまだダイジェストできません。私の要求はガレージ内に複数の車があるとします。フロントタイヤのアップグレードやバックタイヤのような車のタイヤ特性の変化を観察したい。KVO - NSArrayに含まれるオブジェクトのプロパティを確認します。

Car.h

@property(nonatomic, strong) NSString *frontTyre; 
@property(nonatomic, strong) NSString *backTyre; 

Garage.h

[Garage addObserver:self forKeyPath:@"cars" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];] 


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([keyPath isEqualToString:@"cars"]) 
    { 
     //Here I am able to get the car object which got a type upgrade. 
     //But how to know which tyre got upgraded? 
    } 
} 

CarOwner.mで

@property(nonatomic, strong) NSArray *cars; //Think there are two cars in the garage. 

私がやっている車のタイヤのアップグレード中:

[self willChange:NSKeyValueChangeSetting valuesAtIndexes:index forKey:@"remoteUsers"]; 
[car1.frontTyre = @"upgraded"]; 
[self didChange:NSKeyValueChangeSetting valuesAtIndexes:index forKey:@"remoteUsers"]; 

thisまたはthisに行かなければなりませんか?または他の提案をお願いします。

+0

参照する2つの回答は基本的に同じで、コレクション内の項目を個別に観察します。コレクション自体ではなく – Wain

+0

@Wainはい、両方のリンクは同じです。しかし、2番目のものは、鎖の真下にある可変配列要素を再帰的に観察することについて記述しています。しかし、コンセプトは同じです。この深刻な観察を避けるための他の方法はありますか? – SaffronState

+0

変更された情報で実際に何をしようとしていますか?どのように変更されますか?あなたのコードで明示的に 'willChange'と' didChange'をどれくらい使っていますか? – Wain

答えて

1

あなたは次のようにオブザーバを追加し使用することができます。

[Garage.cars addObserver:self toObjectsAtIndexes:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, Garage.cars.count)] forKeyPath:@"frontTyre" options:0 context:nil]; 

は、必要なときにオブザーバーを削除することを忘れないでください。

+0

可変配列。例えば、上記の例では、ガレージはランダムに新しい車を取り外して追加します。あるいは、ガレージに新しいものが追加されたときには必ずオブザーバーを車にセットし、車がガレージから出るときは常にオブザーバーを取り外すべきです。私の上記のリンクにも同じことが言及されています。 – SaffronState

+0

おそらく、配列が新しいオブジェクトを追加するときにオブザーバを再追加すべきでしょうか? – zylenv

+0

最初に「cars」配列にオブザーバを追加しました。(2)>挿入通知を受け取ったときはいつでも、 "car"オブジェクト(あなたが言ったように)と3> "cars"配列の削除通知を受け取ったら、 "car"オブジェクトからオブザーバを削除します。私はあなたに従っていますか?私の理解では、上記のコードは、可変ではない配列にのみ適合します。私は要素が変化し続ける可変配列を持っています – SaffronState

0

KVOの詳細については、変更可能な配列に含まれるオブジェクトのプロパティを観察できる方法がないことを理解しています。

  1. は、通知を得るために、アレイにオブザーバーを追加します(@zylenvが述べたように)私たちは手順ですが、ここで、オブジェクトのプロパティの可変配列を観察することによって

    [object addObserver:observer toObjectsAtIndexes:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, array.count)] forKeyPath:@"property" options:0 context:nil]; 
    

    をオブジェクトの不変配列の性質を観察することができますオブジェクトの挿入と削除の操作。

  2. 挿入通知を受け取った場合、新たに追加されたオブジェクトのプロパティ(関心のあるオブジェクト)にオブザーバを追加してください。
  3. 削除通知が受信されると、ステップ2で追加されたオブジェクトからオブザーバを削除します削除されたオブジェクトは変更辞書の "古い"キーになります)
関連する問題