2014-02-09 4 views
0

2 셀 섹션이있는 정적 셀이 있습니다. 한 섹션에는 2 개의 행이 있고 다른 섹션에는 단일 행이 있습니다. 첫 번째 섹션의 셀 중 하나가 최대 1 분이 걸릴 수있는 작업을 수행합니다 (데이터베이스에서 많은 양의 데이터를 해독 한 다음 다시 암호화 함)tableview 정적 셀 동적 바닥 글

작업이 진행 중이며 멈추지 않았 음을 사용자에게 알리기 위해, 나는 다음과 같은 작업을 수행 할 시도하고 :.

문제가 (아래 내 실제 코드의 의사입니다) :doStufffooterString이 표시되지 않는

그러나 callDoStuff의 하나가 잘 표시됩니다 .. 어떤 아이디어가 잘못 되었나요?

- (void) doStuff 
{ 
    for (int i=0; i<[resultsArray count]; i++) 
    { 
     rec1 = [decrypt record1]; 
     footerString = [@"Preparing item : " stringByAppendingString:rec1]; 
     [self.tableView reload]; 
     rec2 = [decrypt record2]; 
     ... 
     ... 
     ... 
     rec10 = [decrypt record10]; 
    } 
} 

doStuff가 다른 함수에서 호출되어

- (void) callDoStuff 
{ 
    [self doStuff]; 
    footerString = @"Done preparing items"; 
    [self.tableView reload]; 
} 

나는 배경 스레드에서 내 tableviewcontroller

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section 
{ 
    if (section == 0) 
     return footerString; 
    else 
     return @""; 
} 

답변

1

당신은해야 당신의 계산에 다음 않아도됩니다. 여기에 UILabel에 새 값을 할당하지만 주 스레드는보기를 새로 고칠 시간이 없습니다.

- (void) callDoStuff 
{ 
    [self doStuff]; 
} 

- (void)doStuff { 
    dispatch_async(dispatch_queue_create("myqueue", NULL) , ^(void) { 
     // Here you enter in another thread 
     for (int i=0; i<[resultsArray count]; i++) 
     { 
      rec1 = [decrypt record1]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       // Here you send message to your UILabel in your main thread 
       footerString = [@"Preparing item : " stringByAppendingString:rec1]; 
      }); 
      [self.tableView reload]; 
      rec2 = [decrypt record2]; 
      ... 
      rec10 = [decrypt record10]; 
     } 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Here you send a callback 
      [self doOtherStuffAfterDoStuff]; 
     }); 
    });  
} 

- (void)doOtherStuffAfterDoStuff { 
    footerString = @"Done preparing items"; 
    [self.tableView reload]; 
} 

그렇다면 사용자의 UI가 미세하게 업데이트되어야합니다.

+0

감사합니다. 오늘 밤 시도하고 그것이 작동하는 경우 답변을 표시합니다! – rkh

+0

큰 작업이 끝나면 다른 콜백을 추가 한 다음 테이블을 다시로드해야합니다. – AncAinu

+0

잘 작동하지만 문제는'doStuff'가 끝날 때까지 기다리지 않고 계속 실행된다는 것입니다 ... 이것은 내 목적에 문제가 있습니다 ... 어쨌든'doStuff' 실행이 끝날 때까지 기다려야합니까? – rkh