码迷,mamicode.com
首页 > 移动开发 > 详细

关于iOS多线程的一些问题

时间:2015-08-03 17:07:56      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

??一、定时器问题

  1. 堵塞,滞后问题

在主线程调用下面方法

_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;

技术分享

关于iOS多线程的一些问题

标签:

原文地址:http://my.oschina.net/u/2344008/blog/487063

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!