2011-10-17 5 views
2

내 응용 프로그램에서 웹 서비스를 호출하고 객체 배열로 구문 분석되는 JSON을 가져 오는 몇 곳이 있습니다. 시간이 많이 소요되는 부분은 확실히 웹 서비스 호출입니다. 다음과 같이 내가 원하는 동작은 다음과 같습니다UIActivityIndicator가있는 UIAlertView가 너무 늦게 나타납니다/스레딩 문제

  1. 사용자가 ActivtiyIndicator의 서브 뷰와 AlertView 새로운 VC에
  2. 데이터 부하를 추가 현재보기에 관심
  3. 의 행을 선택
  4. 새로운보기는
  5. AV 표시기를 표시 사라짐

내 VC에는 기본적으로 표시되는 데이터 배열을로드하는 doLoadData 메서드가 있습니다 각 VC별로. 예를 들어 :

AnimalViewController는 버튼을 누르면 않는다는 것을 "보기 개"가 :

DogViewController *vc = [[DogViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
[vc release];

DogViewController 재산 NSArray *dogs 잠시 일이 걸리는 방법 doLoadDogs을 가지고 있습니다.

현재 나는 "보기 개"방법이 있습니다

  1. 푸시는
  2. 는 AlertView
  3. 숨기기
  4. 그것이
  5. 벤처를 만들기들보기 ActivityIndicator와 함께 AlertView 만들기
  6. 해제 및 지정하지 않음

이것은 어려운 일이 아니지만 아직 스레드로이 간단한 구현을 찾지 못했습니다.

답변

1

네트워크 호출/배열 작성에 긴 시간이 걸리고 주 스레드에있는 경우이 모든 작업은 본질적으로 동시에 발생합니다. 경고보기를 표시하거나 탐색 컨트롤러를 밀어 넣는 등의 작업을 수행 할 때 실제로 실행중인 것은 실행 루프의 다음 회전에서 이러한 일이 발생하도록 예약하는 것입니다. "개보기"방법은 모든 것이 완료 될 때까지 본질적으로 차단하기 때문에 모든 것이 필요할 때까지 실행 루프가 다시 실행되지 않습니다.

가장 좋은 해결책은 네트워크로드 코드를 제외하고 주 스레드/메인 이벤트 루프를 차단하지 않는 것입니다. 빠른 수정으로 GCD를 사용하여 현재 "View Dogs"방법을 분석 할 수 있습니다. 몇 가지 개선

- (void)viewDogs:(id)sender 
{ 
    dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
    // create and schedule the alert view 
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle...]; // your real alert view 
    dispatch_async(mainQueue, ^{ [alert show]; }); 
    dispatch_async(mainQueue, ^{ 
    DogViewController* vc = [[DogViewController alloc] init]; 
    [[self navigationController] pushViewController:vc animated:YES]; 
    [vc release]; 
    dispatch_async(mainQueue, ^{ [alert dismissWith...]; [alert release]; }); 
    }); 
} 
+0

이 (위의 코드 블록),하지만 지금 무슨 일입니다 : 예를 들어 (분명이 실제 요구 사항/코드를 업데이트 할 필요가있을 것이다) viewDogs이라는 일시 정지, 새로운 화면 (와 데이터 및 활동 표시기)가 나타나면 활동 표시기가 사라지고 검은 색 모서리가 사라집니다. 내가 원하는 일은 viewDogs가 호출되어 loadDogs가 끝날 때까지 해당 화면에 활동 표시기를 표시 한 다음 새 화면을 표시합니다. –

+0

@ jshin47 예, 좋지 않습니다. 가장 좋은 방법은 로딩 코드를 차단하여 차단하지 않고 완료되었을 때 어떤 식 으로든 사용자에게 알리는 것입니다. GCD를 사용하여이 작업을 수행하는 것은 상대적으로 쉽지만 한 가지 방법으로 모든 작업을 수행하고 싶지는 않습니다. –

+0

@JasonCoco 다른 스레드에서 performselector 대신 dispatch_async를 사용하는 이유는 무엇입니까? –

관련 문제