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를 사용해야합니까? 또한,

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

@PeyloW가 언급 한 바와 같이, 당신은 너무 performSelector:withObject:afterDelay:를 사용할 수 있습니다 :

[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]; 

편집을 이제 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' 메소드를 호출 할 수 있고 두 번째 메소드도 필요 없다는 것입니다. – PeyloW

+0

@PeyloW 좋은 점은, (필자가 생각하기에)'performSelector : withObject : afterDelay :'와 같이 경쟁 조건에 부딪쳐도 실제로는 보조 스레드에서 선택자를 수행한다는 것입니다. 또한 언제 당신이 그것을 풀어 주겠습니까? autorelease pool은'show'selector를 수행하기 전에'UIAlertView' 객체의 할당을 해제 할 수 있습니다. 이 경우 NSTimer를 사용하는 것이 가치 있다고 생각합니다. –

+3

'performSelector : withObject : afterDelay :'는 항상 현재 스레드에서 선택자를 수행하며 객체는 수행 (취소) 될 때까지 현재 실행 루프에 의해 유지됩니다. 실제로는 타이머가 암시 적으로 생성됩니다. API는 꽤 쓸모 없으며 그렇지 않으면 Cocoa 메모리 관리 규칙을 따르지 않습니다. 그래서 두려움이 근거가 없다면. – PeyloW

0

이것은 로컬 알림이 만들어진 종류입니다. 앱이 백그라운드로 실행되거나 전혀 실행되지 않는 경우에도 UIAlertView와 유사한 알림을 설정하여 나중에 어느 정도 시간을 가질 수 있습니다.

Here은 자습서입니다.

관련 문제