0

私は2つの基本的な方法 - viewDidLoadviewDidAppearを持っています。私のApp哲学によると、View Controllerが読み込まれると、ベースからデータがフェッチされ、いくつかの述語でソートされます。フェッチプロセスが長いので、グローバルキューにディスパッチしました。私のビューが表示されたら、明らかに配列(loadメソッドでコンパイルされる)から値を取得せず、クラッシュします。少なくとも1つのオブジェクトが配列に追加されるまで待機するには、viewDidAppearが必要です。 セマフォーまたは一時的な値の種類? ありがとうございます!単純な非同期スレッドからの値を待つ

P.S.配列内の各項目は、UIを構成するデータでstructを表します。ユーザーはこのUIとやり取りするので、配列の最初の項目で一度読み込む必要があります。次の項目に切り替えるには、ユーザーが「次へ」をクリックし、配列の次の項目に従ってUIが変わります。そのため、データをバックグラウンドで取得し、ユーザーがすぐに作業できるようにしたいのです。 (それはすぐに5日、10日または1001番目の要素にジャンプすることは不可能だ、ユーザーがこれらのページ番号になる前にデータをフェッチするための十分な時間があるでしょう)まだ右の決定:(

+2

は聞かないで、知らせる非同期完了ブロックを使用して、データアレイを設定/終了ブロックのテーブルビューをリロード – vadian

+0

@vadianが、残念ながらそれが「フリーズ」しますとのインタフェース。長い "進行状況バー"の読み込み –

+0

あなたのUIはフェッチされたデータに依存するべきではありません。インターネットc接続は利用できません。その場合でもあなたのUIは反応します。実際のデータが利用可能になるまで、プレースホルダまたは空のデータを表示します。 – user3441734

答えて

0

あなたは、ネストされたを使用しなければならない

PPSは、派遣ブロック、そうのように:。

func fetch(completion block:(() -> Void)?) { 
    // Run fetch on background thread, to prevent the main thread (and hence your UI) from being 'blocked'. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     // 
     // Fetch data... 
     // 

     dispatch_async(dispatch_get_main_queue(), { 
      block?() 
     }) 
    }) 
} 

fetch(completion: { 
    // Update your UI 
}) 
+0

ええ、それについて考えましたが、正しく理解すると、配列に追加された各項目の後にUIが更新されます。私は配列の平均3000から5000のアイテムを持っています。 1秒で5〜10個のアイテムを取り出すことができるので、5〜10個のUIアップデートが表示されますか?実際、各項目はstructをデータで表しています。私はアイテムの構造体からのデータで全体のUIを構成します。ユーザーはこのデータと対話できます。テキストを書き、トリガーをいくつかクリックすると、UIが更新されると、ユーザーは作業プロセスを緩めることができます。 –

+0

この状況では、すべてのデータを最初にフェッチすることができます(時間がかかることがあります)。または、UIを「徐々に」読み込むことができます。私が意味することは、1000個のアイテムがあり、それぞれがフェッチしているデータに依存していると言うことです。その場所*に「一時的」なビュー*を読み込む必要があります。次に、データが取得されたら、実際のビューをその場所にロードします。このようにして、ユーザーは、他のコンポーネントがまだロードされている間に、すでにフェッチされたデータに依存するUIコンポーネントと対話できます。お役に立てれば! – Jason

+0

これは最も簡単な方法だと思われますが、何らかの理由で待機時間が長くなりすぎることがあり、ユーザーは進行状況バーに座って見ています。それは問題です、私はすぐに作業を開始するユーザーをしたい –

関連する問題