解决iOS程序UI主线程和定时器相互阻塞的问题
2013-06-07 21:07
447 查看
此文是接上文http://www.cnblogs.com/zzltjnh/archive/2013/05/15/3080058.html问题解决之后遇到的一个新问题,我的页面上有一个UIScrollView和一个定时器用来记录当前考试模式下的剩余时间,问题出现了:当我滑动滚动试图时,定时器的方法便不在运行(即被UI主线程阻塞)。google一下找到了解决办法:将定时器放在非主线程中执行将更新UI的操作放到主线程,这样UI主线程和定时器就能互不干扰的相互工作了,以下是主要代码:
1 #import "CountdownTool.h" 2 3 @interface CountdownTool() 4 { 5 UILabel *_lblShow; 6 NSTimer *_timer; 7 } 8 @property (nonatomic, assign) NSInteger hour; 9 @property (nonatomic, assign) NSInteger minute; 10 @property (nonatomic, assign) NSInteger second; 11 @property (nonatomic, copy) NSString *strHour; 12 @property (nonatomic, copy) NSString *strMinute; 13 @property (nonatomic, copy) NSString *strSecond; 14 @property (nonatomic, assign) NSInteger totalSeconds; 15 @end 16 @implementation CountdownTool 17 @synthesize hour = _hour; 18 @synthesize minute = _minute; 19 @synthesize second = _second; 20 @synthesize totalSeconds = _totalSeconds; 21 22 - (void)dealloc 23 { 24 [_lblShow release]; 25 [_strHour release]; 26 [_strMinute release]; 27 [_strSecond release]; 28 [super dealloc]; 29 } 30 31 - (id)initWithFrame:(CGRect)frame 32 { 33 self = [super initWithFrame:frame]; 34 if (self) { 35 _lblShow = [[UILabel alloc] initWithFrame:self.bounds]; 36 _lblShow.backgroundColor = [UIColor clearColor]; 37 _lblShow.font = [UIFont systemFontOfSize:15]; 38 _lblShow.textColor = [UIColor yellowColor]; 39 _lblShow.textAlignment = NSTextAlignmentCenter; 40 _lblShow.numberOfLines = 1; 41 [self addSubview:_lblShow]; 42 } 43 return self; 44 } 45 46 - (id)initWithFrame:(CGRect)frame andMinutesNum:(NSInteger)minute 47 { 48 if (self = [self initWithFrame:frame]) { 49 self.totalSeconds = minute * 60; 50 //多线程启动定时器 51 [NSThread detachNewThreadSelector:@selector(startTimer) toTarget:self withObject:nil]; 52 } 53 return self; 54 } 55 - (void)startTimer 56 { 57 _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerFire) userInfo:nil repeats:YES]; 58 [[NSRunLoop currentRunLoop] run]; 59 } 60 - (void)handleWithTotalSeconds 61 { 62 self.hour = _totalSeconds/3600; 63 self.minute = _totalSeconds%3600/60; 64 self.second = _totalSeconds%3600%60; 65 if (_hour <= 0) { 66 _lblShow.text = [NSString stringWithFormat:@"%@:%@",_strMinute,_strSecond]; 67 }else{ 68 _lblShow.text = [NSString stringWithFormat:@"%@:%@:%@",_strHour,_strMinute,_strSecond]; 69 } 70 } 71 - (void)setHour:(NSInteger)hour 72 { 73 _hour = hour; 74 if (_hour < 10) { 75 self.strHour = [NSString stringWithFormat:@"0%d",_hour]; 76 }else{ 77 self.strHour = [NSString stringWithFormat:@"%d",_hour]; 78 } 79 } 80 - (void)setMinute:(NSInteger)minute 81 { 82 _minute = minute; 83 if (_minute < 10) { 84 self.strMinute = [NSString stringWithFormat:@"0%d",_minute]; 85 }else{ 86 self.strMinute = [NSString stringWithFormat:@"%d",_minute]; 87 } 88 } 89 - (void)setSecond:(NSInteger)second 90 { 91 _second = second; 92 if (_second < 10) { 93 self.strSecond = [NSString stringWithFormat:@"0%d",_second]; 94 }else{ 95 self.strSecond = [NSString stringWithFormat:@"%d",_second]; 96 } 97 } 98 - (void)setTotalSeconds:(NSInteger)totalSeconds 99 { 100 _totalSeconds = totalSeconds; 101 [self performSelectorOnMainThread:@selector(handleWithTotalSeconds) withObject:nil waitUntilDone:YES]; 102 } 103 - (void)timerFire 104 { 105 if (_totalSeconds == 0) { 106 [_timer invalidate]; 107 return; 108 } 109 self.totalSeconds -= 1; 110 } 111 @end
相关文章推荐
- 解决iOS程序UI主线程和定时器相互阻塞的问题
- 解决iOS程序UI主线程和定时器相互阻塞的问题
- 解决iOS程序UI主线程和定时器相互阻塞的问题
- 解决iOS程序UI主线程和定时器相互阻塞的问题
- iOS程序UI主线程和定时器相互阻塞的问题
- 解决sleep延时阻塞程序主线程,造成程序未响应问题方案
- 程序间相互通讯问题的解决
- java.lang.Process调用程序阻塞问题解决
- iOS UIPickerView 可能会出现选中行不显示或者去掉上下两条横线的问题解决,
- 发布iOS程序出现“an error occurred uploading to the itunes store”问题的解决办法
- ios-通知:闹钟之关于设置闹钟后,点击app图标进入程序不播放音乐的问题(已解决)
- java.lang.Process调用程序阻塞问题解决
- iOS---UI常见问题解决办法。
- 微信小程序之wx.request:fail错误,真机预览请求无效问题解决,安卓,ios网络预览异常(转)
- java.lang.Process调用程序阻塞问题解决(刚刚遇到的问题,看有人解决了,转一下:) )
- 解决微信小程序中Date.parse()获取时间戳IOS不兼容的问题(IOS为NaN的问题)
- 解决微信小程序中Date.parse()获取时间戳IOS不兼容的问题(IOS为NaN的问题)
- 解决微信小程序中Date.parse()获取时间戳iOS无法获取的问题
- 安卓4.0以后主线程访问网络问题(NetworkOnMainThreadException)解决方法及子线程更新ui
- [转]IOS程序之HTTP同步请求与异步请求问题解决