0

웹 소켓 및 코어 데이터를 사용하여 채팅 응용 프로그램을 구축 중입니다.NSFetchedResultsController가 UI를 잠급니다.

기본적으로, 메시지가 웹 소켓을 통해 수신 될 때마다, 다음과 같은 상황이 발생 메시지 (색인) 이드

  • 1의 경우를 사용 페치 코어 데이터를 행하여 존재

    1. 선택하면 예를 반환하고 메시지를 업데이트하고 코어 데이터 저장을 수행합니다. 1. 1.이 아니오를 리턴하면 메시지를 작성하고 코어 데이터 저장을 수행하십시오.
    2. 새 행을 업데이트하거나 삽입하여 테이블보기를 업데이트하십시오.

      내가 가지고있는이 기본 관리 - 객체 컨텍스트 :

    여기 내 설정이다. MAIN (NSMainQueueConcurrencyType) 및 WRITER (NSPrivateQueueConcurrencyType)입니다. WRITER는 지속적 저장소 관리자에 대한 참조를 가지고 있지만 MAIN은 그렇지 않지만 WRITER는 MAIN의 부모로 설정됩니다.

    TableView는 MAIN에 연결된 NSResultsFetchController에 연결됩니다.

    가져 오기는 모두 MAIN을 부모로 가지는 임시 컨텍스트 ("performBlock :")를 사용하여 수행됩니다. 쓰기는 다음과 같습니다 : 임시 컨텍스트를 저장 한 다음 MAIN을 저장하고 WRITER를 저장하십시오.

    문제 : 업데이트가 웹 소켓을 통해 들어오고 있기 때문에

    은 바쁜 채팅 방에서 많은 업데이트는 짧은 시간에 발생합니다. 오래된 메시지를 가져 오기 위해 동기화하면 많은 메시지가 빠르게 유입 될 수 있습니다. 그리고 이것은 UI를 잠급니다.

    // called on main thread 
    - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
    { 
        NSLog(@"WILL CHANGE CONTENT"); 
        [_tableView beginUpdates]; 
    } 
    
    // called on main thread 
    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    { 
        NSLog(@"DID CHANGE CONTENT"); 
        [_tableView endUpdates]; 
    } 
    

    을하고 여기에 내가 로그 파일에 표시되는 내용의 예 :

    I는 다음과 같이 가져온-결과 컨트롤러의 대리자를 사용하여 UI의 변경 사항을 추적

    2014-07-14 18:46:20.630 AppName[4938:60b] DID CHANGE CONTENT 
    2014-07-14 18:46:22.334 AppName[4938:60b] WILL CHANGE CONTENT 
    

    입니다 인서트 당 거의 2 초!

    여기 테이블 뷰를 사용하면 간단히 한계점이 있습니까? (나는 어떤 경우에 대해서 1000+ 행에 대해서 이야기하고있다.) 그러나 나는 그것이 사실이라고 상상할 수 없다. UITableViews는 이러한 종류의 작업을 위해 매우 최적화되어 있습니다.

    내가 알기로는 분명한 초보자가 실수 일 수 있습니까?

  • +0

    로그에 표시된 시간 차이가 altog 적은 수의 행을 표시하기 위해 선택할 수 하나의 갱신 기간이 아니라 두 갱신 간의 차이. – Mundi

    +0

    @Mundi 예, 각주기가 얼마나 느린지 보여줍니다. – scrrr

    답변

    0

    좋습니다. 알아 냈습니다.

    문제는 tableView:heightForRowAtIndexPath:입니다. 행의 높이를 계산하는 가져 오기에는 시간이 걸릴 때마다 tableView가 필요합니다.endUpdates가 호출되면 UITableView는 모든 행에 대한 높이가 필요합니다.

    tableView:estimatedHeightForRowAtIndexPath:

    은 (iOS7에 +)를 갈 수있는 가능한 방법, 또는 나는 높이 자신을 캐싱 (행이 변경되지 않기 때문에)하거나

    0

    이 논리적되지 않습니다 : 다음 WRITER을 저장 주요 저장 한 후, 임시 컨텍스트를 저장 :

    는 다음과 같이 기록합니다.

    작가가 다음가 저장 될 때까지 변경 사항이 유지되지 않습니다 메인의 자식 컨텍스트 인 경우.

    +0

    Nono, 작가는 메인의 부모입니다. – scrrr

    관련 문제