2012-05-04 9 views
3

私は様々なラベルを持つViewControllerを持っています。これらのラベルのそれぞれは、htmlページで実行されているさまざまな正規表現構文解析ロジックに基づいて実行時に動的に生成されます。問題は、各正規表現のマッチは2〜3秒かかっており、8個のラベルがあるので、ビューが表示される前に20〜25秒程度待たなければならないということです!ビュー内のさまざまな要素(ラベルのデータ)をレイジー/非同期に読み込む方法は?

これは非常に悪いユーザーエクスペリエンスです。私はこれをユーザーにはあまり苦痛にならないようにしたいので、正規表現が処理された後にデータを取得し、8つのラベルすべてが正規表現マッチの検索を終了するのを待たずに、それぞれのラベルを独立してロードする必要があります。

これは何らかの形でiOS 5で実現できますか?

答えて

2
  1. 必要な値を算出し、別の関数を作成します。
    (コードの可読性/保守性のために既にこれを持っているでしょう)
  2. このスレッドをバックグラウンドスレッドで実行します。
  3. あなたが実際にテキストを設定する準備ができたら、あなたはメインスレッドでそれを行うことを確認してください:

ここでは一例です:のviewDidLoadで

- (void)calculateLabelText { 
    NSString *label1Text = // However you calculate this... 
    dispatch_async(dispatch_get_main_queue(), ^(void) { 
     self.label1.text = label1Text; 
    }); 

    NSString *label2Text = // However you calculate this... 
    dispatch_async(dispatch_get_main_queue(), ^(void) { 
     self.label2.text = label2Text; 
    }); 
} 

、これを追加します。

[self performSelectorInBackground:@selector(calculateLabelText) withObject:nil]; 
1

Grand Central Dispatch(GCD)を使用してください。それはあなたのためのキューやスレッドなどを処理します。 1回だけ実行される一連の操作のためのメソッドを作成する必要はありません。また、dispatch_async()は、バックグラウンドスレッドでセレクタを実行するよりも速く、既存のコード構造を維持することができます。メインスレッドをブロックしないバンドル:

//グローバルな並行キューへの参照を取得する(独自のものを作成する必要はありません)。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 
各ラベルの正規表現の操作のための

{

dispatch_async(queue, ^{ 
    // your regex here for one 

    // execute back in the main thread since UIKit only operates in the main thread. 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [myLabel setText:<result of operations>]; 
    }); 
}); 

}

0

これを使用する場合は、コードを分けるために注意が必要です。 1つの部分はデータ読み込み作業を行い、もう1つは制御するデータを設定します。あなたはsqlite(私はあなたがこのdbを使用すると仮定している)マルチスレッドで涼しいことを確認する必要があります。

関連する問題