33389


KVOの更新通知をどのように出せばいいのか悩んでいます

[code]

    @interface aClass : NSManagedObject
    @property (nonatomic, retain) NSNumber *attr0;
    @property (nonatomic, retain) NSNumber *attr1;
    @property (nonatomic, retain) NSNumber *attr2;
    @property (nonatomic, retain) NSNumber *attr3;
    
    @property (readonly) NSNumber *calculatedAttr;
    @end
    
    @implementation aClass
    @dynamic attr0, attr1, attr2, attr3;
    + (NSSet *)keyPathsForValuesAffectingCalclatedAttr
    {
        return [NSSet setWithObjects:@"attr0",@"attr1", @"attr2", @"attr3", nil];
    }
    - (NSNumber *)calculatedAttr
    {
        return @(self.attr0.integerValue + self.attr1.integerValue + self.attr2.integerValue + self.attr3.integerValue); // 実際はもう少し複雑です
    }
    @end
    
[/code]

このようなクラスのオブジェクトが複数ありその中の任意の6個を選択します。 そして、6個のcalculatedAttrの合計値をUIに表示しています。
つまり内部的には6*4=24個のデータが関係した値です。

現在はNSArrayControllerを使用し、なおかつKVOの自動通知に任せているのですが、通知の頻度が高すぎ、calculatedAttrの計算が過剰に行われるため、これを軽減できないかと考えてます。

しかし、24個の値は1個だけ変更されることもあれば、24個すべて同時に変更されることもあるため、どれか１つのみを監視対象として残し、他ものは変更通知を行わないようにすることも出来ません。

なにかよい知恵はないでしょうか？


CC BY-SA 3.0
2014-12-16T06:46:23.540
1693
2017-03-17T08:48:24.070
2014-12-16T08:41:44.293
2741
2741
question
macos objective-c
KVO更新通知の軽減方法


上記の仕様に加えてcoredataということなので、どうしようもないような気はします(faultもありますし)。

これがNSManagedObjectでなければ、attr0~3を配列にまとめるとか、setterを上書きして以前の値と変わっていた時のみcalculatedAttrを計算、という手も使えそうではありますが……。


CC BY-SA 3.0
2014-12-18T04:15:19.560
1975
2014-12-18T04:15:19.560
3154
1693
answer


仕様として、どうありたいかによると思いますが、わたしなら、更新頻度が人の目で追いつけない速度で更新されても数値を追いきれないので、タイマーを使って更新チェックをして、更新があれば計算するようにします。


CC BY-SA 3.0
2014-12-19T09:52:14.660
2127
2014-12-19T09:52:14.660
4956
1693
answer


色々な案をありがとうございます。  
完全に合致する方法はおそらくないと思われます。  
あきらめました。


CC BY-SA 3.0
2017-03-17T08:48:24.070
33389
2017-03-17T08:48:24.070
2741
1693
answer