4

このメソッドを持つシングルトン データ マネージャーがあります。

-(NSArray*)fetchItems
{
NSEntityDescription *entity = [NSEntityDescription
                               entityForName:@"Item" inManagedObjectContext:self.managedObjectContext];


NSError *error2;
NSFetchRequest *itemFetchRequest = [[NSFetchRequest alloc] init];
[itemFetchRequest setEntity:entity];
[itemFetchRequest setReturnsObjectsAsFaults:NO];


NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order"
                                                               ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[itemFetchRequest setSortDescriptors:sortDescriptors];

NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:itemFetchRequest error:&error2];


return fetchedItems;


}

次に、次のようなコア データ オブジェクトに基づいていくつかのビューを作成します。

self.items = [dataManager fetchItems];
for (Item *item in self.items) { //Item is the NSManagedObject subclass
    ItemView *itemView = [[ItemView alloc] initWithFrame:aFrame ];

    [itemView layoutWithData:item];
    [self.someView addSubview:itemView];

}

ItemView のデータは次のように設定されます。

- (void)layoutWithData:(Item*)_data {
self.data = _data;

NSLog(@"ItemView data: %@", self.data); //not "fault" at this point
...

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setImage:data.image forState:UIControlStateNormal];
[btn addTarget:self action:@selector(tapDetected:) forControlEvents:UIControlEventTouchUpInside];
btn.frame = aFrame;
[self addSubview:btn];

}

この時点で、ItemView のデータは定義されており、「障害」ではありません。ただし、次のようにタップが検出された場合:

- (void)tapDetected:(id)sender
{
NSLog(@"TAP: %@", self.data); //fault - see below
[self.delegate itemTapped:self.data];
}

私はこのようなものを得る:

TAP: <Item: 0x879ce40> (entity: Item; id: 0x8798310 <x-coredata://8BE9ABFE-7C63-4ADD-9AD1-62B81C5AFF66/Item/p66> ; data: <fault>)

ItemView をタップすると、データが最初は「非フォールト」で、後で「フォールト」になるのはなぜですか?どうすれば修正できますか? これは一日中私を殺してきました...

編集: このコードを使用して、データが layoutWithData メソッドの障害ではなく、tapDetected メソッドの障害であることを確認できます。

NSLog(@"is fault? %i", self.data.isFault);

なぜそれが障害になるのですか?

4

1 に答える 1

0

これは実際には問題ではないかもしれませんが、データがまだ読み取られていないことを意味する障害です。フェッチの前に次のことを試してください。

[fetchRequest setReturnsObjectsAsFaults:NO];

そうすれば、データは完全に読み取られます。

同様の質問を参照してください

于 2013-05-19T11:28:01.063 に答える