一.runloop跟线程的关系
- runloop是为线程而生,每一个线程会对应一个runloop;
- 主线程runloop默认是开启的,子线程runloop需要手动开启;
3.可通过以下方式开启一条常驻线程:
NSRunLoop * runloop = [NSRunLoop currentRunLoop];
[runloop addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
[runloop run];
二. 线程之间的通信
1.GCD,一般用于UI更新
dispatch_async(dispatch_get_main_queue(), ^{
//主线程操作UI更新
});
- performSelector
a)performSelectorOnMainThread: withObject: waitUntilDone:
//切回主线程操作
b)performSelectorInBackground: withObject:
//切换到后台线程
c)performSelector: onThread: withObject: waitUntilDone:
//切换到自定义子线程 - NSOperation
[NSOperationQueue mainQueue] addOperationWithBlock: ^{}
三. 线程锁有几种
1 NSLock
2 synchronized
代码块
3 GCD的 dispatch_semaphore_t
(条件信号量)和dispatch_barrier_async
/dispatch_barrier_sync
;
4 NSCondition
使用其做多线程之间的通信调用不是线程安全的
5 NSConditionLock
单纯加锁性能非常低,比NSLock
低很多,但是可以用来做多线程处理不同任务的通信调用
6 POSIX(pthread_mutex)
底层的api,复杂的多线程处理建议使用,并且可以封装自己的多线程
7 NSRecursiveLock
递归锁的性能出奇的高,但是只能作为递归使用,所以限制了使用场景