0

このラベルに関連するコードのみをプログラムに含めました。

私のviewDidLoadメソッドでは

[startLabel setHidden:NO];
startLabel.text = @"Touch to Begin";

touchesBegan メソッドでは、次に持っています

startLabel.text = @"Loading . .";
[self fillArrays];

次に、fill Arrays メソッドで、配列を埋めてから、ラベルを非表示にします -

 self.myArray = [NSArray arrayWithObjects:
             [UIImage imageNamed:@"Frame 1.png"], . .etc etc etc . . . nil]];

 [startLabel setHidden:YES];

ただし、配列がロードされる前にテキストは更新されません。その結果、「Loading . .」というテキストが表示されません。配列がいっぱいになった後に実装されているようです。

同時に setHidden bool が YES に設定されているため、ラベルは表示されません。

これには時間がかかるため、メソッドが配列を埋め始める前に startLabel を更新したいと思います。つまり、メソッドが順番に動作します。

これは可能ですか?

ありがとうございました

4

2 に答える 2

1

マルチスレッドは必要ありません。それは物事を過度に複雑にしています。問題は、コードが返されるまで UIKit がユーザー インターフェイスを更新しないことです。そのため、ユーザー インターフェイスの更新をスケジュールし、配列をロードしてから制御を UIKit に戻し、UIKit がユーザー インターフェイスの更新を実行します。ユーザー インターフェイスの更新をスケジュールし、コントロールを UIKit に戻し、実行ループの次の反復で配列をロードする必要があります。これを行うにはperformSelector:withObject:afterDelay:、次の実行ループ反復でメソッド呼び出しを実行するゼロ遅延で使用できます。これでうまくいくはずです:

startLabel.text = @"Loading . .";
[self performSelector:@selector(fillArrays) withObject:nil afterDelay:0];
于 2012-08-21T11:27:47.123 に答える
0

GUI の更新とは別のスレッドで配列をロードする必要があります。

この記事を参照してください: http://evilrockhopper.com/2010/01/iphone-development-keeping-the-ui-responsive-and-a-background-thread-pattern/

必要な機能はperformSelectorInBackgroundです

そうすれば、UI の更新とバックグラウンドの作業を同時に行うことができます。

同様の方法で、メイン スレッドのラベルを更新する別の関数を実行することもできます。

performSelectorOnMainThread

そうすれば、バックグラウンドで配列をロードし、メイン スレッドで UI を更新します (UIKit はスレッド セーフではないと思うので、これは良いことです。

于 2012-08-21T10:49:49.483 に答える