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_tVoid -> 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)
}