6

NSFetchedResultsControllerDelegateを実装するUITableViewControllerのiPadアプリがあります。 (ほとんどスタンフォードIOSのクラスからCoreDataTableViewControllercodeを使用。)NSManagedObjectsのコレクション(NSArrayまたはNSSet)でKVOを設定する方法

IはNSManagedObjectsのサブクラスであるLocationオブジェクトの配列である二次モデルオブジェクト(self.locations)を有します。この配列は、私のメインであるfetchedResultsContollerをフィルタリングするUISegmentedControlの内容をドライブします。

self.locationsの内容をポップオーバーで変更することは可能です。私は、メインのUITableViewControllerself.locationsに格納されたオブジェクトの変化を監視し、必要に応じてUISegmentedControlをリロードできるように、何らかの観察を設定したいと考えています。

これにより、メインデータがテーブルにリロードされる可能性があります。そのため、少しずつ変更するたびにリロードしないように注意してください。

私は単一のNSManagedObjectにKVOをセットアップする方法を理解していると思いますが、配列に含まれるオブジェクトでどのように行うのかはわかりません。私は別のNSFetchedResultsControllerを使うことができると理解していますが、私のself.locationsオブジェクトは2番目のUITableViewを駆動しないので意味がないと思います。

答えて

10

オブジェクトが追加、削除、置換、または並べ替えられたかどうかを知りたい場合は、1対多の関係を観察するのはかなり簡単です。実際には、通常のオブジェクトと全く同じように行われます。

[self addObserver:self 
     forKeyPath:@"locations" 
      options:0 
      context:NULL]; 

そして、(部分的にアップルのドキュメントからコピーされた)通知を受信するために、次を実装します。

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

    if ([keyPath isEqual:@"locations"]) { 
     // Your custom code here. 
    } 

    // Be sure to call the superclass's implementation *if it implements it*. 
    [super observeValueForKeyPath:keyPath 
         ofObject:object 
          change:change 
          context:context]; 
} 

は、することを忘れないでくださいあなたはオブジェクトのいずれかがRELに含まれているかどうかを知りたい場合は、要求していないものの、

[self removeObserver:self forKeyPath:@"locations"]; 

そして:いくつかの点で観測を停止あなたがここで見ているNSSetだけでなく、に変更された場合、個々のオブジェクトを観察する必要があります。あなたのコメントパー

EDIT

、あなたは個々のオブジェクトを観察したいです。あなたはその後、

- (void)observeManagedObject:(NSManagedObject *)myObject { 
    NSArray *myObjectKeys = [[[myObject entity] attributesByName] allKeys]; 
    for (NSString *key in myObjectKeys) { 
     [myObject addObserver:self 
        forKeyPath:key 
         options:0 
         context:nil]; 
    } 
} 

そして:これは、「正常な」オブジェクトのためのかなり単純明快ですが、あなたはこのようになりますオブジェクト内の個々のキーを、観察する必要があるため、管理対象オブジェクトは、もう少し手間がかかりますこのような配列でNSManagedObjectsのすべてを守ってください。

for (NSManagedObject *object in myArray) { 
    [self observeManagedObject:object]; 
} 

管理対象オブジェクトのキーを観察停止するように逆を行います!

+1

ありがとう@Inafziger!それは大いに役立ちます。 – DeepFriedTwinkie

関連する問題