swift 中的 dispatch_block_t 相当于什么?
What is the equivalent of dispatch_block_t in swift?
我想了解一些 objective-c 代码,以便在 swift 中执行相同的操作:
dispatch_block_t adjustTooltipVisibility = ^{
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0;
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0;
};
到目前为止,我能找到的关于 dispatch_block_t
的所有信息是它在 dispatch_after 和 swift 中用作闭包。所以我能理解,但我不明白它在 objective-c 中的用法以及如何将此代码转换为 swift 代码
let adjustTooltipVisibility:Void->Void = {
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0
};
如果有什么东西会导致retain cycle,应该使用unowned capture to self。
方块的类型是 Void->Void
dispatch_block_t
是 Void -> Void
闭包的类型别名。 Swift(从 1.2 版开始)不能很好地推断出这些,因此您需要声明类型。您还需要显式引用 self
以访问实例属性,并且要确保您没有创建引用循环。在闭包中将 self
声明为 weak
是一种安全的方法:
let adjustTooltipVisibility: dispatch_block_t = { [weak self] in
if self?._tooltipVisible == true {
self?.tooltipView.alpha = 1
self?.tooltipTipView.alpha = 1
} else {
self?.tooltipView.alpha = 0
self?.tooltipTipView.alpha = 0
}
}
在Swift5,
dispatch_block_t
是 ()->Void
的别名
let adjustTooltipVisibility: ()->Void = {
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0
};
我写了2个版本objective-c和swift5给你对比一下
Objective-C版本
dispatch_block_t completionBlock = ^{
// run your code in completion block
}
// start task in background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {
// update completion block in main thread
dispatch_async(dispatch_get_main_queue(),completionBlock);
};
Swift 5 版本
let completionBlock: () -> Void = {[weak self] in
// run your code in completion block
// using `[weak self] in` to avoid memory leak
}
// start task in background thread
DispatchQueue.global().async {[weak self] in
// update completion block in main thread
DispatchQueue.main.async(execute: completionBlock)
}
我想了解一些 objective-c 代码,以便在 swift 中执行相同的操作:
dispatch_block_t adjustTooltipVisibility = ^{
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0;
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0;
};
到目前为止,我能找到的关于 dispatch_block_t
的所有信息是它在 dispatch_after 和 swift 中用作闭包。所以我能理解,但我不明白它在 objective-c 中的用法以及如何将此代码转换为 swift 代码
let adjustTooltipVisibility:Void->Void = {
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0
};
如果有什么东西会导致retain cycle,应该使用unowned capture to self。 方块的类型是 Void->Void
dispatch_block_t
是 Void -> Void
闭包的类型别名。 Swift(从 1.2 版开始)不能很好地推断出这些,因此您需要声明类型。您还需要显式引用 self
以访问实例属性,并且要确保您没有创建引用循环。在闭包中将 self
声明为 weak
是一种安全的方法:
let adjustTooltipVisibility: dispatch_block_t = { [weak self] in
if self?._tooltipVisible == true {
self?.tooltipView.alpha = 1
self?.tooltipTipView.alpha = 1
} else {
self?.tooltipView.alpha = 0
self?.tooltipTipView.alpha = 0
}
}
在Swift5,
dispatch_block_t
是 ()->Void
let adjustTooltipVisibility: ()->Void = {
self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0
self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0
};
我写了2个版本objective-c和swift5给你对比一下
Objective-C版本
dispatch_block_t completionBlock = ^{
// run your code in completion block
}
// start task in background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ {
// update completion block in main thread
dispatch_async(dispatch_get_main_queue(),completionBlock);
};
Swift 5 版本
let completionBlock: () -> Void = {[weak self] in
// run your code in completion block
// using `[weak self] in` to avoid memory leak
}
// start task in background thread
DispatchQueue.global().async {[weak self] in
// update completion block in main thread
DispatchQueue.main.async(execute: completionBlock)
}