この問題を解決する方法がわかりません。このコードは、ユーザーがスクロールするたびに各セルで実行され、UITableView に表示されます。
self.isFinishedProcessing = NO;
[self setNeedsDisplay];
[self.mediaArray removeAllObjects];
self.mediaArray = [[NSMutableArray alloc] init];
dispatch_queue_t queue = dispatch_queue_create("setup_cell", NULL);
NSManagedObjectID *objectID = [self.entry objectID];
dispatch_async(queue, ^{
CoreDataStore *customStore = [CoreDataStore createStore];
Entry *entry = (Entry *)[customStore.context objectWithID:objectID];
if (self.cellInfo.numberOfMediaItems > 0) {
int i = 0;
int numberOfThumbnails = MIN(self.cellInfo.numberOfMediaItems, 3);
while (i < numberOfThumbnails) {
Media *media = [entry.media objectAtIndex:i];
UIImage *image = [media getThumbnail];
[self.mediaArray addObject:image];
i++;
}
}
dispatch_async(dispatch_get_main_queue(), ^{
self.isFinishedProcessing = YES;
[self setNeedsDisplay];
});
});
コア データ ストアは、コア データ クラスである Entry を Media と共に取得し、独自のコンテキストに配置します。
スクロール時にこのコードがいつクラッシュするかは正確にはわかりませんが、上下に数回スクロールすると発生します。
編集: 'object at index' の前の NSLog は、カウントが 3 であると言っています。
エラーの全文は次のとおりです。
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
編集2:
この問題はまだ解決していません。最後にこれを追加しました:
if (self.mediaArray.count != self.entry.media.count) {
NSLog(@"INCORRECT BECAUSE.... media array count: %i, entry media count: %i number of media items: %i", self.mediaArray.count, self.entry.media.count, self.cellInfo.numberOfMediaItems);
}
そして、次のようなセルの後にクラッシュすることがよくあります。
INCORRECT BECAUSE.... media array count: 1, entry media count: 3 number of media items: 3
self.cellInfo.numberOfMediaItems に依存して作成された場合、メディア配列のカウントがどのように間違っている可能性があるのか わかりません。
また、これは別のスレッドで実行された場合にのみ発生することにも注意してください。メインスレッドでクラッシュすることはありません。