0

CoreData を使用するプロジェクトがあります。サブクラスの生成には Mogenerator を使用します。

プロパティの値を設定すると、この値は実際には割り当てられません。その後、値を設定しようとするたびに、以前に設定した値が割り当てられませんでした。

私の基礎となるデータフレームワークはMantleだったので、これはうまくいきましたが、CoreDataに移行して以来、これは機能しなくなりました。一部の UIView オブジェクトをモデルで最新の状態に保つために、KVO に依存しています。

繰り返しになりますが、CoreData NSManagedObject サブクラスの ivar は、私が割り当てた値を取得していないようです。

次のインターフェースを検討してください。

@interface Light : _Light{}

/**
 Light / Color Properties
 */
@property (nonatomic, assign) CGFloat brightness; // 0...1
@property (nonatomic, assign) CGFloat hue;  // 0...1
@property (nonatomic, assign) CGFloat saturation;  // 0...1
@property (nonatomic, assign, getter = isEnabled) BOOL enabled;

@property (nonatomic, readonly) UIColor *color;  // derived from the above 

- (void)setHue:(CGFloat)hue saturation:(CGFloat)saturation;  // it often makes sense to set these together to generate fewer KVO on the color property.
@end

および次の .m ファイル:

@interface Light ()
{    
    CGFloat _hue, _saturation, _brightness;

    UIColor *_color;  
}
@property (nonatomic, assign) BOOL suppressColorKVO;
@property (nonatomic, readwrite) UIColor *color;
@end

@implementation Light

@synthesize suppressColorKVO = _suppressColorKVO;

- (void)setHue:(CGFloat)hue saturation:(CGFloat)saturation
{
    BOOL dirty = NO;
    if (saturation != _saturation) {
        // clamp its value
        [self willChangeValueForKey:@"saturation"];
        _saturation = MIN(MAX(saturation, 0.0f), 1.0f);
        [self didChangeValueForKey:@"saturation"];
        dirty = YES;
    }
    if (hue != _hue) {
        [self willChangeValueForKey:@"hue"];
        _hue = MIN(MAX(hue, 0.0f), 1.0f);
        [self didChangeValueForKey:@"hue"];
        dirty = YES;
    }
    if (dirty) {
        if (!_suppressColorKVO) {
            [self setColor: self.color];
        }
    }
}

// other stuff... the color accessors are also custom.  Derived from the h, s, b values.

@end

私は CoreData をうまく扱っていないと思いますが、何が問題なのかわかりません。これらの色相、彩度、明るさはすべて「一時的」です (コア データの意味ではありません)。これは、インターフェイスしているハードウェアによって常に更新されているため、状態を保存する必要がないためです。

4

2 に答える 2

0

hueとがモデルのプロパティである場合、 (または関連する生成されたプリミティブ メソッド)saturationを使用して値を設定する必要があります。setPrimitiveValue:forKey:

とはいえ、モデル属性はNSNumberインスタンスになり、mogenerator は値メソッドを作成するため、コードはすべてカスタムに見えます。したがって、これらの属性はモデルでサポートされていないため、保存されていないと推測します。

したがって、属性をモデルに追加し、適切なメソッドを使用して値にアクセスします。

于 2014-02-02T21:58:31.150 に答える
0

結局、それは CoreData とは何の関係もありませんでした。上記のこのアプローチは、CoreData オブジェクトで機能します。CoreData NSManagedObject の外部に存在するいくつかの「一時的な」プロパティをサブクラスに含めることができ、それらの独自の ivar と独自のアクセサーを作成でき、それが連携します。

この質問に関連して、いくつかのコマンドをいくつかのハードウェアにも送信する複雑なシステムがあり、ハードウェアは現在のステータスでコマンドを受け入れたかどうかの応答を返します。これらの値を予期しない値に戻していたハンドラーにバグがあったことがわかりました。

デバッグに役立ったのは、デバッガーでウォッチポイントを使用していたことです。本当に便利な機能!ウォッチポイントを設定すると、変数のメモリ アドレスに新しい値が設定されるたびに、デバッガが中断されます。(ここで少し詳しく説明します

于 2014-02-03T11:16:19.993 に答える