0

私は Cocoa を学んでいて、Aaron Hillegass の本 (Chapter 32 Core Data Relationships) の例に従っていますが、自分のアプリでは動作しません。

私は、子と対多の関係を持つ親オブジェクトで構成されるコアデータモデルを持っていますが、私のものは、基本的なNSMutableSetである本とは異なり、順序付きセットです。

親と子の各オブジェクトには NSArrayController が関連付けられており、Interface Builder でドキュメントベースのアプリを開発しました。選択した親 (この場合はパーセプトロンと呼ばれます) から子オブジェクト (私の場合はパーセプトロンと呼ばれます) を追加/削除するボタンとバインディングを備えています。層)。それはすべて働いています。

ここで、子が追加または削除されるたびに独自のコーディングを行えるように、add メソッドと remove メソッドをインターセプトしたいと考えています。

Hillegass の本では、彼は NSManagedObjects サブクラスを作成し、コードに addEmployeesObject: および removeEmployeesObject: メソッドを実装することでこれを行っています。それが私が試したことです。

XCode エディターによって作成された子サブクラスは次のとおりです。

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Network, Perceptron;

@interface Layer : NSManagedObject

@property (nonatomic, retain) Network *network;
@property (nonatomic, retain) NSOrderedSet *perceptrons;
@end

@interface Layer (CoreDataGeneratedAccessors)

- (void)insertObject:(Perceptron *)value inPerceptronsAtIndex:(NSUInteger)idx;
- (void)removeObjectFromPerceptronsAtIndex:(NSUInteger)idx;
- (void)insertPerceptrons:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
- (void)removePerceptronsAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInPerceptronsAtIndex:(NSUInteger)idx withObject:(Perceptron *)value;
- (void)replacePerceptronsAtIndexes:(NSIndexSet *)indexes withPerceptrons:(NSArray *)values;
- (void)addPerceptronsObject:(Perceptron *)value;
- (void)removePerceptronsObject:(Perceptron *)value;
- (void)addPerceptrons:(NSOrderedSet *)values;
- (void)removePerceptrons:(NSOrderedSet *)values;
@end

そして、テキストブックに従って Layer.m に実装した 2 つのメソッドを次に示します。

- (void)addPerceptronsObject:(Perceptron *)value
{
    NSLog(@"Network '%@' layer %lu is adding perceptron %lu", [[self network] name], [self indexInNetwork], [value indexInLayer]);
    NSSet *s = [NSSet setWithObject:value];
    [self willChangeValueForKey:@"perceptrons"
                withSetMutation:NSKeyValueUnionSetMutation
                   usingObjects:s];
    [[self primitiveValueForKey:@"perceptrons"] addObject:value];
    [self didChangeValueForKey:@"perceptrons"
     withSetMutation:NSKeyValueUnionSetMutation
                  usingObjects:s];
}

- (void)removePerceptronsObject:(Perceptron *)value
{
    NSLog(@"Network '%@' layer %lu is removing perceptron %lu", [[self network] name], [self indexInNetwork], [value indexInLayer]);
    NSSet *s = [NSSet setWithObject:value];
    [self willChangeValueForKey:@"perceptrons"
                withSetMutation:NSKeyValueUnionSetMutation
                   usingObjects:s];
    [[self primitiveValueForKey:@"perceptrons"] removeObject:value];
    [self didChangeValueForKey:@"perceptrons"
               withSetMutation:NSKeyValueUnionSetMutation
                  usingObjects:s];
}

NSLogs を入れたので、それらが呼び出されていないことは確かです。パーセプトロン オブジェクトを追加/削除しても、コンソールには何も表示されません。

add: remove: メッセージを受け取ったとき、ArrayController は何をしますか? addObject/removeObject メッセージをセットに直接送信していますか? 教科書の例で、子を削除するために親オブジェクトにメッセージを送信するのはなぜですか? ここでそれが起こらないのはなぜですか?これをデバッグして調べる方法はありますか?

ありがとう

4

1 に答える 1

1

明細書、

Core Data によって動的に生成されるメソッドをオーバーライドしています。ルックアップ テーブルの静的エントリが上書きされていると思われます。@propertyこれらのメソッドは、オーバーライドされることを期待するメソッドと同じではありません。

より大きな意味で、なぜここにコードを挿入したいのでしょうか? オブジェクトがインスタンス化されるときの実装用に設計された、より適切にサポートされるメソッドがあります。-awakeFromFetchとを調べることもでき-awakeFromInsertます。

アンドリュー

于 2012-12-10T13:41:07.277 に答える