3

さまざまなラベルが付いた ViewController があります。これらの各ラベルは、html ページで実行されるさまざまな正規表現解析ロジックに基づいて、実行時に動的に設定されます。問題は、各正規表現の一致に 2 ~ 3 秒かかり、そのようなラベルが 8 つあるため、ビューが表示されるまで約 20 ~ 25 秒待たなければならないことです。

これは非常に悪いユーザー エクスペリエンスです。これにより、ユーザーの負担を軽減し、正規表現の処理後にデータを取得したときに各ラベルを個別にロードし、8 つのラベルすべてが正規表現の一致の取得を完了するのを待ちません。

これをios 5で実現する方法はありますか?

4

3 に答える 3

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

次に例を示します。

- (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;
    });
}

viewDidLoad で、これを追加します。

[self performSelectorInBackground:@selector(calculateLabelText) withObject:nil];
于 2012-05-04T19:25:15.203 に答える
1

グランド セントラル ディスパッチ (GCD) を使用します。キューやスレッドなどを処理します。一度発生する一連の操作のためだけにメソッドを作成する必要はありません。それにもかかわらず、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>];
    });
}); 

}

于 2012-05-04T19:24:54.353 に答える
0

これを使用する場合は、コードを分離するために注意を払う必要があります。1 つの部分はデータの読み込み作業を行い、もう 1 つの部分はデータをコントロールに設定します。そして、マルチスレッドでクールなsqlite(このデータベースを使用したと思います)を確認する必要があります。

于 2013-01-25T03:39:38.223 に答える