関連するすべての質問を読みましたが、私はまだ立ち往生しています。メインスレッドから更新が呼び出されてもUIが更新されない
私はUIViewを定期的に更新しようとしています。簡単にするために、私はコードを以下のものに減らしました。要約:viewDidLoadでは、新しいバックグラウンドスレッドでメソッドを呼び出します。そのメソッドは、UILabelを更新するはずのメインスレッド上のメソッドを呼び出します。コードは正しく動作しているようです:バックグラウンドスレッドはメインスレッドではなく、UILabel更新を呼び出すメソッドはメインスレッド上にあります。コードでは:のviewDidLoadで
:
[self performSelectorInBackground:@selector(updateMeters) withObject:self];
これは新しいバックグラウンドスレッドを作成します。
if ([NSThread isMainThread]) { //this evaluates to FALSE, as it's supposed to
NSLog(@"Running on main, that's wrong!");
}
while (i < 10) {
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];
//The code below yields the same result
// dispatch_async(dispatch_get_main_queue(), ^{
// [self updateUI];
// });
[NSThread sleepForTimeInterval: 1.05];
++i;
}
最後に、のupdateUIだけではない:私は知っているすべてのために
if ([NSThread isMainThread]) { //Evaluates to TRUE; it's indeed on the main thread!
NSLog(@"main thread!");
} else {
NSLog(@"not main thread!");
}
NSLog(@"%f", someTimeDependentValue); //logs the value I want to update to the screen
label.text = [NSString stringWithFormat:@"%f", someTimeDependentValue]; //does not update
、これは動作するはずです(簡単にするために)私の方法のupdateMetersは、次のようになります。しかし、それは残念なことに... dispatch_async()
のコメントは同じ結果をもたらしません。
「someTimeDependentValue」とは何ですか?私が思う浮動小数点。 –
NSTimerを使ってみましたか?おそらく、viewDidLoadでは、NSTimerを起動します。チックでは、あなたのUIの更新を実行してください。 2つの独立した自己参照プロセスを1つのビューで使用すると、少し混乱することがあります。 – Jeremy
@RaphaelAyresはい。 – Tom