ビューに最初にデータを入力するときは、次のようにします。
self.cats = [[DataManager sharedManager] getCatsFromCoreData]; //cats is an NSArray property (strong)
for (Cat* cat in self.cats)
{
CatThumbnailView *thumb = [CatThumbnailView catThumbnailView];
thumb.cat = cat;
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(thumbnailTapped:)];
[thumb addGestureRecognizer:tap];
[thumb setText:[cat.name uppercaseString]];
...
[self.someScrollview addSubview:thumb];
yPos += thumb.frame.size.height + spacing;
}
DataManager の get メソッドは次のようになります。
- (NSArray*)getCatsFromCoreData
{
NSManagedObjectContext *context = [[CoreDataController sharedController] managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Cats" inManagedObjectContext:context]];
[request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES]]];
NSError *error = nil;
NSArray *fetchedCats = [context executeFetchRequest:request error:&error];
if (fetchedCats.count > 0) {
return fetchedCats;
}
return nil;
}
それはすべてうまくいきます。ビューにデータが取り込まれます。サムネイルのタップ方法は次のようになります。
- (void)thumbnailTapped:(UITapGestureRecognizer*)tap
{
CatThumbnailView* thumb = (CatThumbnailView*)tap.view;
DLog(@"cat %@", thumb.cat);
DLog(@"cat id: %@", thumb.cat.cat_id);
//do stuff here with the cat data
}
問題は、猫のサムネイルをタップすると、次のようになることがあります。
cat <Cat: 0x7fa450> (entity: Cat; id: 0x7b71f0 <x-coredata://7C904BD2-16AA-486D-8D1B-C2D0ABCCB6D4/Cat/p1> ; data: <fault>)
cat id: (null)
猫の ID が null であるため、何かをしようとするとアプリがクラッシュします。
そのため、最初に CoreData から猫オブジェクトを取得してビューをレイアウトするときに、猫 ID が null になることはありません。後でサムネイルの 1 つをタップすると、データがエラーになり、cat_id プロパティにアクセスすると null になります。CatThumbnailView は Cat エンティティを保持します。
@property (nonatomic, strong) Cat* cat;
なぜこれが起こるのか、どうすればよいのでしょうか?
*注 - これは、サムネイルをタップするたびに発生するわけではありません。10~20%の確率で起こると言われています。残りの 80 ~ 90% の時間は、データに問題はありません。どうして????