使用可选的完成处理程序调用自身进行迭代,不会第二次完成

     2023-02-23     207

关键词:

【中文标题】使用可选的完成处理程序调用自身进行迭代,不会第二次完成【英文标题】:iterating using optional completion handler calling itself, wont complete second time around 【发布时间】:2019-02-15 12:41:22 【问题描述】:

我收到此错误:

可选类型 '((RestTime) -> ())?' 的值必须解包为 '(RestTime) -> ()' 类型的值

我从 VC 调用函数:

        let calculateSegmentDirections = CalculateSegmentDirections(locationManager: locationManager)
        calculateSegmentDirections.calculateSegmentDirections(index, time: time, routes: routes, loc: loc)  restTime in
                print("4")

        




    func calculateSegmentDirections(_ index: Int, time: TimeInterval, routes: [MKRoute], loc: LocationModel, completion: ((_ restTime: RestTime) -> ())?) 
            print("1")
            if let routeResponse = response?.routes 
            print("2")
                    self.calculateSegmentDirections(index+1, time: timeVar, routes: routesVar, loc: restLocation, completion: nil)
                 else 
                    let restTime = RestTime(objectID: restLocation.objectID, time: timeVar, routes: routesVar)
                    print("3")
                    completion(restTime)
                
    

完整形式的函数从 VC 调用,然后迭代自身以从 MKdirections 创建路由。我的问题是,我可以以这种方式使用可选的完成处理程序吗?

控制台按预期打印 1、2、1、3,但随后不调用完成。 4永远不会被解雇。 completion = nil,所以当我用 if completion = completion 展开时它不起作用。

另外,completion?(restTime) 也不起作用,将默认值设置为 nil 也不起作用,就像我使用 print(completion) = nil 检查时一样。

猜测发生了什么: 第一个完成处理程序是否“完成功能”因此第二个不触发?我传递了一个 nil 值,而不是不运行它?

抱歉,如果这很简单,谷歌是紫色的,仍然不确定我做错了什么。

【问题讨论】:

“完成?(restTime)也不起作用”。 “不起作用”是什么意思? 【参考方案1】:

我认为问题出在这里:

// ... 
print("2")
self.calculateSegmentDirections(index+1, time: timeVar, 
         routes: routesVar, loc: restLocation, completion: nil)
// ...

当您递归调用calculateSegmentDirections 时,您不会提交完成处理程序,而是提交nil。这是故意的吗?在我看来,这应该是:

// ... 
print("2")
self.calculateSegmentDirections(index+1, time: timeVar, 
         routes: routesVar, loc: restLocation, completion: completion)
// ...

【讨论】:

成功了!虽然我不完全确定为什么。为什么 nil 不起作用,我假设如果我传递 nil,我传递一个 nil 值,而不是不使用完成,因此如果我再次传递完成,它只是“重置”它?非常感谢,这花了我很多时间。 传递nil 不起作用,因为您正在递归地调用函数。第一次调用 (A) 将打印“1”,进入 if 分支,打印“2”,然后再次调用自身 (B),例如calculateSegmentDirections。这将打印“1”,进入else 分支,打印“3”,然后调用完成处理程序(如果不是nil) - 但这是它从 (B) 获得的完成处理程序参数,而不是从 ( A)。 是的,这就是我的想法,我只是不知道我可以将完成传递给它自己的处理程序。非常感谢你说得很清楚,为我节省了很多时间。我现在必须写很多这些,所以会很有用。

为啥我的完成处理程序永远不会被调用?

】为啥我的完成处理程序永远不会被调用?【英文标题】:Whymycompletionhandlerisnevercalled?为什么我的完成处理程序永远不会被调用?【发布时间】:2019-11-2109:09:38【问题描述】:我正在尝试调用完成处理程序,但它从未被调用过。... 查看详情

写不了,不会,告辞。程序员三连(第二次站立议会)

...进度:个人进度: 刘子琦:已经熟悉安卓开发软件的使用,计划最近一个站立议会完成2个页面开发,问题目前对Android结构理解较浅 陈艺祥:初步学习了sqlserver,学会了建表等基本操作,计划在未来两天里学习如何用java... 查看详情

第三次迭代成果

...尾工作。 1.之前通过VUE框架axios来完成ajax请求,但是使用cdn不成功,所以实现的是静态界面。于是现在转向使用JS创建HTML元素来创建动态页面。通过后台PHP获取数据库数据显示界面。    2.对fit.html做了更新,完... 查看详情

短学期第二次心得

...点,称为横切关注点,并将它们插入到应用程序代码中。使用AOP后,公共服务(比如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。在web应用启 查看详情

第二次迭代目标完成情况及感想

第二次迭代目标完成情况如下:首先是主界面的设计以及功能的实现主要XML代码是:.........<android.support.v7.widget.Toolbarxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"androi 查看详情

允许 automake 生成可选的编译规则

...:20【问题描述】:我已对一个程序进行了更改,该程序是使用英特尔性能基元的更大项目的一部分。事实证明,我最近的更改使用了仅在最新版本的IPP上可用的调用,而许多用户仍在使用旧版本。有问题的程序不是必需的,所以... 查看详情

在bash中使用getopts来获取可选的输入参数[重复]

】在bash中使用getopts来获取可选的输入参数[重复]【英文标题】:Usinggetoptsinbashtogetoptionalinputargument[duplicate]【发布时间】:2014-07-1914:30:51【问题描述】:我正在使用getopts来处理输入参数。我在读取可选参数值时遇到问题。当我使... 查看详情

subprocess.run() 在第二次迭代中失败

...来自运行时,来自3rd方程序(cpp模拟程序)。我在python中使用GPytorch执行此操作,并 查看详情

无法第二次调用身份验证提供程序

...imehit【发布时间】:2018-09-2010:13:34【问题描述】:我正在使用SpringSecurity进行身份验证@Overrideprotectedvoidconfigure(AuthenticationManagerBuilderauth)throwsExceptionauth.authenticationPro 查看详情

未调用 Firebase 存储完成处理程序

...lernotcalled【发布时间】:2019-02-2118:55:16【问题描述】:我使用Firebase存储来存储图像。一切都按预期上传,图像出现在Firebase控制台上,但无论出于何种原因,完成处理程序都不会触发,因此进度HUD不会消失。我在第6行设置了一... 查看详情

没有为 ASWebAuthenticationSession 调用会话完成处理程序

...【发布时间】:2020-03-1608:48:07【问题描述】:我正在尝试使用ASWebAuthenticationSession网络视图。身份验证完成后,不会调用会话完成处理程序。因此,网络视图不会关闭。gua 查看详情

只有当可选的主线程任务和工作线程完成时,我如何保证代码的执行?

】只有当可选的主线程任务和工作线程完成时,我如何保证代码的执行?【英文标题】:HowdoIguaranteeexecutionofcodeonlyifandwhenoptionalmainthreadtaskandworkerthreadsarefinished?【发布时间】:2021-06-2221:53:09【问题描述】:背景:我正在开发一个... 查看详情

论lua错误处理之errorassertpcallxpcall函数的使用和区别

error(message[,level])在Lua中使用error函数抛出错误信息,通常包含调用堆栈信息以及错误提示信息!第一个参数message为自定义的错误提示信息。第二个参数为可选的出错位置信息,默认为1,即为调用error函数的位置;2即为调用error... 查看详情

webservice接口第二次调用接口不通

参考技术A如果您问的是怎么办的话,使用android的HttpURLConnection直接调用webservice接口。Webservice.GetVcardByUserNo这个是封装了的webservice接口,ksoap2在解析第二次调用返回的结果时抛异常,使用android的HttpURLConnection直接调用webservice接... 查看详情

使用完成处理程序进行异步调用的多个 URLSession dataTask 导致内存上升

】使用完成处理程序进行异步调用的多个URLSessiondataTask导致内存上升【英文标题】:MultipleURLSessiondataTaskonasynchronouscallwithcompletionhandlercausesmemorygoesup【发布时间】:2019-02-0609:25:26【问题描述】:我正在快速开发一个上传项目。我... 查看详情

Angular 2 选择不绑定(第二次迭代)

...为它已经解决了。为了遵循建议,我现在尝试在任何地方使用响应式表单并尝试使用建议的选项进行选择:<form[formGroup]="form">&l 查看详情

第二次毕业设计任务书(kdd数据研究)

...实现初步处理50%3.17-3.24了解matlab下的神经网络编程,尝试使用工具包完成简单的功能实现 3.24-3.31 对数据进行再次分析处理,根据输出结果筛选出有用的属性值,并对matlab做架构思考 2、本周完成情况研究KDD数据:参考... 查看详情

在第二次使用任何 Async api 调用后,Pi 上的 Bot 崩溃

】在第二次使用任何Asyncapi调用后,Pi上的Bot崩溃【英文标题】:BotonPicrashesafterusinganyAsyncapicallsasecondtime【发布时间】:2018-02-2522:00:13【问题描述】:我将我的Discord机器人放在了RasberryPi上,但现在我遇到了问题。当我尝试使用命... 查看详情