2011-07-29 3 views
0

테이블보기가있는 다중 스레드 응용 프로그램이 있습니다. 다른 스레드에서 백그라운드로 데이터를 수집합니다. 문제는 사용자가 테이블을 스크롤 할 때 데이터 수집 속도가 무려 75 % 나 느려지는 것입니다. 수집 할 데이터가 너무 많기 때문에 가능한 경우 표 스크롤을 사용하면 데이터 수집 속도를 15 % 이상 줄일 수 있습니다.UITableVIew의 성능을 어떻게 향상시킬 수 있습니까?

사용자가 화면에서 손가락을 떼면 TableView 만 다시 그리게 할 수 있습니까? 사용자 경험에 대해 걱정하지 마십시오. 걱정하지 마세요. 속도를 낼 수있는 아이디어가 있다면 그 아이디어를 듣고 싶습니다.

+1

테이블을 스크롤하면 연결 속도가 느려 집니까? Instruments의 Time Profiler 툴을 사용해 보셨습니까? 테이블을 다시 그려 내면서 경기 침체의 진정한 원인이 무엇입니까? – sergio

+0

하지만 스레드가 완료되면 데이터 셀로드에 NSNotification을 사용하지 마십시오. 데이터가 테이블 뷰에서로드 될 준비가되었습니다.이 링크를 통해 이동하십시오. http://www.raywenderlich.com/4295/multithreading-and- 그랜드 센트럴 디스패치 - 온 - 초보자 - 튜토리얼 NSNotification을 사용하면 스크롤의 재사용 속도가 필요하지 않을 것 같아요 ... – DShah

답변

0

병목 현상과 같은 사운드는 백그라운드에서의 "데이터 수집"이므로이를 공격하는 것이 좋습니다. 테이블 뷰 컨트롤러를 표시하기 전에 많은 양의 데이터를 미리 가져 와서 메모리에 캐싱 해 볼 수 있습니다.

특히 복잡한 경우 셀의 일부만 다시 그려 볼 수도 있습니다 (예 : 텍스트 만 이미지가 아닌). 값 비싼 작업을 수행하려면 지연 시간이 0 인 셀렉터를 수행하면 실행 루프의 다음 반복으로 던져 버릴 것입니다 (좋은 전략입니다).

생각해 볼 수있는 가장 좋은 방법은 Time Profiler (시간 프로필러)를 사용하여 계측기를 실행하고 대부분의 CPU를 빨아들이는 것을 공격하는 것입니다.

0

사용자가 드래그 할 때 dequeueReusableCellWithIdentifier에서 nil을 반환 할 수 있습니다. self.tableView.dragging 또는 self.tableView.trackingself.viewTable.decelerating (드래그 또는 트랙이 끝나기 직전임을 알리기 위해)을 호출하여 사용자가 그렇게하는지 확인할 수 있습니다.

+0

그 던져 예외하지만 제안 주셔서 감사합니다. self.viewTable.decelerating을 사용하지 않으면 빈 셀을 반환하여 약간의 속도를 절약 할 수 있지만 충분하지는 않습니다. 비록 내가 텅 빈 세포를 그냥 반환하더라도, 그것은 충분히 빠르지 않습니다. – Randall

관련 문제