Предоставление ответа, который кажется отличным от всех остальных.
Я рекомендую вам проверить
blockquote>NULL
вif
s.Причина:
Мы не должны оставлять шанс, чтобы наша программа была разбита. NullPointer генерируется системой. Поведение генерируемых системой исключений невозможно предсказать. Вы не должны оставлять свою программу в руках Системы, когда у вас уже есть способ ее обработки самостоятельно. И добавьте механизм обработки исключений для дополнительной безопасности. !!
blockquote>Для упрощения чтения кода проверьте это для проверки условий:
if (wsObject.getFoo() == null || wsObject.getFoo().getBar() == null || wsObject.getFoo().getBar().getBaz() == null) return -1; else return wsObject.getFoo().getBar().getBaz().getInt();
EDIT:
Здесь вам нужно сохранить эти значения
blockquote>wsObject.getFoo()
,wsObject.getFoo().getBar()
,wsObject.getFoo().getBar().getBaz()
в некоторых переменных. Я не делаю этого, потому что я не знаю возвращаемых типов этих функций.Любые предложения будут оценены .. !!
Документация для -[NSCollectionView visibleItems]
:
Этот массив может содержать элементы, которые находятся за пределами фактического видимого прямоугольника представления коллекции. Например, он может содержать элементы, которые были недавно видны, но с тех пор были прокручены вне поля зрения. Чтобы проверить, является ли элемент действительно видимым, проверьте, пересекает ли его прямоугольник рамки visibleRect представления коллекции.
blockquote>Итак, вот функция, которая выполняет этот тест, возвращая только фактически видимые элементы:
- (NSArray<NSCollectionViewItem*> * _Nonnull) trulyVisibleItemsInCollectionView:(NSCollectionView*)collectionView { NSMutableArray<NSCollectionViewItem*> *result = [NSMutableArray array]; NSArray<NSCollectionViewItem *> *items = collectionView.visibleItems; NSRect viewRect = collectionView.visibleRect; for (NSCollectionViewItem *item in items) { if (NSIntersectsRect(item.view.frame, viewRect)) { [result addObject:item]; } } return result; }
Это все еще затрудняет эффективное управление очередью рендеринга, хотя:
Когда вызывается my
collectionView:itemForRepresentedObjectAtIndexPath:
, представления еще не добавляются в collectionView, поэтому еще слишком рано определять, следует ли запланировать эту плитку для немедленного рендеринга.Таймер может использоваться для периодической проверки того, какие элементы видны, и перемещения их в начало очереди. Его не следует использовать для принятия решения о том, добавлять ли элементы в очередь, потому что, если таймер срабатывает слишком рано после создания объекта плитки, он еще не будет добавлен в представление, что приведет к большей задержке до рендеринг начинается. Поэтому я считаю, что лучше всего добавлять элементы в средство визуализации, как только он узнает, что они могут быть необходимы, но измените порядок очереди, как только станет ясно, какие элементы будут видны, а какие нет.