我不知道如何解决这个问题。每次用户滚动并在 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];
});
});
核心数据存储将作为核心数据类的条目与媒体一起放入它自己的上下文中。
我还没有弄清楚滚动时这段代码何时崩溃,但它在上下滚动几次时会发生。
编辑:“索引对象”之前的 NSLog 表示计数为 3。可以肯定的是,我实际上为此做了 entry.media.count。
这是完整的错误:
*** 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 创建的。
还值得注意的是,这只发生在单独的线程中。永远不会在主线程中崩溃。