2010-03-02 4 views
0

저는 UITableViewController가 있습니다. 특정 뷰를 스택에 푸시하면 영원히 걸리므로 이동하기 전에 셀에 회 전자를 추가하고 싶습니다. 내가 겪고있는 문제는 새로운 뷰가 컨트롤러 스택에 푸시 된 후에 스피너가 추가된다는 것입니다. 하지만 메시지가 동기 적이라고 생각 했나요?계산 작업이 많은 작업을 수행하기 전에보기에 회 전자를 추가하는 방법

그럼 다음보기로 이동하기 전에이 스피너 표시를 어떻게 만들 수 있습니까? 미리 감사드립니다!

- (void) 
    tableView: (UITableView *) tableView 
    didSelectRowAtIndexPath: (NSIndexPath *) indexPath { 

    UITableViewCell *cell = [ self.tableView cellForRowAtIndexPath: indexPath ]; 

    if (cell.accessoryType == UITableViewCellAccessoryDisclosureIndicator) { 
     UIActivityIndicatorView *activityIndicator = [ [ UIActivityIndicatorView alloc ] initWithFrame: CGRectMake(260.0, 10.0, 25.0, 25.0) ]; 
     activityIndicator.hidesWhenStopped = YES; 
     activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; 

     [ cell addSubview: activityIndicator ]; 
     [ activityIndicator startAnimating ]; 

     TableDemoViewController *newViewController = [ [ TableDemoViewController alloc ] initWithPath: cell.textLabel.text ]; 
     UINavigationController *navigationController = [ appDelegate navigationController ]; 
     [ navigationController pushViewController: newViewController animated: YES ]; 
     [ activityIndicator stopAnimating ]; 
    } 
} 

답변

1

TableDemoViewController를 초기화하는 것이 너무 집중적 인 경우 다른 문제가 발생합니다. 당신이 지적한 것처럼 메인 스레드는 동기식입니다. 몇 가지 옵션이 있습니다.

  • 회 전자를 추가 한 후 실행 루프를 한 번 돌리면 문제가 해결 될 수 있습니다. 두 가지 방법으로 메소드를 분할하고 두 번째 부분을 호출하여 performSelector:withObject:afterDelay:에서 0의 지연 시간으로 TableDemoViewController init을 호출하면됩니다.
  • init이 너무 비싼 이유를 알고 싶을 것입니다. 주 스레드. NSOperations 및 NSOperationQueue를 사용하는 방법을 배우는 것이 좋습니다. 위임자 패턴이나 NSNotificatin을 사용하여 비용이 많이 드는 작업이 언제 이루어 졌는지 발신자에게 알릴 수 있습니다.

일반적으로 이와 같이 주 스레드에서 처리를 차단하는 항목이있는 경우 문제가 발생합니다. 최대한 빨리 주 스레드에서 그걸 옮기고 싶습니다. 메인 스레드는 입력 이벤트와 애니메이션이 일어나는 곳입니다. 메인 스레드가 자유롭게 돌아갈 수있는 능력이 앱의 반응 속도를 높여줍니다. 사용자가 애플리케이션의 상태를 향상시킬 수는 없더라도 상호 작용할 수있는 항목이 많고 많이 볼 수 있음을 기억하십시오.

+0

지혜로운 것에 감사 드리며, 주 스레드에서 벗어나야한다는 것은 옳다. 고마워요! –

관련 문제