0

핵심 데이터 DB를 사용하여 "검색 할 때 검색"을 구현하고 있습니다. NSFetchedRequestController과 잘 작동합니다. 그러나 이제는 사용자로부터의 거리 (상점 목록)별로 결과를 정렬하라는 기능 요청을 받았습니다. 사용자가 검색 결과에 "e"라고 쓰면 약 7000 개의 결과가 나오고 iOS 기기는 거리별로 주문하려면 2-3 초가 걸리며 UI는 멈 춥니 다. 정렬 요청을 다른 스레드로 보내는 것에 대해 생각했지만 사용자에게 무엇을 보여줄 것입니까? 또한 요청을 보내고 다른 문자를 입력하면 어떻게됩니까? 그가 유형을 입력하고 몇 번 삭제하면 많은 스레드에서 많은 컴퓨팅 성능을 요구하게 될 것입니다."검색 할 때 입력하십시오."검색 결과가 너무 오래 걸림

이 문제를 해결하기위한 아이디어가 있습니까? 모든

+1

가져 오기 요청을 제한하십시오. 그 당시 7000 개의 결과가 모두 필요하지는 않습니다. 사용자가 스크롤하는 동안 다른 부분을 게으른로드 할 수 있습니다. – BoranA

+0

요청은 시간과 같은 30 개 결과가 마음에로드 게으른,하지만 당신은 그렇게하지 않도록 모두 인출 요청 제한 및 정렬 설명을 가져 줄 수 –

+0

.. 모든 저장하지 않고 가장 가까운 매장을 얻을 수있는 방법을 프로그래머 없다 정렬을 위해 모든 결과가 필요합니다. – BoranA

답변

0

먼저 -> 시간 프로파일 - 악기를 통해 코드의 가장 문제 부분이 무엇인지 분석 할 수 있습니다. 어쩌면 당신은 코드 내부에서 문제를 겪을 수 있습니다. 이것은 재 작성으로 해결할 수 있습니다. 그것은 도움이되지 않는 경우 , 나는 당신에게 그런 것들을 제안 : 1) 가장 쉬운 - 기능을 제거 일초에서 검색하고 입력을 시작 사이의 지연을 :) 2) "검색을 입력하는 동안"- 사용자는 검색하지 않는 입력하는 동안 너무 , 그리고 나서 사용자가 타이핑을 멈 추면 그렇게합니다. 3) 변경 DB 모델은 - (예를 들어 상점에 대한 일부 지역을 추가하고, 지역의 사용자 만 지역에서 상점을 검색하면 그냥 DB 모델과 당신이 그것을 개선 할 수있는 방법 일을) 더 자세히 살펴 할 4). 배경 및 공연 활동 표시에서 검색이

0

를 검색하는 동안 당신이 여기에서 사용자 경험을 최적화 할 수있는 몇 가지가있다.

하나의 옵션은 사용자에게로드 표시기 (예 : https://github.com/jdg/MBProgressHUD)를 표시하고 백그라운드에서 처리 할 수있는 정렬을위한 NSOperation을 만드는 것입니다. 사용자가에 추가 문자를 입력하기 위해 계속되면

NSOperationQueue 여기 예를 들어, 작업을 취소 할 수 있다는 장점이 있습니다 것입니다 예를 들어

:.

// Interface 

@property (nonatomic, strong) NSOperationQueue *sortQueue; 

// Implementation 

self.sortQueue = [[NSOperationQueue alloc] init]; 
[self.sortQueue addOperationWithBlock:^{ 
    //Sort results here 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     //Update UI here 
    }); 
}]; 

사용자가 입력 한 경우 더 텍스트, 당신은 수행하여 보류중인 종류를 취소 할 수 있습니다

[self.queue cancelAllOperations]; 

그리고 새로운 종류의 대기.

+0

나는 그것을 시도 할 것이다, GSD는 내가 생각했던 것보다 훨씬 더 유용하다. 왜 내가 그것에 대해 뭔가를 가지고 있는지 모르겠다. –

+3

cancelAllOperations는 생각만큼 유용한 것은 아닙니다. '[NSOperation cancel]'은 실제로 작업을 중지 시키지는 않지만 오히려 자체 작업을 중지시키는 작업에 달려 있습니다. 정렬 작업이 정기적으로 CanCellelled를 확인하지 않으면 완료 될 때까지 계속 실행됩니다. 그러나 아직 시작하지 않은 작업은 시작하기 전에 취소되므로 많은 작업이 대기열에 저장되는 것을 방지합니다. –

+0

고려해야 할 또 다른 옵션은 문자를 입력 할 때 즉시 요청을 시작하지 말고 문자를 입력 할 때마다 타이머를 시작하고 타이머가 경과 할 때만 정렬을 시작합니다 (그리고 타이핑이 중지됨) –