gpt4 book ai didi

swift - 当其他函数中的循环完成运行时,如何在 swift 中调用函数?

转载 作者:行者123 更新时间:2023-11-28 12:27:20 25 4
gpt4 key购买 nike

我目前正在用 Swift 编写一个函数来从 map 中删除所有注释。我想在删除它们时添加淡出效果,所以我考虑了以下论点:

  • 遍历所有注释

  • 通过动画将每个注释的 alpha 更改为 0

  • 当一切都完成后 - 从 map 上删除注释。

到目前为止,我的代码已经更改了每个标记的 alpha,但我不知道如何在其他一切完成后调用负责删除标记的函数。

我有两个功能:

func removeMarkersFromMap(){
self.array.removeAll()
let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }

for annotation in annotationsToRemove {
let pinView = mapView.view(for: annotation)

UIView.animate(withDuration: 2, delay: 0, options: UIViewAnimationOptions.curveEaseOut, animations: {
pinView?.alpha = 0.0
}, completion: { (finished: Bool) -> Void in
print("removed single pin")
})
}
}

和:

func removeCompletelyAnnotations(){
let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
self.mapView.removeAnnotations( annotationsToRemove )
}

当第一个函数内的循环完成时,如何调用第二个函数?

最佳答案

我对这类事情使用的技巧是将最终完成代码放在对象实例的 deInit 方法中,该实例由各个完成中的 捕获。

例如:

 class FinalCompletion
{
var codeBlock:()->()

init(_ code:@escaping ()->()) { codeBlock = code }

func waitForLast() {}

deinit { codeBlock() }
}

因此在您的调用代码中,您可以按如下方式进行:

func removeMarkersFromMap()
{
...

// setup the final completion in a local variable
let removeAnnotation = FinalCompletion(removeCompletelyAnnotations)

for annotation in annotationsToRemove
{
let pinView = mapView.view(for: annotation)

UIView.animate(withDuration: 2, delay: 0, options: UIViewAnimationOptions.curveEaseOut, animations: {
pinView?.alpha = 0.0
}, completion: { (finished: Bool) -> Void in
print("removed single pin")

// reference the local variable to make it part of the capture
removeAnnotation.waitForLast()
})
}

}

它的工作方式是局部变量(FinalCompletion 对象)将保持“事件”状态,只要至少有一个完成 block 还处于事件状态。执行完成 block 时,它们会超出范围并释放对捕获的局部变量的控制。当最后一个完成 block 被执行并超出范围时,局部变量不再有任何对它的引用,因此它也超出范围。这是它的 deinit 方法被调用的时候。 (即在执行完所有完成 block 之后)。

关于swift - 当其他函数中的循环完成运行时,如何在 swift 中调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43017543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com