听说资深iOS工程师,可解释这个多线程(集合)

dispatch_async操作与performSelector的简单比较:

直接附代码,copy代码进行打印比较吧,这是

''' swift

- (void)viewDidLoad {

    [super viewDidLoad];

    NSLog(@"2");

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        NSLog(@"7");

    });

    /**

     当为true时阻塞当前主线程,直接调用,当为false,会将selector方法添加到主线程的任务队列中,执行优先级高于performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

     低于dispatch_async到的主线程的操作

     */

    [self performSelectorOnMainThread:@selector(test5) withObject:nil waitUntilDone:true];

    /*

     只是把操作当前线程队列中,如果当前线程是主线程,优先级低于当前方法中通过dispatch_async到主线程的任务;

     此方法异步操作只能在主线程工作,子线程中是不工作的,因为PerformSelecter方法

        当调用 NSObject 的 performSelecter:afterDelay: 后,实际上其内部会创建一个 Timer 并添加到当前线程的 RunLoop 中。所以如果当前线程没有 RunLoop,则这个方法会失效。

        当调用 performSelector:onThread: 时,实际上其会创建一个 Timer 加到对应的线程去,同样的,如果对应线程没有 RunLoop 该方法也会失效。

     */

    [self performSelector:@selector(test4) withObject:nil afterDelay:0];

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

//        [self performSelector:@selector(test5) withObject:nil afterDelay:0];不会执行

        /**

         在子线程调用时,1:当是true时会阻挡当前线程,直到执行完毕,其后的方法才可以执行;

                    2:当是false时,执行优先级高于performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

         低于dispatch_async到的主线程的操作

         */

        [self performSelectorOnMainThread:@selector(test5) withObject:nil waitUntilDone:false];

        NSLog(@"6");

    });

    [selfperformSelector:@selector(test1)];

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"8");

    });

    NSLog(@"3");

}


'''

打印的顺序答案:

'''

 2->5->1-> 6-> 3-> 7-> 8->5-> 4

'''

你可能感兴趣的:(听说资深iOS工程师,可解释这个多线程(集合))