2012-07-12 6 views
0

나는 테이블 뷰를 가지고 있으며, 사용자가 행을 선택하면이를 새로운 ViewController로 푸시합니다. 처음에는 ViewDidLoad 메서드 (웹 서비스 호출 포함)에서 모든 뷰 객체를 초기화했지만 내 tableview에서 새로운 뷰 컨트롤러로 전환하는 것을 보았습니다.UI가 응답하지 않는 동안 viewdidappear

대신에 ViewDidAppear 메서드에서 대부분의 UI 초기화를 옮겼으며 tableview에서 새로운 viewcontroller로 전환하는 속도가 빨랐습니다.

그러나 내 ViewDidAppear 메서드가 완료되고 UI가로드 될 때까지 화면의 맨 위에있는 내 탐색 모음의 단추 (예 : 뒤로 단추)를 누르지 못합니다.

이 솔루션은 무엇입니까? 사용자가 내 NavigationBar의 버튼과 상호 작용하지 못하도록하지 않으면 서 내 UI를로드 할 수있는 또 다른 방법이 있습니까?

감사합니다.

+0

당신이 ViewWillAppear의 초기화 작업을 수행하려고 있나요? –

+0

네, 시도했습니다. 그것은 tableview에서 새로운 ViewController 로의 전환을 느리게하는데, 나는 그것을 좋아하지 않는다. 나는 아직도 부드러운 전환을 원한다. – user1467188

+0

당신은 주 스레드에서 너무 많은 일을합니다. –

답변

-2

보십시오 당신은, 당신의 웹 서비스 비동기 호출을 할 그랜드 센트럴 파견을 사용할 수 있습니다 당신은 ViewDidLoad

+1

백그라운드에서 UI로 작업하면 충돌이 발생할 수 있습니다. 그래서 이것은 좋은 이상이 아닙니다. – Daniel

0

이를 호출 할 수있는 다음과 같은 방법

[self performSelectorInBackground:@selector(initYourUI) withObject:yourObj]; 

를 사용하여 배경에서 UI를 초기화하는 메인 쓰레드의 UI를 반응 적으로 유지할 것이다. 메인 스레드에

http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial

+0

그게 메인 스레드에서 그들을 지킬 것입니다 - 당신이 의미하는 것 같아요 생각하지 않아요 –

+0

@ Daij-Djan 맞아, 고마워요 - 이제는 수정해야합니다 –

+0

당신은 누출하지만 기본 아이디어는 이제 맞습니다 :) –

0

당신이 너무 많은 :

//create new queue 
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.siteName.projectName.bgqueue", NULL); 

//run requests in background on new queue 
dispatch_async(backgroundQueue, ^{ 
    //insert web service requests here 
}); 

여기에 좀 더 깊이있는 튜토리얼입니다. IO 또는 더 긴 계산과 같은 더 긴 연산을로드하지만 백그라운드 스레드의 UI를 엉망으로 만들지 않도록주의하십시오.

메인 스레드의 UI 만 터치합니다.

하나 쉬운 방법은 사용하는 GCD입니다 (안전하게 보일 수 있습니다 가끔 있습니다 만, 장기적으로는 항상 생산 이상한 문제를 끝낼) :

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ 
    //insert web service requests/computations/IO here 

    dispatch_async(dispatch_get_main_queue(),^{ 
     //back to the main thread for UI Work 
    }); 
}); 
관련 문제