2012-03-22 2 views
0

저는 UITableView와 맞춤형 셀을 가지고 있습니다. 셀에 나는 UILabel이 있지만, 텍스트를 UILabel로 설정하기 전에 다른 텍스트의 텍스트를 찾고 텍스트를 강조 표시 한 다음 레이블로 설정합니다. 그래서 목록을 스크롤하면이 힘든 일 때문에 지연이 있습니다. 성능 향상 방법에 대한 아이디어가 있습니까? 어쩌면 다른 스레드에서 모든 노력을 할 수 있을까요 ??iPhone : UITableView를 통한 원활한 스크롤

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: 
     (NSIndexPath *)indexPath { 
static NSString *customCellIdentifier = 
    @"CellIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: 
    customCellIdentifier]; 
if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomTableRow" 
     owner:self options:nil]; 
    if (nib.count > 0) { 
     cell = self.customTableRow; 
    } 
} 

    self.myLabel.text = [self giveMeTheTextThatINeed]; 

return cell; 
} 

[self giveMeTheTextThatINeed] - 약간의 시간이 걸리는 텍스트에 대해 열심히 노력했습니다.

답변

1

는 새로운 스레드를 확인 모든 세포에. 이 스레드는 [self giveMeTheTextThatINeed : indexPath]를 호출하고 셀의 레이블을 다시 설정합니다. 데이터를 더 빨리 얻을 수 없다고 가정하기 때문에 테이블에서 스크롤을 유지하고 스레드를 열심히 돌리고 싶습니다. 스레드가 완료되면 셀을 업데이트하십시오. 미리보기 이미지가있는 셀에서 많은 것을 볼 수 있습니다. 미리보기 이미지는 잠시 후에 업로드되며 비어 있거나 처음에는 자리 표시자가 있습니다.

+0

그게 최선의 방법이라고 생각합니다. 튜토리얼 호가 그걸 깨닫고 있습니까? – Jim

+0

정말 그다지 그다지 중요하지 않습니다. 스레드 풀 호출에서 메소드를 랩핑하십시오 : NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; ARC를 사용하지 않는 경우 [poo release]; 그런 다음 [pool release] 직전에 - (void) reloadRowsAtIndexPaths : (NSArray *) indexPaths withRowAnimation : (UITableViewRowAnimation) 애니메이션을 호출합니다. –

0

필요한 값을 사전 계산할 수있는 방법은 없습니까? 즉, 앱이 시작될 때 (다른 스레드에서) "힘든 일"을 시작하고 어딘가에 저장하면 테이블보기에서 요청할 때 준비 할 수 있습니다. 열심히하는 일과 우리가 말하는 데이터의 양에 대해 자세히 설명하지 않고 대답하는 것은 어렵습니다.

당신은 여전히 ​​뭔가를에서 tableView:cellForRowAtIndexPath:까지 부여해야하므로 제안한 다른 스레드에서 열심히하고있는 것에 대해 잘 모릅니다. 처음에는 일종의 템플릿 셀을 반환 할 수 있다고 가정하고 열심히하면 reloadRowsAtIndexPaths:withRowAnimation:으로 업데이트합니다.

0

giveMeTheTextThatINeed 메소드는 현재 셀을 매개 변수 (또는 셀 내용에 따라 다른 매개 변수) 중 하나 (예 : [self giveMeTheTextThatINeed:indexPath])로 가져와야한다고 생각합니다. 그렇지 않으면 텍스트를 인스턴스 변수로 저장하고 해당 변수의 모든 셀에 텍스트를 설정할 수 있습니다. 당신은 지금

self.myLabel.text = [self->myDictionary objectForKey:indexPath]; 

:

이러한 점에 유의하여 가장 쉬운 방법은 indexPath (또는 다른 매개 변수) 열쇠가 될 것입니다 추가로 사전에 계산의 결과를 저장하는 것입니다 두 세포가 그려지기 전에 (예 : viewWillAppear에서) 그 사전을 미리 채우거나 세포가 스크롤 할 때 그들은, 다시 계산되지 않도록 그들이 계산 한 번 그들을 캐시 할 수 것은 예 :

NSString* calculatedText = [self->myDictionary objectForKey:indexPath]; 
if(calculatedText == nil) 
{ 
    calculatedText = [self giveMeTheTextThatINeed:indexPath]; 
    [self->myDicationary setValue:calculatedText forKey:indexPath]; 
} 
self.myLabel.text = calculatedText; 
관련 문제