Документация для -[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, поэтому еще слишком рано определять, следует ли запланировать эту плитку для немедленного рендеринга.Таймер может использоваться для периодической проверки того, какие элементы видны, и перемещения их в начало очереди. Его не следует использовать для принятия решения о том, добавлять ли элементы в очередь, потому что, если таймер срабатывает слишком рано после создания объекта плитки, он еще не будет добавлен в представление, что приведет к большей задержке до рендеринг начинается. Поэтому я считаю, что лучше всего добавлять элементы в средство визуализации, как только он узнает, что они могут быть необходимы, но измените порядок очереди, как только станет ясно, какие элементы будут видны, а какие нет.
Вы правы, это не предотвращает спаммеров. Все, что это делает, создают другое препятствие для пользователей, пытающихся использовать Ваш сайт. Это - что-то, что Вы действительно хотите? Необходимо удалять препятствия, не создавая их. Это кажется на решение проблемы, Вы даже не знаете, что собираетесь иметь или нет.
Это проверяет:
Действительно - это не препятствует тому, чтобы боты приняли электронные письма от своего собственного почтового ящика, но это останавливает их принимающий электронные письма из моей учетной записи... это в свою очередь не допускает Вас в легальное болото того, чтобы быть обвиняемым в спаме некоторой случайной Jo. Все побеждают.
Это удостоверяется, что пользователь является фактическим владельцем адреса электронной почты. Вы не хотите, чтобы они вошли в просто чей-либо адрес электронной почты и начали иметь сообщения от Вашего сайта, посланного по электронной почте случайным людям.
У меня есть учетная запись Gmail с коротким именем пользователя, и часто получаю электронную почту, не предназначенную для меня, часто чувствительного материала как данные пароля или идентификаторы отправки. Это происходит, потому что некоторые люди просто не знают свой собственный адрес электронной почты. Если бы было некоторое подтверждение адреса электронной почты, то я не должен был бы переносить это, и их конфиденциальность была бы сохранена.
Все это зависит от того, насколько Вы думаете, что Ваши пользователи будут терпеть.
Если выполняющий интернет-магазин, Вы хотите минимизировать количество контрольно-пропускных пунктов по пути или пользователя, можно выбыть до завершения покупки.
Если это - онлайн-форум или подобный затем, пользователь может быть открыт для прохождения через большего количества обручей.
Если это - бесплатная онлайн газета, которая требует, чтобы проверенная регистрация просто читала, люди могут просто пойти в другое место вместо беспокойства.
Необходимо сбалансировать то, что пользователь будет терпеть с потребностями сайта и предложениями.