2013-12-12 2 views
0

Facebook 앱처럼 무한 스크롤을 구현하려고합니다.메인 스레드를 잠그지 않고 UITableView insertRow

페이스 북은 현재 스크롤을 멈추지 않고 어떻게 든 행을 삽입하거나 테이블 뷰를 다시로드하는 것처럼 보입니다.

아무도 그들이 이것을 달성하는 방법을 알고 있습니까?

스크롤하는 동안 행 삽입 또는 데이터 다시로드를 호출하면 스크롤이 중지됩니다. 어떤 도움을 주시면 감사하겠습니다.

일반적인 UITableView 기능을 제공하기위한 코드는 많지 않습니다.

[self.tableView insertRowsAtIndexPaths:self.paths withRowAnimation:UITableViewRowAnimationNone]; 

또는

[self.tableView reloadData]; 

self.paths

경로는 최근에 다음 페이지 요청을 통해 첨가된다.

는 또한 reloadData 호출되면서 이제 제대로 작동 다음과 같은 방법

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath; 

을 추가했습니다. 불행하게도 이것은 셀의 추가 속도를 높이는 반면 여전히 현재 스크롤을 잠급니다.

+1

주 스레드를 차단하고있는 *'insertRowsAtIndexPaths : ... '전에 처리가 완료되지 않았습니까? 아마도 당신은 데이터를 파싱하고 객체를 만드는 등 부드러운 스무딩을 멈출 수 있습니다. 아마도 전체 방법을 보여줄 수 있습니다. –

+0

Facebook의 제 버전이 UITableView의 맨 아래에 도달하면 새로운 콘텐츠를로드 중임을 나타내는 진행 표시기가 표시되며 콘텐츠를 가져올 때까지 스크롤 할 수 없습니다. 현재 스크롤을 멈추지 않는다는 것은 무슨 뜻입니까? – ramzyo

+0

@ramzyo - 말하자면 맨 아래로 치고 다시 스크롤하면 모든 종류의 도약없이 스크롤됩니다. – Steve

답변

1

그래, 현재 활성 스크롤의 중지에 관한 한 문제는 한 줄의 코드로 내려갔습니다. 그리고 그 해결책은 그만큼 작았습니다.

내 TableView에 새로 고침 컨트롤이 있습니다. TableView에 대한 다음 데이터 집합을받는 메서드에서 다음을 호출합니다.

  [refreshControl endRefreshing]; 

endRefreshing이 단순히 아무것도 수행하지 않는다면 상쾌하지 않았다고 생각했습니다.

음 ... 분명히 사실이 아닙니다. 새로 고치지 않는 새로 고침 컨트롤에서 endRefreshing을 호출하면 테이블 뷰 스크롤이 중지됩니다. 내 수정은 다음과 같습니다.

 if(refreshControl.isRefreshing){ 
     [refreshControl endRefreshing]; 
    } 

이제 약간의 지연으로 다음로드 후에도 스크롤이 계속됩니다. 지연은 물론 디버그하기가 더 쉽습니다. 그래서 지금은 모든 것이 정리가된다는 사실을 시간이 오버 헤드는

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath; 

가없는 한 재로드를 호출 할 때 모든 셀에 호출 추가되는 세포의 높이를 계산에 포함 된 단지에 대한의

합리적으로 가까운 예상 신장을 계산할 수있는 효율적인 방법을 만들 수 있습니다.

+0

제 제안은 데이터를 파싱하는 동안 높이를 계산하고 캐시하는 것입니다. 셀이 화면에 나타날 때까지 미리 계산 된 값을 반환하면됩니다. –

+0

나는 당신의 제안을 따라 갔다. 새 셀 높이 계산을 실행하는 배경 스레드가 있습니다. 이 작업이 끝나면 테이블을 메인 스레드에 다시로드합니다. 지금 나를 놀라게하는 것은 내가 기존 셀을 스크롤 할 때 재로드가 호출되면 여전히 약간의 일시 중지가 표시된다는 것입니다. 페이스 북 앱이 다시로드되는 속도와 아직 경쟁하지 않고있는 것은 당연하다고 생각합니다. 누락 된 것이 여전히 존재해야하지만 행에 대한 셀이라는 것은 의심 스럽지만 배열에서 float를 반환하는 높이입니다. 그 밖의 무엇이 문제인지 생각해보십시오. – Steve

+0

로딩 프로세스를 먼저 시작해야할까요? 그들이 마지막 세포에있을 때까지 기다리는 대신, 바닥에서부터 10 세포가 될 때 시작하십시오. –

관련 문제