swift中dispatch_block_t的等价物是什么?

时间:2015-04-20 02:09:34

标签: ios objective-c swift grand-central-dispatch

我有一些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的所有内容都是它在swift中用作dispatch_after作为闭包。所以我可以理解,但是我不能理解它在objective-c中的使用,以及如何将这些代码转换为快速代码

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

let adjustTooltipVisibility:Void->Void = {
    self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0
    self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0
};

如果会有某些事情导致保留周期,你应该使用无主捕获来自我。 块的类型是Void-> Void

答案 2 :(得分:0)

在Swift 5中,

dispatch_block_t()->Void

的别名
let adjustTooltipVisibility: ()->Void = {
    self.tooltipView.alpha = _tooltipVisible ? 1.0 : 0.0
    self.tooltipTipView.alpha = _tooltipVisible ? 1.0 : 0.0
};

答案 3 :(得分: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)
}