2014-12-05 2 views
0

나는 이것을 수행하는 방법을 찾기 위해 일주일을 보냈습니다.하위보기가 표시 될 때까지 기다렸다가 처리 한 다음 하위보기를 제거합니다.

내가하고 싶은 일은 서브 뷰를 표시 한 다음 http 호출을 백엔드로 호출 한 다음 서브 뷰를 제거하는 것입니다.

... 
//Display view 
[superView addSubview:blurredOverlay]; 
[superView bringSubviewToFront:blurredOverlay]; 

//After blurredOverlay is displayed, Try to login the user 
dispatch_group_t d_group = dispatch_group_create(); 
dispatch_queue_t bg_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_group_async(d_group, bg_queue, ^{ 
    //Try to login user 
    success = [self loginUser]; 
    NSLog(@"Success=%i", success); 
    [NSThread sleepForTimeInterval:10.0]; //here to force thread to not return immediatly 
}); 
dispatch_group_wait(d_group, DISPATCH_TIME_FOREVER); 

//Remove the view after the thread is done processing 
[blurredOverlay removeFromSuperview]; 

이것은 작동하지 않습니다. 내가 가지고있는 경우

[blurredOverlay removeFromSuperview]; 

주석 처리되지 않은 상태에서는 blurredOverlay가 표시되지 않습니다. 내가 주석 처리하면 blurredOvleray가 표시되지만 분명히 제거 할 수는 없습니다.

먼저 blurredOverlay를 표시 한 다음 blurredOverlay가 표시되어있는 동안 사용자를 로그인하고 loginUser가 반환 한 후에 흐린 표시를 제거해야합니다.

+0

여러 가지 다양한 dispatch_group_async 변형을 시도했지만 새로운 스레딩과 도움이되지 않았습니다. – lr100

+0

dispatch_groups를 사용하는 대신 NSURLSession 또는 NSURLConnection의 sendAsynchronousRequest를 사용하고 완료 블록에서 오버레이를 제거하십시오. – rdelmar

답변

1

이 블록을 비동기 대기열에 보냅니다. 메인 블록은 블록이 완료 될 때까지 기다리지 않습니다. 하지만 이미 알고 있습니다. 그래서 디스패치 그룹을 사용하여 백그라운드 작업이 완료 될 때까지 주 스레드를 차단합니다.
이 방법의 문제점은 runloop이 현재 반복을 마친 후에 UI가 새로 고쳐진다는 점입니다. 그리고 그것은 당신의 방법이 남을 때까지는 일어나지 않습니다.

  • UI는
  • 당신의 방법을 입력
    • 에 블록보기
    • 파견 블록
    • 대기를 추가 시스템에 의해 업데이트됩니다

      이 코드가 실행될 때 일어나는 것이다 완료

    • 보기 제거
  • UI 당신은 문제를 볼 수있는 시스템

으로 업데이트됩니다 귀하의 방법을두고? 보기를 추가하고 제거하는 사이에 UI가 업데이트되지 않습니다.

다음은 수행해야 할 작업입니다. 보기를 추가합니다. 백그라운드에서 실행되도록 작업으로 블록을 보내십시오. 해당 배경 블록의 끝에서 백그라운드 작업이 완료 될 때 실행할 다른 블록을 발송합니다. 이 블록은 주 스레드에서 실행되며보기를 제거합니다.

[superView addSubview:blurredOverlay]; 
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(backgroundQueue, ^{ 

    // run your web request here 
    [NSThread sleepForTimeInterval:10.0]; 

    // task is done 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // UI updates have to run on the main thread, so dispatch the removal 
     [blurredOverlay removeFromSuperview]; 
    }); 
}); 
+0

나는 또한 이것을 시도한 것을 맹세 할 수 있었다. 작동하지 않아야합니다! 유일한 것은 내 // 웹 요청에 AlertView가 있다는 것입니다. 돌아오고 blurredOverlay를 없애고 다음 runloop주기까지 기다렸다가 경고를 표시합니다. blurredOverlay가 제거되기 전에 경고가 표시되어야합니다. 그것으로 주위를 어지럽히 지마. 정말 고마워! – lr100

관련 문제