2017-12-04 18 views
0

키워드를 기반으로 내 렐름 테이블 중 하나에 대한 검색을 수행해야합니다. 검색 기능은 비동기 기능으로 수행되지만 상당히 느립니다. 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; 
      } 
     }); 

어떻게 검색 기능을 개선하기를 ?

답변

0

표현식이 아닌 함수를 작성하기 때문에 쿼리는 영역에 의해 평가되지 않고 객체에 대한 LINQ에 의해 평가됩니다. 즉, 모든 객체를 영역에서 가져와야 함을 나타냅니다. 그러면 액세스 된 특성이 하나씩 반입됩니다. 비교에 의해 사용될 하나씩 불행히도 필요에 따라 검색하는 모든 필드는 Realm .NET에서 아직 지원되지 않는 관련 객체를 탐색합니다.

이 문제를 해결하기위한 한 가지 방법은 데이터를 비정규 화하고 IssueTable 개체에서 이러한 속성을 복사하는 것입니다. 그럼 당신은 같은 쿼리를 실행할 수 있습니다 : 나는 IssueTable` 객체 '에 대한 자세한 속성을 추가 할 필요가 의미

var result = realm.All<IssueTable>() 
        // Note that the .Where overload we select uses Expression<Func<>> 
        // Also, StatusDisplayName is a copy of Status.DisplayName 
        .Where(i => i.StatusDisplayName || ...) 
        .OrderByDescending(i => i.UpdatedDate) 
        .ToArray() 
        .Select(i => i.Guid) 
        .ToList(); 
+0

을하며 두 단계 검색 스틸 사진 (1) 가이 목록을 (2)에 따라 객체를 검색을 지침 목록. 그것이 한 걸음이 될 수있는 방법이 있습니까? – currarpickt

+0

쿼리에 대한 스레드 안전 참조를 만들 수 있어야합니다. 다음과 같이 : 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 –