私は 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 メッセージをセットに直接送信していますか? 教科書の例で、子を削除するために親オブジェクトにメッセージを送信するのはなぜですか? ここでそれが起こらないのはなぜですか?これをデバッグして調べる方法はありますか?
ありがとう