Ios 在UIView中需要SnapKit约束的完成块

Ios 在UIView中需要SnapKit约束的完成块,ios,swift,constraints,Ios,Swift,Constraints,我在swift中有一个UIView,它使用SnapKit来布局视图。我想模糊其中一个视图,但我需要将模糊代码放在一个方法中,该方法在所有布局代码完成后运行,并且一个视图具有适当的大小 我似乎找不到那个模糊代码的正确位置。因为snapkit都是基于块的,所以它是异步的,我不知道什么时候会完成。我可以使用什么回调方法 编辑:我报告了一个错误,他们说这些块毕竟是同步的。但是,在layoutSubviews(以及同步块之后)中,我的帧仍然是CGRectZero,因此,模糊代码无法对宽度或高度为0的视图进

我在swift中有一个UIView,它使用SnapKit来布局视图。我想模糊其中一个视图,但我需要将模糊代码放在一个方法中,该方法在所有布局代码完成后运行,并且一个视图具有适当的大小

我似乎找不到那个模糊代码的正确位置。因为snapkit都是基于块的,所以它是异步的,我不知道什么时候会完成。我可以使用什么回调方法


编辑:我报告了一个错误,他们说这些块毕竟是同步的。但是,在
layoutSubviews
(以及同步块之后)中,我的帧仍然是
CGRectZero
,因此,模糊代码无法对宽度或高度为0的视图进行快照和模糊。

我不知道SnapKit,但有一种技术可以用于在完成最后一组异步块后执行代码

诀窍是创建一个类来保存一段代码,并让每个块保存对它的引用。在类的deinit代码中,执行代码

例如:

class CompletionBlock
{
   var completionCode:()->()

   init?(_ execute:()->() )
   { completionCode = execute }

   func deferred() {}

   deinit
   { completionCode() }
}
在使用run块调用函数之前,为变量分配CompletionBlock实例,并在每个块中添加对其deferred()函数的调用。然后将变量设置为nil(或者让它从调用函数中超出范围)

完成变量将被两个块捕获,因此将有一个对它的引用(保持它处于活动状态),直到两个块都超出范围。然后,completion变量将超出作用域本身,它的deinit函数将被调用,此时将执行completion块


在您的特定情况下,这可能有帮助,也可能没有帮助,但我想我会把它放进去,以防万一。

也许(如果layoutSubviews方法不起作用…)您可以使用类似的方法来确保已安装约束。虽然如果他们说的是真的,这有点不必要。

这是一个很棒的主意!!然而,不幸的是,它不能解决这个问题。我试过了,当回调出现时,我想模糊的视图的宽度和高度仍然是0,我想这里还发生了别的事情。
// ... 
var completion = CompletionBlock({ print("finished") })

doThis(completion: {
                     // ... whatever stuff you need to do
                     completion.deferred()
                   })

doThat(completion: {
                     // ... whatever stuff you need to do
                     completion.deferred()
                   })

completion = nil
// ....