2014-02-19 2 views
2

MBProgressHUD 웹에서 JSON 데이터를로드 할 때 표시 할 사용자 정의 컨트롤을 사용하고 있습니다.MBProgressHUD가 iOS에서 언젠가 표시되지 않습니다

나는 HUD 컨트롤이보기에 올바르게 표시되지 않는 많은 답변을 이미 발견했습니다.

내보기에 HUD을 표시하는 코드입니다.

[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 

다음은 내 HUD보기를 숨기는 방법입니다.

[MBProgressHUD hideHUDForView:self.view animated:YES]; 

ViewDidLoad에서 해당 컨트롤이 정상적으로 작동합니다.

그러나 새로 고침 버튼을 클릭하고 HUD 제어를 표시하려면 HUD 제어를 표시하지 않습니다.

[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 

dispatch_queue_t myqueue = dispatch_queue_create("queue", NULL); 
dispatch_async(myqueue, ^{ 

    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:nil waitUntilDone:YES]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tbl reloadData]; 
     [MBProgressHUD hideHUDForView:self.view animated:YES]; 
    }); 
}); 

내가 뭘 잘못하고 있는지 모르겠다. 도와주세요.

+1

파견을해도 모든 작업이 기본 대기열에 있습니다! 그러면 UI가 차단되고 HUD가 표시되지 않습니다. – Jack

+0

내 코드를 편집하려면 어떻게해야합니까? –

+0

fetchedData를 호출 해 봅니다. 주 스레드에서 수행하는 대신 직접 실행하고 모든 것이 여전히 작동하는지 확인하십시오. – Jack

답변

9
이에 코드를 전환

:

[MBProgressHUD showHUDAddedTo:self.view animated:YES]; 

dispatch_queue_t myqueue = dispatch_queue_create("queue", NULL); 
dispatch_async(myqueue, ^{ 

    //Whatever is happening in the fetchedData method will now happen in the background 
    [self fetchedData:nil]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tbl reloadData]; 
     [MBProgressHUD hideHUDForView:self.view animated:YES]; 
    }); 
}); 

메인 스레드에서 fetchData 메소드를 호출하지 않습니다. 위의 코드를 사용하는 경우 fetchedData 메서드의 아무 것도 주 스레드에서 발생하지 않으므로 UI ​​또는 그 안에있는 항목을 업데이트하지 않도록하십시오.

그냥 제안하면, 나는 dispatch_queue"queue"이라는 이름을 사용하지 않을 것입니다. 앱 전체의 대기열 이름은 고유해야하므로 나중에 문제가 발생하지 않도록 "your.bundle.id.viewcontrollername"과 같은 이름으로 지정해야합니다.

+0

감사합니다. 이제 코드로 알았습니다. :) –

관련 문제