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

如何在游乐场中运行异步回调

刘意
2023-03-14
// Playground - noun: a place where people can play

import Cocoa
import XCPlayground

let url = NSURL(string: "http://stackoverflow.com")
let request = NSURLRequest(URL: url)

NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.currentQueue() {
response, maybeData, error in

    // This block never gets called?
    if let data = maybeData {
        let contents = NSString(data:data, encoding:NSUTF8StringEncoding)
        println(contents)
    } else {
        println(error.localizedDescription)
    }
}

共有1个答案

裘嘉木
2023-03-14

虽然您可以手动运行一个运行循环(或者对于不需要运行循环的异步代码,使用其他等待方法,如调度信号量),但是我们在playgrounds中提供的等待异步工作的“内置”方式是导入xcplayground框架并设置xcplaygroundPage.currentPage.needsinDefiniteExecution=true。如果已经设置了此属性,那么当顶级游乐场源完成时,我们将继续旋转主运行循环,而不是停止游乐场,这样异步代码就有机会运行。我们最终会在超时后终止游乐场,该超时默认为30秒,但如果您打开助理编辑器并显示时间线助理,可以配置该超时;超时在右下角。

例如,在Swift 3中(使用URLSession而不是NSURLConnection):

import UIKit
import PlaygroundSupport

let url = URL(string: "http://stackoverflow.com")!

URLSession.shared.dataTask(with: url) { data, response, error in
    guard let data = data, error == nil else {
        print(error ?? "Unknown error")
        return
    }

    let contents = String(data: data, encoding: .utf8)
    print(contents!)
}.resume()

PlaygroundPage.current.needsIndefiniteExecution = true

或者在Swift 2中:

import UIKit
import XCPlayground

let url = NSURL(string: "http://stackoverflow.com")
let request = NSURLRequest(URL: url!)

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.currentQueue()) { response, maybeData, error in
    if let data = maybeData {
        let contents = NSString(data:data, encoding:NSUTF8StringEncoding)
        println(contents)
    } else {
        println(error.localizedDescription)
    }
}

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
 类似资料:
  • 我想开始学习Swift,但我不熟悉Xcode。在开发者苹果网站上,你可以下载一个游乐场,你可以在学习他们的书“快速编程语言”的同时使用它。但我使用的是较旧版本的Xcode(V6.2),游乐场是为版本7制作的。有没有一种不用升级到Xcode最新版本就可以打开游乐场的方法?谢谢

  • 问题内容: 许多Cocoa和CocoaTouch方法都将完成回调实现为Objective- C中的块,而实现为Swift中的Closures。但是,在Playground中尝试这些操作时,永远不会调用完成操作。例如: 我可以在Playground时间轴中看到控制台输出,但是在我的完成块中从未调用过… 问题答案: true`。如果设置了此属性,则在您的顶级游乐场源完成时,我们将继续旋转主运行循环,而

  • 我试图重现这样一个场景,红色和蓝色矩形可以在不同的屏幕尺寸下占据相同的宽度和高度(以及它们之间的相同间隙)。 我正在使用NSLayoutConstraint(我知道现在首选锚,只是试图探索基础)。我在swift游乐场尝试了以下代码: 但它显示的只是一个白色屏幕,其宽度与iPhone不匹配。我在这里做错了什么?为什么我看不到红蓝屏?

  • 问题内容: 在我的NodeJS代码中,我需要进行2或3个API调用,每个调用都会返回一些数据。在完成所有API调用之后,我想将所有数据收集到单个JSON对象中以发送到前端。 我知道如何使用API​​回调(下一个调用将在上一个调用的回调中发生)执行此操作,但这会很慢: 我知道您也可以通过promise做一些类似的事情,但我认为相同的概念适用于下一个调用要等到当前调用完成后才能执行的情况。 有没有一种

  • 问题内容: 如何不等待就异步运行PHP代码?我有一个长期运行(几乎无限),应该在服务器启动时运行,并且应该异步处理而无需等待。 我猜可能的选择是: 在网页中运行代码并保持打开状态以执行该任务 从某些在后台处理的命令行实用程序(我不确定如何)调用脚本。 我在本地服务器上运行PHP脚本,该脚本将在发生某些事件(例如生日提醒)时发送电子邮件。 请提出在不使用浏览器打开页面的情况下如何实现此目的。 问题答

  • 我有endpoint,它可以返回同步和异步结果 如何刻意返回某物,即同步?