2011-10-21 4 views
1

나는 여러 탭보기 항목이있는 NSTabView입니다. 사용자가 특정 버튼을 클릭하면 탭 뷰가 이러한 항목 중 하나로 변경되어 웹 사이트 API에서 반환 된 항목을 표시합니다. 중간 탭보기 항목을 만들어 사용자에게 데이터를 가져 오는 중임을 알려주고 한 번 가져 오면 데이터가 표시됩니다.한 가지 방법으로 nstabview 항목을 두 번 변경하십시오.

[tabView selectTabViewItemAtIndex:0]; // This is the intermediate tab 
/* 
    Fetching 
    data from 
    the api 
    here 
*/ 
[tabView selectTabViewItemAtIndex:1]; // Displaying the data tab 

그러나 첫 번째 탭은 표시되지 않으며 마지막 탭은 표시되지 않습니다. 나는 데이터를 매우 빨리 가져 왔고 그것을 보여줄 시간이 없는지 궁금해했지만 중단 점을 중간에 설정했지만 여전히 변경되지 않았습니다. 그것은 결국 바뀌었을 것입니다, 이상한.

아이디어가 있으십니까?

업데이트 :

[tabView selectTabViewItemAtIndex:0]; // This is the intermediate tab 

dispatch_queue_t queue = dispatch_queue_create("com.mycompany.queue", 0); 
dispatch_async(queue, ^{ 
    /* 
     Fetching 
     data from 
     the api 
     here 
    */ 
    [tabView selectTabViewItemAtIndex:1]; // Displaying the data tab 
}); 
+0

UI는 런 루프 사이에서만 업데이트되므로 중간 탭을 선택하고 비동기 적으로 페치를 수행 한 다음 페치가 완료되면 다음 탭을 선택해야합니다. –

답변

2

데이터가 동 기적으로 동작 가져 오는 API를합니까 다음과 같이 답변

덕분에, 그것을 고정? 나는 그것이 기꺼이 내기를 기꺼이합니다.

사용자 인터페이스는 주 스레드에서 실행되는 실행 루프의 끝에서만 업데이트됩니다. 페치를 처리하는 API가 동일한 스레드에서 실행되는 경우 일이 같은 작업을 끝낼 예정 :

  1. 당신은 데이터를 가져 실행 루프
  2. 당신 선택 탭 인덱스 0
  3. 을 시작합니다. 1.

당신은 아마 당신의 데이터를 실행하는 데 필요한 탭 인덱스 표시

  • 당신 선택 탭 인덱스 1
  • UI를 업데이트, 백그라운드 스레드에서 루틴을 가져옵니다. 그런 다음 데이터를 반환하면 탭 인덱스 1을 선택하도록 NSTabView에 지시하십시오. 데이터 가져 오기가 백그라운드에서 발생하기 때문에 실행 루프는 UI를 두 번 이상 업데이트 할 기회가 주어져 탭 인덱스 0이 표시되어야합니다 (짧은 동안 어쨌든).

    몇 가지 다른 방법을 사용하여 데이터 가져 오기를 백그라운드에서 실행할 수 있습니다. 분명한 것은 Grand Central Dispatch를 사용하거나 NSObject 프로토콜의 일부인 메서드의 "performSelectorInBackground :"시리즈를 사용할 수도 있습니다.

    또한 메인 스레드에서 수행하는 작업에 대해 매우주의해야합니다. 웹 사이트에서 데이터를 가져 오는 데 어느 정도 시간이 걸릴 수 있습니다. 이 작업을 주 스레드에서 동 기적으로 실행하면 데이터 가져 오기가 완료되기를 기다리는 동안 사용자 인터페이스가 완전히 응답하지 않습니다. 애플은 멀티 스레딩에 대한 그들의 문서에서 이것에 대해 이야기했다. 바로 Grand Central Dispatch와 함께 멀티 스레딩을 훨씬 쉽게 해줍니다.

  • +0

    고맙습니다. GCD를 보니 매력처럼 작동합니다 :) – BytesGuy

    관련 문제