2014-09-11 1 views
3

이의 내가 나중에 코드 블록을 실행하려는 가정 해 봅시다, 그래서 나는과 같이 dispatch_after 전화 :dispatch_after가 대기중인 블록의 실행을 지연시키는 방법은 무엇입니까?

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    /* code */ 
}); 

그러나 실행도 시작되기 전에 나는 내 프로그램을 "중지"할 경우 어떻게? 이 알 수없는 시간을 호출 한 후 1 초 동안 프로그램을 일시 중지한다고 가정 해 봅시다. 그런 다음 잠시 후 대기열에서 대기하는 2 초를 다시 시작하고 싶습니다. 그래서 (2 초 지연에

  • 전화 dispatch_after
  • 초 한 후, 블록을 재개 한 후 알 수없는 시간
  • 위한 프로그램을 일시 정지 1 초 기다렸다가 실행 : 그래서 다음과 같이 보일 것입니다 총 지연은 2 초임)

이렇게하는 방법이 있습니까? 아니면 다른 접근법을 사용해야합니까?

저는 dispatch_suspenddispatch_resume이 존재하지만 실제로는 제대로 작동하지 않는다는 것을 알고 있습니다. (또는 정확하게 사용하는 방법을 모르겠습니다.)

솔루션에 블록이 반드시 포함될 필요는 없으며 특정 기능에 대한 지연 콜백이 될 수도 있습니다. 요점은 실행까지 대기 시간을 일시 중지 할 수 있기를 원한다는 것입니다.

+0

나는 그것이 가능하지 않다라고 꽤 확신한다. 내가 아는 한, 블록을 발송하면 디스패치 시간을 변경할 방법이 없습니다. 대기열을 일시 중단해도 디스패치 시간에 영향을 미치지 않으므로 시간이 지나면 블록이 실행되지 않습니다. –

+0

그러면 다른 접근법을 제안 할 수 있습니까? 어쩌면 함수에 대한 지연 콜백일까요? 그것은 또한 좋을 것입니다. 실제로 애니메이션 시퀀스에서 이것을 사용하고 싶습니다. 먼저 화면에서 무언가를 움직이게하고 2 초 후에 무언가를하는 코드를 실행하려고합니다. 'dispatch_after'와 잘 맞지만, 앱을 배경으로 보내고 다시 가져올 경우 (애니메이션 중에) 타이밍이 엉망입니다.블록 안의 코드는 2 초를 기다리지 않고 즉시 실행됩니다. – adam10603

답변

0

을하는 데 도움이

호출하는 방법은 블록하지만 그 전에 2 초 지연을 호출 할

-(void)myMethod{ 
//implementation of the block 
} 

[self performSelector:@selector(myMethod) withObject:nil afterDelay:2.0]; 

희망을 당신의 블록을 넣어

+0

이렇게하면'dispatch_after'와 같은 결과가 나옵니다. 그러나 여전히 2 초 지연을 멈출 수는 없습니다. 그게 내 질문의 핵심 이었어. – adam10603

+0

위의 방법은 2 초 동안 멈추고 그 안에 메서드를 시작합니다. –

+0

예,하지만 언제든지 2 초 지연을 일시 중지했다가 다시 시작할 수 있기를 원합니다. – adam10603

1

그럴 수는 없지만 비슷한 일을하는 방법이 있습니다.

지연 당신의 방법 이초 :

[self performSelector:@selector(yourMethod) withObject:nil afterDelay:2.0];

1 초 후에, 당신의 방법 취소 : 알 수없는 시간이 지나면

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(yourMethod) object:nil];

을, 그것을 하나를 실행하기 위해 방법과 지연을 기억 두 번째 이후 :

[self performSelector:@selector(yourMethod) withObject:nil afterDelay:1.0];

+0

불행히도 내가 필요한 것은 아닙니다. 1 초 - 1 초 분할은 단지 예일뿐입니다. 인터럽트는 2 초 창에서 언제든지 발생할 수 있습니다. 콜백 지연을 일시 중지 할 방법이 없다고는 생각하지 않습니다. – adam10603

+0

중단이 발생했을 때 현재 시간을 저장 한 다음 재개 할 때 경과 시간을 계산하면 남은 시간이 있는지 여부를 간단히 확인할 수 있고 남은 시간과 함께 다른 performSelector를 호출 할 수 있습니다. 나는 그것을 시도 할 것이다. – adam10603