URLSession dataTask completionHandler在游乐场中不起作用

我看了youtube的一个教程,并尝试了这些教程。 然后我在playground文件中编写代码,但没有结果,但没有错误。 因此,我在XCode中创建了一个新项目。 然后向Main.StoryBoard添加一个Button并将UI连接到代码。 在完成所有必要的事情后,我在模拟器中运行项目,一切顺利,我可以看到完成处理程序内的所有工作。 以下是XCode项目中的代码。

@IBAction func doNetwork(_ sender: UIButton) { print("start network jobs...") // url let url: URL! = URL(string: "http://192.168.0.12/swnet.php") URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) // url session let session = URLSession.shared let task: URLSessionDataTask = session.dataTask(with: url, completionHandler: { (data, response, error) in print("Handler") if let respData = data { print("Data") print(respData) } if let resp = response { print("Resp") print(resp) } if let err = error { print("Error") print(err) } }) task.resume() } 

以下是操场上的代码。

 // url let url: URL! = URL(string: "http://192.168.0.12/swnet.php") URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) // url session let session = URLSession.shared let task: URLSessionDataTask = session.dataTask(with: url, completionHandler: { (data, response, error) in print("Handler") if let respData = data { print("Data") print(respData) } if let resp = response { print("Resp") print(resp) } if let err = error { print("Error") print(err) } }) task.resume() 

您需要告诉操场继续执行足够长的时间以完成异步代码。 要做到这一点:

 import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true 

来自Apple关于此属性的文档 :

默认情况下,执行所有顶级代码,然后终止执行。 使用异步代码时,启用无限期执行以允许在达到操场的顶级代码结束后继续执行。 反过来,这会给线程和回调时间执行。