關於iOS多線程的一些問題

1、定時器問題
多線程

  1. 堵塞,滯後問題async

在主線程調用下面方法oop

_timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(sendCommand:) userInfo:button repeats:YES];post

因爲該定時器重複觸發時間過短,只有0.05秒,而主線程又有不少事情要處理,因此就很容易形成滯後。調用該方法後,過一段時間,再調用[_timer invalidate],定時器並不會立刻中止調用sendCommand:,而是繼續調用sendCommand:,直到把滯後執行的次數執行完畢。spa

把定時器加到多線程,能夠解決這個問題,例:線程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{3d

            

            _timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(sendCommand:) userInfo:button repeats:YES];orm

            [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];server

            [[NSRunLoop currentRunLoop] run];對象

        });


2、通知問題

一個對象在多線程中調用下面的方法

[[NSNotificationCenter defaultCenter]postNotificationName:@"disconnect" object:nil];

另外一個對象,做爲觀察者

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disconnect) name:@"disconnect" object:nil];

當響應通知並調用對應的方法時,

- (void)disconnect

{


    NSLog(@"disconnect------%@-------------",[NSThread currentThread]);

//打印出來的線程就是多線程,若是在這裏處理UI界面,就要回到主線程處理,否則就會出現會出現問題(延遲好幾秒)。

 }

也就是說,在哪一個線程發送通知,觀察者響應通知的方法就在對應的線程。


3、延時方法問題(NSDelayedPerforming)

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;

可見延時方法是有對應線程的,同理,取消延時執行方法,也是有對應線程的,若是線程不同,是不會取消的。

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument;

相關文章
相關標籤/搜索