키워드를 기반으로 내 렐름 테이블 중 하나에 대한 검색을 수행해야합니다. 검색 기능은 비동기 기능으로 수행되지만 상당히 느립니다. 9000 데이터를 검색하고 결과를 표시하는 데 3-5 초가 소요됩니다.비동기 함수에서 영역을 검색하고 주 스레드에서 결과를 사용하십시오.
검색은 세 단계로 수행됩니다 쿼리를 기반으로
- 검색 가이 드의 목록을 반환
- 반환 가이 드의 목록
- 를 사용하여 결과 값을 기준으로 개체의 목록 내가
SearchIssueInProject
에서 직접List<IssueTable>
을 반환 할 때 내가 때문에 나중에 해당 속성에 액세스 할 수 있으며, UI
를 업데이트 "이 영역 인스턴스가 닫혔습니다" (이와 비슷한 것).
public async Task<List<IssueTable>> GetFilteredIssuesInProject(string query)
{
if (!string.IsNullOrEmpty(query))
{
var searchResults = await Task.Run(() => SearchIssueInProject(query));
return searchResults.Select(i => RealmConnection.Find<IssueTable>(i)).ToList();
}
return this.AllIssuesInProject;
}
List<string> SearchIssueInProject(string query)
{
using (var realm = Realm.GetInstance(RealmConfiguration))
{
Func<IssueTable, bool> searchIssue = d =>
string.IsNullOrEmpty(query) ? true :
Contains(d.Id.ToString(), query) ||
Contains(d.Status.DisplayName, query) ||
Contains(d.Status.Value, query) ||
Contains(d.Team.Name, query) ||
Contains(d.Team.Initial, query) ||
Contains(d.StandardIssueCategory.Title, query) ||
Contains(d.StandardIssueType.Title, query) ||
Contains(d.Drawing.Title, query) ||
Contains(d.Location.Title, query) ||
Contains(d.CreatedBy.DisplayName, query) ||
Contains(d.UpdatedBy.DisplayName, query);
var result = realm.All<IssueTable>().Where(searchIssue)
.OrderByDescending(i => i.UpdatedDate)
.Select(i => i.Guid)
.ToList();
return result;
}
}
public List<IssueTable> GetAllIssues()
{
return RealmConnection.All<IssueTable>()
.OrderByDescending(i => i.UpdatedDate)
.ToList();
}
기능 포함 :
이
내 검색 기능입니다public static bool Contains(string source, string filter)
{
return source.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0;
}
그리고 이것은 내가 검색 기능 사용 방법은 다음과 같습니다
this.WhenAnyValue(x => x.ViewModel.IssueSearchQuery)
.Throttle(TimeSpan.FromMilliseconds(1000), RxApp.MainThreadScheduler)
.DistinctUntilChanged()
.Do(_ =>
{
this.IssueAdapter.Issues.Clear();
})
.Select(searchTerm =>
{
if (SearchingProgressDialog == null && Activity != null)
{
ShowLoadingProgress();
}
var result = this.ViewModel.GetFilteredIssuesInProject(searchTerm);
return result
.ToObservable()
.ObserveOn(RxApp.MainThreadScheduler);
})
.Switch()
.Subscribe(searchResult =>
{
this.IssueAdapter.Issues.AddRange(searchResult);
this.IssueAdapter.NotifyDataSetChanged();
if (SearchingProgressDialog != null)
{
SearchingProgressDialog.Dismiss();
SearchingProgressDialog = null;
}
});
어떻게 검색 기능을 개선하기를 ?
을하며 두 단계 검색 스틸 사진 (1) 가이 목록을 (2)에 따라 객체를 검색을 지침 목록. 그것이 한 걸음이 될 수있는 방법이 있습니까? – currarpickt
쿼리에 대한 스레드 안전 참조를 만들 수 있어야합니다. 다음과 같이 : var query = realm.All() .Where (...). OrderByDescending (...);', tsr :'var queryReference = ThreadSafeReference.Create (query);'를 작성하십시오. 그런 다음 주 스레드에서'var query = realm.ResolveReference (queryReference); '를 할 수 있습니다. 자세한 내용은 문서를 확인하십시오. https://realm.io/docs/dotnet/latest/#passing-instances-across-threads –