Провайдеры поиска используют функцию fetchItems
для поиска элементов и фильтрации результатов. Функция fetchItems
имеет следующую подпись:
// context: the necessary search context (for example, tokenized search and
// sub-filters).
// items: list of items to populate (if not using the asynchronous api)
// provider: the Search Provider itself
public delegate IEnumerable<SearchItem> GetItemsHandler(SearchContext context,
List<SearchItem> items,
SearchProvider provider);
The SearchProvider
must add new SearchItem
s to the items
list or return an IEnumerable
.
Примечание. Если вы не используете асинхронный API
fetchItems
, вы должны вернутьnull
в вашей функцииfetchItems
.
SearchItem
– это простая структура:
public struct SearchItem
{
public readonly string id;
// The item score affects how Search sorts the item within the results from the Search Provider.
public int score;
// Optional: Display name of the item. If the item does not have one,
// SearchProvider.fetchLabel is called).
public string label;
// If the item does not have a description SearchProvider.fetchDescription
// is called when Search first displays the item.
public string description;
// If true, the description already has rich text formatting.
public SearchItemDescriptionFormat descriptionFormat;
// If the item does not have a thumbnail, SearchProvider.fetchThumbnail
// is called when Search first displays the item.
public Texture2D thumbnail;
// Search Provider user-customizable content
public object data;
}
Для SearchItem
требуется только id
.
Совет. При фильтрации по
SearchContext.searchText
используйте статическую функциюSearchProvider.MatchSearchGroup
, которая выполняет частичный поиск.
Использование нечеткого поиска
Чтобы использовать нечеткий поиск для элемента, вы можете использовать FuzzySearch.FuzzyMatch
, как в следующем примере:
if (FuzzySearch.FuzzyMatch(sq, CleanString(item.label), ref score, matches))
item.label = RichTextFormatter.FormatSuggestionTitle(item.label, matches);
Все элементы поиска сортируются по элементам одного и того же поставщика с их оценкой
. Меньшая оценка отображается вверху списка элементов (сортировка по возрастанию).
API асинхронного поиска
Вы можете использовать асинхронный API fetchItems
, когда поисковому провайдеру требуется много времени для вычисления результатов или он полагается на асинхронную поисковую систему, такую как WebRequests.
Чтобы использовать асинхронный API, функция fetchItems
возвращает IEnumerable
. IEnumerable
должен быть функцией, которая выдает результаты, чтобы API мог получать по одному элементу за раз.
Когда возвращается IEnumerable
, перечислитель сохраняется и повторяется во время обновления приложения. Перечисление продолжается в течение нескольких обновлений приложения, пока оно не будет завершено.
Время итерации ограничено, чтобы гарантировать, что UI(пользовательский интерфейс) позволяет пользователю взаимодействовать с вашим приложением. В настоящее время Unity поддерживает три системы пользовательского интерфейса. Подробнее
См. в Словарь не заблокирован. Однако, поскольку вызов находится в основном потоке, вы должны как можно скорее выполнить его, если результаты еще не готовы.
В следующем примере показано, как использовать асинхронный API fetchItems
:
public class AsyncSearchProvider : SearchProvider
{
public AsyncSearchProvider(string id, string displayName = null)
: base(id, displayName)
{
fetchItems = (context, items, provider) => FetchItems(context, provider);
}
private IEnumerable FetchItems(SearchContext context, SearchProvider provider)
{
while(ResultsNotReady())
{
yield return null;
}
var oneItem = // Get an item
yield return oneItem;
var anotherItem = // Get another item
yield return anotherItem;
if(SomeConditionThatBreaksTheSearch())
{
// Search must be terminated
yield break;
}
// You can iterate over an enumerable. The enumeration
// continues where it left.
foreach(var item in someItems)
{
yield return item;
}
}
}
AssetStoreProvider.cs
: запрашивает Asset Storeрастущую библиотеку бесплатные и коммерческие активы, созданные Unity и членами сообщества. Предлагает широкий спектр ресурсов, от текстур, моделей и анимации до целых примеров проектов, руководств и расширений редактора. Подробнее
См. в Словарь с помощью WebRequest.ESS.cs
: создает процесс для запуска индексатора поиска Entrian Source, который обеспечивает полнотекстовый поиск активов в вашем проекте.