灵感来自于我家的电热水器,每次打开都能看到温度从0跳到100然后再固定到实际温度,所以博主就模拟了一个:
- (void)countJumpAction { __block int _numText = 0; //全局队列 默认优先级 dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //定时器模式 事件源 dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, quene); //NSEC_PER_SEC是秒,*1是每秒 dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), NSEC_PER_SEC * 0.4, 0); //设置响应dispatch源事件的block,在dispatch源指定的队列上运行 dispatch_source_set_event_handler(timer, ^{ //回调主线程,在主线程中操作UI dispatch_async(dispatch_get_main_queue(), ^{ if ([[NSUserDefaults standardUserDefaults]objectForKey:@"one"] == nil) { if (_numText <= [textField.text intValue] * 1.3) { _numText = _numText + [textField.text intValue] / 10 + arc4random()%([textField.text intValue] / 10); _countJump.text = [NSString stringWithFormat:@"%d",_numText]; NSLog(@"%d",_numText); } else { [[NSUserDefaults standardUserDefaults]setObject:@"1" forKey:@"one"]; [[NSUserDefaults standardUserDefaults]synchronize]; } } else { if (_numText > [textField.text intValue]) { _numText = _numText - [textField.text intValue] / 10 - arc4random()%([textField.text intValue] / 10); if (_numText < [textField.text intValue]) { _countJump.text = textField.text; //这句话必须写否则会出问题 dispatch_source_cancel(timer); return ; } _countJump.text = [NSString stringWithFormat:@"%d",_numText]; } } }); }); //启动源 dispatch_resume(timer); }
为了保证跳数的随机性和保持递增递减的趋势,所以每次以输入的数字的十分之一加上十分之一的数取随机数的和为跳度,最大加到输入数字的1.3倍,当达到可达到的最大值时开始递减,在真正数字时停止递减。
主要是对线程队列的简单运用。