Unity 6.3
0 онлайн 97 гостей 3 в системе
Вход
Unity Editor interface Шаг 54 из 131

Выполнение поиска

Поставщики поиска используют функцию 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>.

Примечание: Если вы не используете асинхронную fetchItems API, вы должны возвратить 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;
        }
    }
}