2011-01-04 10 views
2

私はしばらくして(例えば、アプリケーションで何かをしてから5分後に)UIAlertViewを表示しようとしています。私はすでに、アプリが閉鎖されているか、バックグラウンドであるかどうかをユーザーに通知しています。しかし、私は、アプリケーションが実行されている間、UIAlertViewを表示したい。しばらくしてからUIAlertViewを表示する

次のように私はdispatch_asyncしようとしたが、アラートは永遠に飛び出るさ:

[NSThread sleepForTimeInterval:minutes]; 
dispatch_async(dispatch_get_main_queue(), 
     ^{ 
     UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!" message:@"message!" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
     } 
     ); 

また、私は、スレッドは30〜60分後に死ぬことを読みました。私は60分以上経過した後にアラートを表示できるようにしたい。

+0

私は興味をそそられていますが、30分から60分後にスレッドがどこで死ぬのですか? –

+0

私はそれを読む場所を本当に見つけることができませんが、私はそう信じました。私は明日それをテストし、あなたに戻ってきます。 – Basel

答えて

12

なぜNSTimerを使用しないのですか?この場合、なぜGCDを使用する必要がありますか? @PeyloWが述べたように、あなたもperformSelector:withObject:afterDelay:を使用することができ、また

- (void) showAlert:(NSTimer *) timer { 
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!" 
                message:@"message!" 
                delegate:self    
              cancelButtonTitle:@"Cancel" 
              otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 

[NSTimer scheduledTimerWithTimeInterval:5*60 target:self selector:@selector(showAlert:) userInfo:nil repeats:NO]; 

その後、同じクラス内で、あなたはこのような何かを持っていると思います

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"title!" 
               message:@"message!" 
               delegate:self    
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:nil]; 
[alert performSelector:@selector(show) withObject:nil afterDelay:5*60]; 
[alert release]; 

EDIT GCDのdispatch_after APIも使用できるようになりました:

double delayInSeconds = 5; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"title!" 
                 message:@"message" 
                 delegate:self 
               cancelButtonTitle:@"Cancel" 
               otherButtonTitles:nil]; 
    [alertView show]; 
    [alertView release]; //Obviously you should not call this if you're using ARC 
}); 
+0

または単に 'performSelector:withObject:afterDelay:'を使うと、タイマーを混乱させる必要はありません。実際、あなたは 'UIAlertView'で' show'メソッドを呼び出すことができ、2番目のメソッドの必要もありません。 – PeyloW

+0

@PeyloW良い点ですが、あなたは 'performSelector:withObject:afterDelay:'と思って競合状態に陥るかもしれませんが、セカンダリスレッドで実際にセレクタを実行します。また、いつあなたはそれを解放しますか? autoreleaseプールは、 'show'セレクタを実行する前に' UIAlertView'オブジェクトの割り当てを解除することができます。この場合、NSTimerを使う価値はあると思います。 –

+3

'performSelector:withObject:afterDelay:'は現在のスレッドでセレクタを常に実行し、オブジェクトは実行される(またはキャンセルされる)まで現在の実行ループによって保持されます。実際には、タイマーは暗黙的に作成されます。 APIは無用で、そうでなければCocoaのメモリ管理ルールに準拠していません。あなたの恐れが根本的でない場合は両方とも。 – PeyloW

0

これは、ローカル通知が作成された種類のものです。あなたのアプリがバックグラウンドであっても、まったく実行されていなくても、将来UIAlertViewのような通知を設定することができます。

Hereはチュートリアルです。

関連する問題