2014-12-10 3 views
0

활동 표시기를 시작하는 데 여러 가지 방법을 검토했지만 올바르게 동기화하는 것이 다소 어려워 보입니다. 아래 코드에서는 아무 것도 깨지지 않지만 마지막 순간까지 Activity 모니터 아이콘 (throbber)이 나타나지 않아 다음보기로 전환됩니다.UIActivityMonitor Out of Sync

사용자가 UITable 내의 요소 중 하나를 두드리면 JSON 응답을 얻고 사용자가 다음보기로 이동합니다. 완벽하게 작동합니다. ActivityIndicator가 앞에서 설명한 것처럼 늦게 나타나는 것을 제외하고는.

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

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    spinner.frame = CGRectMake(0, 0, 24, 24); 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    cell.accessoryView = spinner; 
    [spinner startAnimating]; 

    timer = [NSTimer scheduledTimerWithTimeInterval:3.0/1.0 target:self selector:@selector(loading) userInfo:nil repeats:YES]; 

    //Go to the next view 
    if ([cell.textLabel.text isEqualToString:@"Vatsim Pilots"]) { 
     VatsimViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"newview"]; 
     [self.navigationController pushViewController:detail animated:YES]; 
    } 
} 

NSStimer 기능을 사용하려고했지만 분명히 작동하지 않습니다. 다른 사람들이 JSON 서비스를 사용하지는 않지만 본 적이 있습니다. 나는 데이터가 어디서 왔는지는 중요하지 않다고 생각했을 것이다. 그리고 데이터가 준비되었을 때만 신경 써야 할 것이다.

미리 감사드립니다.

답변

1

문제는 현재 CATransaction이 끝날 때까지 (모든 코드가 완료된 후) 회전이 시작되지 않는 것입니다. 하지만 코드가 JSON 응답이 돌아 오기 전까지는 코드가 완료되지 않습니다. 여기서는 코드에서 분명히 표시되지 않았으므로이 상호 작용을 동 기적으로 수행하기 때문입니다.

하지 마십시오. 당신은 동 기적으로 네트워킹해서는 안됩니다! 그렇게 할 때 주 스레드를 차단하고 있습니다. 너무 오래 수행하면 WatchDog 프로세스가 앱을 죽게 만듭니다.

따라서 스피너가 시작되지 않는다는 사실은 실제로 당신이 잘못하고있는 것보다 훨씬 더 심각한 것의 징후입니다.

귀하의 문제에 대한 해결책은 회 전자 회전을 시작한 다음 즉시 주 스레드에서 내려서 CATransaction이 종료 될 수 있도록하는 것입니다. 회 전자가 실제로 회전하기 시작합니다! 다음 때 코드를 다시 입력하면 (내 책에서)이 코드로 시간이 많이 소요되는 탐색을 시작할 수 있습니다 : 예 다운로드 여기하는지

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // ... start spinner here ... 
    // now get off main thread 
    double delayInSeconds = 0.1; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     // ... now do time-consuming stuff ... 
     // ... and finally, navigate: 
     UIViewController *detailViewController = [ViewController new]; 
     [self.navigationController pushViewController:detailViewController animated:YES]; 
    }); 
} 
+0

: https://github.com/mattneub/ Programming-iOS-Book-Examples/tree/master/iOS7bookExamples/bk2ch12p564timeConsumingNavigation – matt

+0

감사합니다. Matt, 필자는 동기 네트워킹이 아닌 어딘가를 읽었다. 즉 NSData * 데이터 = [NSURLConnection sendSynchronousRequest : req returningResponse : nil error : & error]; if (error) { NSLog (@ "% @", [error localizedDescription]); – Jeremy

+0

BTW 훌륭한 사례! – Jeremy