objective-c - ios开发验证码倒计时60s,真机测试退到后台,再次打开发现秒数没有变化,怎么办?
PHPz
PHPz 2017-04-17 17:51:26
0
7
368

__block int timeout=60;

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
    if(timeout<=0){
        dispatch_source_cancel(_timer);
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [self.validBtn setTitle:@"获取短信验证码" forState:UIControlStateNormal];
            //self.validBtn.backgroundColor=RGB(120, 0, 103);
            [self.validBtn setBackgroundImage:[UIImage imageNamed:@"获取验证码"] forState:UIControlStateNormal];
            self.validBtn.userInteractionEnabled = YES;
        });
    }else{
        int seconds = timeout;
        NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [self.validBtn setTitle:[NSString stringWithFormat:@"%@秒",strTime] forState:UIControlStateNormal];
            //self.validBtn.backgroundColor=RGB(207, 207, 207);
            [self.validBtn setBackgroundImage:[UIImage imageNamed:@"获取验证码-不可点击"] forState:UIControlStateNormal];
            self.validBtn.userInteractionEnabled = NO;
        });
        timeout--;
    }
});
dispatch_resume(_timer);
PHPz
PHPz

学习是最好的投资!

모든 응답(7)
Peter_Zhu

현재 페이지를 나갈 때 스레드를 종료한 다음 카운트다운을 60으로 초기화합니다

伊谢尔伦

타이머는 Runloop에서 실행되어야 합니다

刘奇

백그라운드로 이동한 후 백그라운드에서 실행할 수 있는 프로그램으로 선언되지 않은 경우 NSTimer는 사라지지 않아야 합니다.
나라면:
1. 백그라운드 진입 전 타이머를 정지하고, appdelegate의 applicationDidEnterBackground에 시간을 기록하고, 포그라운드 진입 시의 시간을 비교하여 차이를 계산하고, 인증코드 값 표시를 새로고침하고, 그런 다음 타이머를 시작하십시오.
2. 백그라운드로 진입하기 전에 타이머를 중지하거나 백그라운드에서 몇 초마다 backgroundTask를 사용하여 인증 코드 번호를 감소시킨 후 프론트 데스크로 돌아온 후 타이머를 시작하세요. (너무 지루해요...)
3. 앱을 백그라운드에서 실행할 수 있는 프로그램으로 선언하세요.
저는 첫 번째 옵션을 선택하겠습니다. . .

洪涛

제 계획은 다음과 같습니다.

  1. 시작 시간을 기록하세요.

  2. 매초마다 인터페이스의 표시를 업데이트합니다. 当前时间 - 开始时间을 사용하여 인터페이스에 표시되는 시간(초)을 가져옵니다

  3. GCD Timer을 사용하고 있습니다. 배경에 들어갔다가 앞으로 돌아올 때의 상황을 처리할 필요는 없습니다. 물론 다른 것을 사용해도 문제는 없습니다.

PHPzhong

다음 해결 방법을 시도해 볼 수 있습니다.

으아악
大家讲道理

GreedTimer는 귀하가 언급한 문제를 해결할 수 있습니다. GRTimer를 사용할 때 timeInBackgroundYES

로 설정하세요.
左手右手慢动作

위에서 언급한 방법 중 어느 것도 간단하고 실행 가능한 방법을 찾지 못했습니다.

http://www.jianshu.com/p/8e61...

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!