这是block
用来调用的代码:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
而这个正在调用使用selector
:
[self performSelectorOnMainThread:@selector(doSomething)
withObject:nil
waitUtilDone:NO];
这是block
用来调用的代码:
dispatch_async(dispatch_get_main_queue(), ^{
[self doSomething];
});
而这个正在调用使用selector
:
[self performSelectorOnMainThread:@selector(doSomething)
withObject:nil
waitUtilDone:NO];
是的——在第一种情况下,您创建一个块并将其发布到主队列。dispatch_async
将copy
块。复制一个块会导致它保留它引用的每个对象。所以self
将被保留,就像您在块中提到的任何其他对象一样。控制区块的机制是 Grand Central Dispatch。
在第二种情况下,您只需doSomething
在主线程上安排调用。进行调用的机制将是一个运行循环。self
最多保留一个参数对象。
GCD 和运行循环之间的区别在于运行循环具有模式。只有当运行循环处于兼容模式时,您才可以排队执行。在实践中,您最常使用它,将某些事情排队等待在NSDefaultRunLoopMode
. 当用户与用户界面交互时,它会切换到默认模式以外的模式。因此,在用户停止交互之前,您的工作不会发生。例如,在 iOS 上,用户被认为是在他们的手指向下时进行交互。因此,您可以安排您知道太繁重而无法继续平滑滚动的工作,这样直到用户完成交互后才会立即发生。
您提名的选择器将使用NSRunLoopCommonModes
其中包括跟踪(用户交互)模式但与performSelectorOnMainThread:...modes:
.