搜索提供程序使用 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,则必须在fetchItems
函数中返回null
。
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
与同一提供程序的项目进行排序。较低的得分显示在项目列表的顶部(升序排序)。
当搜索提供程序需要很长时间才能计算其结果或依赖于异步搜索引擎(如 WebRequests)时,您可以使用异步 fetchItems
API。
要使用异步 API,请让 fetchItems
函数返回 IEnumerable<SearchItem>
。IEnumerable<SearchItem>
应该是一个产生结果的函数,以便 API 可以一次获取一个项目。
当返回 IEnumerable<SearchItem>
时,枚举器会被存储并在应用程序更新期间迭代。枚举会持续多个应用程序更新,直到完成。
迭代时间受到限制,以确保 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 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;
}
}
}