1

NSTimer を使用して UIProgressView を更新し、1 秒ごとに進行状況が 0.1 ずつ増加するようにしています。

-(void)updateBar{
     NSLog(@"Increase by 0.1");
     pbar.progress=pbar.progress+0.1;
 }

 -(void)foo{
    NSLog("START Foo");
    //Does some stuff that takes about 10sec
    NSLog("FINISH Foo");
 }

 -(void) viewDidLoad{
     pbar = [[UIProgressView alloc] initWithFrame:CGRectMake(-280, 500, 730, 90)];
     pbar.progressViewStyle = UIProgressViewStyleDefault;
     pbar.progressTintColor = [UIColor colorWithRed:68.0/255 green:186.0/255 blue:41.0/255 alpha:1.0];
     pbar.progress = 0.0;
     pbar.transform = CGAffineTransformMakeRotation(90 * M_PI / 180.0);
     [self.view addSubview:pbar];

     [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(updateBar) userInfo:nil repeats: YES];

     [self foo];
 }

したがって、理想的には、foo メソッドの実行中に UIProgressView の進行状況が増加します。ただし、タイマーは foo メソッドが終了した後に開始されるため、コンソールは次のようになります...

START Foo
FINISH Foo
Increase by 0.1
Increase by 0.1
Increase by 0.1
And so on ....

なぜこれが起こるのでしょうか?さらに重要なことは、foo が呼び出される前に、どうすればやりたいことを実行し、タイマーの実行を開始できるかということです。

4

2 に答える 2

0

呼び出している特定のメソッド " " は、現在のscheduledTimerWithTimeInterval実行ループでタイマーを実行します。これは、タイマーが起動する前に "foo" が実行する理由を説明しています。

別の(バックグラウンド)スレッドで物事を実行したい場合は、スレッドを作成して切り離し(またはブロック、ここに役立つ関連する質問があります)、別のスレッドで同じ呼び出しを実行してみませんか。もちろん、UI に関連することをしている場合は、メイン スレッドで実際の UI の更新を行う必要があります。そのため、タイマーが別のスレッドで実行されている間、実際の UI 処理はメイン スレッドで実行されます (" performSelectorOnMainThread:" などを介して)。

于 2012-11-01T00:22:10.767 に答える
0

- (void) updateBarメソッドは実行ループで延期されますが、は- (void) fooすぐに実行されます。

NSTimerコードを実装したので、タイマーを終了するために使用する への参照 (具体的にはインスタンス変数) がありません。

メソッドの最後で変数を使用して- (void) foo、タイマーを停止します。

于 2012-11-01T00:24:05.017 に答える