当前位置: 首页 > 知识库问答 >
问题:

不带参数的可选完成处理程序

潘弘壮
2023-03-14

我基本上想有一个可选的完成处理器,没有参数被传递回来。这是我目前掌握的情况,但显然是错误的。

func refreshAccountData(type:String, completion: (()->(Void))?){
    //Network call is made
    Alamofire.request... {
        completion?()
        //Here is where I want to call the optional completion handler
    }

}

我不想在完成块中传递任何参数。我只想知道网络调用何时完成,以便刷新UI。我不想在这里刷新UI,因为我希望它充当刷新数据的通用函数。我之所以希望完成处理程序是可选的,是因为有时候刷新完成后我不需要做任何事情。

我也很困惑“逃离”是什么意思。当我做这样的事情时,我通常会有它,但任何清晰都会很好。我在网上做了一些功课,但没有发现太多我真正得到的东西。

共有1个答案

富建章
2023-03-14

首先,将括号放在<code>Void</code>类型周围:

func refreshAccountData(type:String, completion: (() -> Void)?){
    //Network call is made
    Alamofire.request... {
        completion?() 
    }
}

如果您强制展开一个闭包调用,基本上就是说您知道总会有一个完成回调。但是在您的例子中,您明确提到您需要一个可选的,所以调用<code>completion?()是您想要的。

关于转义,可选闭包是隐式转义的,因此如果您想要一个非转义版本,则必须使用非可选闭包。阅读文档中的转义闭包部分以了解有关转义的更多信息。基本上,在您的情况下,您需要一个转义闭包,因为您在异步回调中使用完成,它在刷新Account tData完成后执行。但正如我所说,使闭包可选会使其隐式转义(在SO问题中阅读更多信息)。

现在你知道你的完成正在逃避 - 这是什么意思?简单地说,如果它是非转义的,编译器将保证在 refreshAccountData 方法完成后释放完成闭包,因此实际上完成捕获的所有资源也将被释放。但是,转义完成关闭可以比 refreshAccountData 调用期间存活更长时间 - 这意味着它可以创建保留周期(闭包可能保留对 self 和其他对象的实时强引用,这可能是因为保留了)。

现在在您的例子中,既然您想要一个可选的完成闭包,那么除了简单地接受它是转义之外,您没有其他方法-那么您如何确保结束闭包不会保留不需要的强引用呢?在创建完成时,您可以简单地使用捕获列表(参见此参考),以确保即使<code>self</code>也是弱引用,并且不会因为闭包而保留它:

refreshAccountData(type: "") { [weak self] in
    guard let self = self else { return }
    self.doSomething()
}
 类似资料:
  • 我正在尝试在我的Swift应用程序中创建一个服务对象,以便更轻松地处理请求。我已经把它连接起来了,但是我可能误解了完成处理器。 我有这个函数,它只是发布到我正在运行的本地APIendpoint。 我需要做的就是把这个名字传给我在这里做的函数 但是,我现在收到此错误。 调用中缺少参数“completion”的参数 我的目标是返回< code>Response对象,这样我就可以访问它的属性,在UI中做

  • 我在地图中的几个位置进行反向地理编码,并希望将其包装为某种常用方法。我所拥有的是作为工作起点的: 但是,如果我想在我的完成方法中添加另一个参数,将会向我的视图返回错误,如下所示: 如果error为,那么我的将失败,因为错误为nil且访问错误。但我不能这样做,因为参数与完成处理程序不匹配。 因此,如果我有一个nil错误,我将如何调用我的完成处理程序?

  • 我目前正在学习swift,几个小时以来我一直在试图理解一个错误。由于查询,我试图从php脚本中获取一个xml文件,我使用一个完成处理程序作为回调来获取这些查询的结果。 问题是我对这些技术感到不舒服,它说缺少论据。 下面是使用完成处理程序的函数: 这是我调用这个函数的一段代码: 这段代码显示有关调用连接的此错误: 我做错了什么?为什么它要两个参数? 非常感谢您的帮助。 埃尔巴托

  • 我有这个代码: 有时它会在完成(nil)行崩溃,并带有错误代码 线程1:EXC_BREAKPOINT(代码=1,子代码=0x102ba1774) 考虑到参数是可选的,我不知道为什么它会崩溃,我只是把零传递给它。 以下是我用于调用完成处理程序的确切代码。它位于消防库事务的完成块中: 下面是处理完成的代码 这可能与事务多次调用完成处理程序有关吗?

  • 问题内容: 我在SpringData中使用QueryDSL。我说表,我创建了实体类, 我写了以下 服务 方法 如上所述,我评论了。如何使用 QueryDSL 在可选参数 QueryDSL 使用Spring的数据? 谢谢 :) 问题答案: 可以用作布尔表达式的动态生成器:

  • 我将QueryDSL与SpringData一起使用。我有表say,并创建了实体类say,我编写了以下服务方法 与上面一样,我注释了。如何在使用Spring数据的QueryDSL中对可选参数使用QueryDSL?