2011-10-21 14 views
1

私はNSTabViewにいくつかのタブ表示項目を持っています。ユーザーが特定のボタンを押すと、タブビューがこれらの項目のいずれかに変わり、WebサイトAPIから返されたものが表示されます。私は、データをフェッチしていることをユーザーに伝えるために、中間のタブ・ビュー項目を作成しようとしましたが、一度フェッチすると表示されます。1つの方法でnstabview項目を2回変更する

[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の更新、あなたはおそらく、バックグラウンドスレッドでルーチンをフェッチしてデータを実行する必要があります。データが返されたら、NSTabViewにタブインデックス1を選択します。データフェッチはバックグラウンドで実行されるため、実行ループはUIを複数回更新し、タブインデックス0が表示されるようにします(短い間にとにかく)。

    いくつかの異なる方法を使用して、データフェッチをバックグラウンドで実行できます。明らかなのは、Grand Central Dispatchを使用することです。また、NSObjectプロトコルの一部であるメソッドの「performSelectorInBackground:」シリーズを使用することもできます。

    また、メインスレッドでどのような操作を行うかについては非常に注意してください。ウェブサイトからのデータの取得にはしばらく時間がかかります。この操作をメインスレッドで同期して実行すると、データフェッチが完了するまでユーザーインターフェイスが完全に応答しなくなります。 Appleはマルチスレッドに関するドキュメントでこれについて語っています。これとグランドセントラルディスパッチは、マルチスレッド化をずっと簡単にします。

  • +0

    ありがとうございました。 GCDを見て、それは今の魅力のように動作します:) – BytesGuy

    関連する問題