- (void)performSelector: onThrea
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait
指定默认模式在指定线程上调用接收器的方法,
当wait 为YES时,会立即调用接收器方法,当wait为NO时,会将操作加入到runloop中排队,当有机会时才执行此操作
跟新UI时一般用此方法
dispatch_async 是异步操作,
当与JS进行交互时, WebView里面的JS弹窗alert会与dispatch_async(dispatch_get_main_queue(), ^{});死锁, 此时需要用
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait
与JS进行交互
如果一个线程中同时有performSelectorOnMainThread
和dispatch_async
两个异步任务, performSelectorOnMainThread里面的任务会优先执行
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
这个方法是先提交任务至runloop里面。类似一个定时器,延迟多少秒执行, 由于子线程里面默认不开启runloop, 因此此方法不能加入到子线程中执行调用 (内部实现可能及时创建了一个NStime,然后延迟执行一次aSelector)
dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block)
这个方法是延迟提交任务,不会将任务丢到runloop中
runLoop是运行循环,处理线程中的各种事件, 如果线程没有任何事件处理,则让线程休眠,但是不会让线程被销毁