标签:
??一、定时器问题
堵塞,滞后问题
在主线程调用下面方法
_timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(sendCommand:) userInfo:button repeats:YES];
由于该定时器重复触发时间太短,只有0.05秒,而主线程又有很多事情要处理,所以就很容易造成滞后。调用该方法后,过一段时间,再调用[_timer invalidate],定时器并不会马上停止调用sendCommand:,而是继续调用sendCommand:,直到把滞后执行的次数执行完毕。
把定时器加到多线程,可以解决这个问题,例:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
_timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(sendCommand:) userInfo:button repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
});
二、通知问题
一个对象在多线程中调用下面的方法
[[NSNotificationCenter defaultCenter]postNotificationName:@"disconnect" object:nil];
另一个对象,作为观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disconnect) name:@"disconnect" object:nil];
当响应通知并调用对应的方法时,
- (void)disconnect
{
NSLog(@"disconnect------%@-------------",[NSThread currentThread]);
//打印出来的线程就是多线程,如果在这里处理UI界面,就要回到主线程处理,不然就会出现会出现问题(延迟好几秒)。
}
也就是说,在哪个线程发送通知,观察者响应通知的方法就在对应的线程。
三、延时方法问题(NSDelayedPerforming)
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
可见延时方法是有对应线程的,同理,取消延时执行方法,也是有对应线程的,如果线程不一样,是不会取消的。
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument;
标签:
原文地址:http://my.oschina.net/u/2344008/blog/487063