Выполнение поиска
Поставщики поиска используют функцию 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);
SearchProvider должны добавить новые SearchItemв список items или возвратить IEnumerable<SearchItem>.
Примечание: Если вы не используете асинхронную
fetchItemsAPI, вы должны возвратитьnullв вашей функцииfetchItems.
A 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);
Все элементы поиска сортируются относительно элементов того же поставщика по значению score. Элемент с меньшей оценкой отображается вверху списка (сортировка по возрастанию).
Асинхронный поиск API
Вы можете использовать асинхронный fetchItems API, когда поисковый провайдер тратит много времени на вычисление результатов или использует асинхронную поисковую систему, такую как WebRequests.
Чтобы использовать асинхронный API, функция fetchItems должна возвращать IEnumerable<SearchItem>. Функция IEnumerable<SearchItem> должна выдавать результаты, чтобы API мог получать по одному элементу за раз.
Когда возвращается IEnumerable<SearchItem>, перечислитель сохраняется и итерируется во время обновления приложения. Перечисление продолжается в течение нескольких обновлений приложения до тех пор, пока оно не будет завершено.
Время итерации ограничено, чтобы гарантировать, что UI не будет заблокировано. Однако, поскольку вызов находится в главном потоке, вы должны убедиться, что поддаётесь как можно скорее, если результаты не готовы.
В следующем примере показано, как использовать асинхронный fetchItems API:
public class AsyncSearchProvider : SearchProvider
{
public AsyncSearchProvider(string id, string displayName = null)
: base(id, displayName)
{
fetchItems = (context, items, provider) => FetchItems(context, provider);
}
private IEnumerable<SearchItem> 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;
}
}
}