2016-04-06 25 views
0

非常に簡単な設定で少し質問を更新しました。 appdelegate.h /メートルで複数の警告表示を連続して表示:最後の表示のみを表示

、viewcontroller.m

@property() UIAlertView *dialog; 

-(void) showDialog:(NSString *)message { 
    if (!dialog) { 
     dialog=[[UIAlertView alloc] initWithTitle:xx]; 
    } 
    [dialog performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES]; 
} 

-(void) dismissDialog { 
    if(dialog) { 
    [dialog dismissWithClickedbuttonIndex:0 animated:YES]; 
    dialog=nil; 
    } 
} 

ボタンでのみ、最後の "START3は" 久しぶりに表示されます

-(IBAction) clicked:(id)sender { 

dispatch_async(dispatch_get_main_queue(), ^{ 
    AppDelegate *_app = xxx; 
    [_app showDialog:@"start1"]; 
    sleep(10); 
    [_app dismissSyncDialog]; 

    [_app showSyncDialog:@"start2"]; 
    sleep(10); 
    [_app dismissSyncDialog]; 

    [_app showSyncDialog:@"start3"]; 
    sleep(10); 
    [_app dismissSyncDialog]; 
}); 
} 

をクリックします。

メインスレッドがフリーズしているように見えます。そのため、「start3」はスレッドが完了した後にのみ表示されます。

この問題を解決する方法はありますか?ありがとう。

+0

showSyncDialogの最初の呼び出しは、メインスレッドまたはバックグラウンドスレッドで実行されますか? – Binni

+0

メインスレッドです。問題なく表示されます。 – user534498

答えて

0

移動[_app showSyncDialog:@ "start"];内部ディスパッチ非同期... alertviewがメイン以外のスレッドで表示されている場合、UIがハングします

+0

これは「開始」も消えます。 「start3」だけが表示されます。 – user534498

0

メインスレッドを取得するには、このコードを使用します。

double delayInSeconds = 1.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    // some stuff 1 

    [self dismissSyncDialog]; 
    [self showSyncDialog:@"start2"]; 

    // some other stuff 2 

    [self dismissSyncDialog]; 
    [self showSyncDialog:@"start3"]; 

    // some other stuff 3 

    [self dismissSyncDialog]; 
}); 
+0

ありがとうございますが動作しません – user534498

関連する問題