2016-04-08 7 views
0

ボタンを押すと別のスレッドが開始され、読み込み中のアニメーションが表示されます。これを行う理由は、ボタンを押すとすぐにロード中のgifが表示され、他の手順が続行され、アラートが完了すると表示されるためです。私が持っている問題は、アラートが閉じられた後にアニメーションが隠れていることです。別のスレッドでタスクが完了した後に、1つのスレッドで実行中のアニメーションを非表示にしています

- (IBAction)buttonPressed:(id)sender { 
    [NSThread detachNewThreadSelector:@selector(loadAnimation) toTarget:self withObject:nil]; 

    ... do other things; 

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Complete" message:@"other things done" delegate: self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
    [alert setTag:1]; 
    [alert show]; 
} 

-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (alertView.tag == 1) { 
     loadingGif.hidden=YES; 
    } 
} 

ロードGIF:

- (void) loadAnimation { 
loadingGif.hidden=NO; 
NSArray *imageArray = [[NSArray alloc] initWithObjects:[UIImage imageNamed:@"0.gif"], [UIImage imageNamed:@"1.gif"], [UIImage imageNamed:@"2.gif"], [UIImage imageNamed:@"3.gif"], nil]; 

loadingGif = [[UIImageView alloc] initWithFrame:CGRectMake(487, 520, 50, 50)]; 
[self.view addSubview:loadingGif]; 
loadingGif.animationImages = imageArray; 
loadingGif.animationDuration = 1.5; 
[loadingGif startAnimating]; 
} 

アニメーション負荷罰金はなく、アラートからOKがクリックされたら、それは停止しません。メインスレッドが別のスレッドで開始された後にアニメーションをメインスレッドから隠すことは可能ですか?

答えて

1

メインスレッド以外のスレッドでUIを変更する必要があるかどうかはわかりません。別のアプローチは、すぐにアニメーションを表示し、その後すぐに実行されるように他のものをスケジュールするNSTimerを使用することです:

- (IBAction)buttonPressed:(id)sender { 

    // load animation on the main thread 
    [self loadAnimation]; 

    // start a timer to do other stuff in 1 ms (will get executed on main thread) 
    [NSTimer scheduledTimerWithTimeInterval:0.001 
     target:self 
     selector:@selector(doOtherStuff) 
     userInfo:nil 
     repeats:NO]; 
} 

- (void)doOtherStuff { 

    ... do other things; 

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Complete" message:@"other things done" delegate: self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
    [alert setTag:1]; 
    [alert show]; 
1

私はsetHiddenのように動作していないので、「loadAnimation」または「UIAlertView」はバックグラウンドで実行されていると思いますあなたは欲しい。

- -

は、なぜあなたはと

「メインスレッドで実行されている」「あなたの仕事が完了するまで待つ」ことを確認するために、次のようにコードを変更しない

Iを変更しました私は不必要なバックグラウンドブロックを使用して申し訳ありません。 もう一度ご確認ください。

- (IBAction)buttonPressed:(id)sender 
{ 
    [self loadAnimation]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    //  ... do other things 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Complete" message:@"other things done" delegate: self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
      [alert setTag:1]; 
      [alert show]; 
     }); 
    }); 
} 

-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (alertView.tag == 1) 
    { 
     loadingGif.hidden=YES; 
    } 
} 
+0

答えに感謝します。それは同様の(警告なしで)読み込み用GIFを隠すので、それを説明します。私はそれにgoを与えるでしょう。ありがとう – RGriffiths

+0

@RGriffiths不要なブロックを削除するために私のコードを変更しました。申し訳ありません。 – negaipro

関連する問題