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
'''
网友评论