Swift程序从不为dataTask输入CompletionHandler

Swift程序从不为dataTask输入CompletionHandler,swift,asynchronous,urlsession,Swift,Asynchronous,Urlsession,我正在使用Swift实现restapi。当然,这个API的一部分是使用HTTP请求来检索和发送数据 充分披露,我对Swift缺乏经验,可以说,我正在把它作为一个学习项目,让我的脚湿透。但它变成了一个比我预想的更困难的项目 在实现第一个get方法时,我(最终)消除了所有编译错误。但是,当我调用使用URLRequest、URLSession、dataTask等的函数时,它从未被输入 调试程序后,我可以看到程序执行到达CompletionHandler,然后直接跳到“task.resume()” 类似

我正在使用Swift实现restapi。当然,这个API的一部分是使用HTTP请求来检索和发送数据

充分披露,我对Swift缺乏经验,可以说,我正在把它作为一个学习项目,让我的脚湿透。但它变成了一个比我预想的更困难的项目

在实现第一个get方法时,我(最终)消除了所有编译错误。但是,当我调用使用URLRequest、URLSession、dataTask等的函数时,它从未被输入

调试程序后,我可以看到程序执行到达CompletionHandler,然后直接跳到“task.resume()”

类似的施工在Swift游乐场中进行,但在实际项目中不起作用

到目前为止,我已经尝试了一些事情,即使函数访问类实例变量,希望这将迫使它执行。但事实并非如此

我认为这个问题可能是关于同步性的,也许我需要使用一个信号量,但我想首先确保我没有遗漏任何明显的东西

<代码>导入基础 /** 用于包装所有GET和POST请求的类,以避免在每个API方法中重复编写请求代码的必要性。 */ 基本任务类{ 私有变量url:url 私有变量头:[字符串:字符串] 私有变量响应类型:字符串 私有var jsonResponse:有吗? 初始化(url:url,标题:[String:String],响应类型:String){ self.url=url self.header=header self.responseType=responseType }//结束初始化 public func requestJSON()->Any{ //创建URLRequest对象,并按照提供的方式用头字段填充头。 var urlRequest=urlRequest(url:self.url) 对于self.header中的(值、键){ urlRequest.addValue(值,forHTTPHeaderField:key) } 让task=URLSession.shared.dataTask(带:urlRequest){(数据、响应、错误)在 打印(“输入完成处理程序”) 如果错误!=nil{ 返回 } guard让httpResponse=响应为?HTTPURLResponse,200==httpResponse.statusCode else{ 打印(“HTTP请求未成功”) 返回 } guard let mime=response?.mimeType,mime==“application/json”else{ 打印(“不是JSON响应”) 返回 } 做{ 让json=尝试JSONSerialization.jsonObject(使用:data!,选项:[]) 打印(json) self.jsonResponse=json }抓住{ 打印(“无法转换为JSON”) 返回 } } task.resume() return“函数已返回” }//结束请求JSON } 预期的结果是返回一个JSON对象,但情况似乎并非如此

关于错误消息,我没有得到任何消息。我在调试器中得到的唯一日志是样板文件“进程已退出,代码为0”


老实说,是什么原因导致这一切都不起作用,我对此一无所知。

看来您是在命令行应用程序中编写这篇文章的。在这种情况下,程序将在URL请求完成之前终止

我认为这个问题可能是关于同步性的,也许我需要使用一个信号量,但我想首先确保我没有遗漏任何明显的东西

没错


Swift中的典型工具是
DispatchGroup
,它只是一种更高级的信号量。在启动请求之前调用
dispatchGroup.enter()
,在完成处理程序末尾调用所有
dispatchGroup.leave()
。在调用代码中,包括
dispatchGroup.wait()
以等待它。(如果这还不清楚,我可以为它添加代码,但也有很多答案可以证明这一点。)

听起来很完美,我会尝试一下。非常感谢你!