gpt4 book ai didi

swift - 从数据源方法中使用的完成 block /闭包返回值

转载 作者:行者123 更新时间:2023-11-28 14:05:34 25 4
gpt4 key购买 nike

我有一个自定义 View ,它将显示在 Collection View 中。 View 将添加到嵌入在 View Controller 中的堆栈 View 中。公开数据源方法以提供 View 对象。

现在问题来了,在将我的自定义 View 添加到堆栈之前,我需要先进行网关调用以检查是否允许显示该 View 。由于网关调用是异步的,并在回调中返回响应。基于回调,我需要实例化 View 并返回提供的数据源回调。

这里是演示代码只是为了更好地理解。请原谅我糟糕的命名约定。

func customeViewInStack(customView: UIView) -> [UIView]? {

if viewIsAllowedToBeDisplayed {
self.downloadViewContent(onCompletionHandler: { contentDownloadSuccessfull in
if contentDownloadSuccessfull
// Return new instance of my custom view
else
// return nil
})
}

return nil
}

我读到的所有建议都是关于使用闭包传递值,但由于网关调用中的数据源方法和回调,我需要使用旧式返回语句。

编辑 1

我更新了代码片段以便更好地理解。我无法更改函数签名,因为它是框架和数据源方法的一部分。

此外,此方法在不同功能之间共享。我的意思是不同的 View 将被添加到堆栈 View 中,并且它们有自己的条件检查是否添加它们。所以基本上我想要实现的是,直到我没有得到网关操作的响应,程序执行不应该继续进行。我已经尝试使用 DispatchGroup 类,但无法实现我的目标。

谁能建议我如何解决这个问题

谢谢

最佳答案

关于这一点,正确的解决方案是不从函数返回任何东西,而是对该函数进行补全。

func customeViewInStack(customView: UIView, completion: @escaping ([UIView]?) -> Void) {

self.checkIfViewShouldBeShown(onCompletionHandler: { shouldDisplayView in
completion(shouldDisplayView ? [...(put the stack of views to return here))] : nil)
})
}

编辑:我第一次读得不好,所以我加强了我的回答。

由于需要传给collection view,建议先存储,再重新加载collection:

private var viewsForCollection: [UIView] = []

customeViewInStack(customView: UIView(), completion: { [weak self] views in
self?.viewsForCollection = views ?? [] // I guess optionality for array is unnecessary
self?.collectionView.reloadData()
})

起初,您将拥有一个空集合,但是一旦您的 View 准备就绪,您就可以重新加载它。

关于swift - 从数据源方法中使用的完成 block /闭包返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53014324/

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