我可以通过 NSURLSession 在 Swift 中以某种方式执行同步 HTTP 请求吗

2024-01-06

我可以通过某种方式进行同步 HTTP 请求吗NSURLSession在斯威夫特?

我可以通过以下代码执行异步请求:

if let url = NSURL(string: "https://2ch.hk/b/threads.json") {
            let task = NSURLSession.sharedSession().dataTaskWithURL(url) {
                (data, response, error) in

                var jsonError: NSError?
                let jsonDict = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &jsonError) as [String: AnyObject]
                if jsonError != nil {
                    return
                }

                // ...
            }
            task.resume()
        }

但是同步请求呢?


您可以使用此 NSURLSession 扩展来添加同步方法:

extension NSURLSession {
    func synchronousDataTaskWithURL(url: NSURL) -> (NSData?, NSURLResponse?, NSError?) {
        var data: NSData?, response: NSURLResponse?, error: NSError?

        let semaphore = dispatch_semaphore_create(0)

        dataTaskWithURL(url) {
            data = $0; response = $1; error = $2
            dispatch_semaphore_signal(semaphore)
        }.resume()

        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)

        return (data, response, error)
    }
}

Swift 3 更新:

extension URLSession {
    func synchronousDataTask(with url: URL) -> (Data?, URLResponse?, Error?) {
        var data: Data?
        var response: URLResponse?
        var error: Error?

        let semaphore = DispatchSemaphore(value: 0)

        let dataTask = self.dataTask(with: url) {
            data = $0
            response = $1
            error = $2

            semaphore.signal()
        }
        dataTask.resume()

        _ = semaphore.wait(timeout: .distantFuture)

        return (data, response, error)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以通过 NSURLSession 在 Swift 中以某种方式执行同步 HTTP 请求吗 的相关文章

  • Swift 中的函数签名专业化崩溃

    我从用户那里收到崩溃报告 但我不明白该崩溃报告 It says Ribony function signature specialization
  • 如何使用符合“Hashable”协议的 ForEach

    您好 我有一个关于确认协议 Hashable 的问题 实在是太烂了 这是我的模型 struct Page Decodable Identifiable var id String var name String var thumbnail
  • node.js http设置请求参数

    我有一个 node js 应用程序 我想通过使用调用 REST apihttp request https nodejs org api http html http http request options callback 这是我的代码
  • 如何在 Swift 中使用 AXObserverAddNotification?

    如何在 Swift 中使用 AXObserverAddNotification 来检测 UI 更改 Obj C 中有一个很好的答案 我的应用程序如何检测另一个应用程序窗口的更改 https stackoverflow com questio
  • 什么会导致 TCP/IP 丢弃数据包而不丢弃连接?

    我有一个基于 Web 的应用程序和一个客户端 都是用 Java 编写的 无论如何 客户端和服务器都在 Windows 上 客户端通过以下方式发出 HTTP GET Apache HttpClient http hc apache org h
  • iPhone - 来自本地文件 URL 的 NSData

    我有一个NSURL对象 它为我提供本地文件的路径 在文档文件夹中 我想填充一个NSData包含此文件内容的对象 尝试使用dataWithContentsOfURL 但这失败了 我知道该文件存在 因为 iPhoneSDK返回路径 有人可以告诉
  • 缺少升级:在 netty 4.x 上同时提供 http 和 ws

    我正在 netty 上编写一个聊天应用程序 我尝试为两者服务HTTP and WS 但是http响应只是这些消息 不是 WebSocket 握手请求 缺少升级 这是我的代码片段 在InitChannel方法中 p addLast new H
  • 如何快速将 void 块传递给 objc_setAssociatedObject

    我正在尝试通过扩展向 UIView 添加点击手势支持 使用 Objective C 非常简单 但是当我尝试在运行时属性上设置 void 返回块时 出现以下错误 错误 类型 gt Void 不符合协议 AnyObject 这是计算的属性 va
  • 如何在 Swift 中按换行符分割字符串

    我有一个从文本文件中获得的字符串 文本文件 Line 1 Line 2 Line 3 我想将其转换为数组 每行一个数组元素 Line 1 Line 2 Line 3 根据文件的保存方式 字符串可能采用以下形式之一 string Line 1
  • UIImage 在编码/解码时不等效

    我一直在对我的模型进行一些测试 以确保当我将它们编码为 JSON 然后使用它们解码回来时它们是相等的JSONEncoder Decoder 然而 我的一项测试失败了 罪魁祸首是UIImage 我已确保在编码 解码过程中没有抛出任何错误 首先
  • 将应用程序发送到后台并从 XCTest 中的最近应用程序重新启动它

    我正在寻找问题的解决方案 其中我需要将我的应用程序发送到后台并在特定时间间隔后从最近的应用程序重新启动它 在 Instruments UIAutomation 中使用 deactivateAppForDuration 来实现此目的 有谁知道
  • Swift上传文件到PHP服务器

    因此 我将文件从 swift 上传到 PHP 服务器 POST 请求按预期到达 带有标头和所有内容 但我无法从中获取任何内容 FILES 它只是一个空数组 我显然在 Swift 方面做错了什么 这是我的代码 func testUpload
  • 如何快速将云Firestore中的数据保存到变量中?

    我想将文档中的特定字段保存到变量中 到目前为止我的代码 func getDocument path String field String nil gt some Any var returnVar Any DEFAULT VAL var
  • Swift 和 Cocoapods - 缺少必需的模块

    我正在尝试制作一个 Swift 框架 该框架依赖于两个库 阿拉莫菲尔 https github com Alamofire Alamofire and SwiftyJSON https github com SwiftyJSON Swift
  • 快速转换:错误 - CGPathAddArc

    我正在尝试将我的 Swift 2 代码转换为最新语法 Swift 3 我收到以下错误 Nil 与预期的参数类型 UnsafePointer 不兼容 斯威夫特2代码 CGPathAddArc 路径 nil overlayView frame
  • 遵守协议并保持财产私有

    我需要将符合类中的协议属性用作私有属性 但编译器拒绝这样做 我怎样才能实现呢 protocol ProtocolX class var x Int get set func performAnyActionOnX extension Pro
  • 在堆栈视图内的 Uilabel 之间创建垂直线 [重复]

    这个问题在这里已经有答案了 我想在代码中创建一个带有自定义标头的 UICollectionView 因此 我创建了 UICollectionViewCell 的子类来描述我的自定义标头 我想在标题中以水平线显示五个标签 因此 我创建了五个标
  • Swift - 向每个页面添加相同的导航栏项目

    我正在尝试将相同的导航栏项目添加到应用程序中的每个选项卡 我目前已在我的 homeController 中正确设置了它们 但我想将代码移动到一个单独的文件中 并在我想要的任何地方远程实现它 例如 在导航栏左侧添加一个 搜索 图标 而不必在每
  • 以编程方式设置 Jetty GzipHandler

    我在玩码头GzipHandler它的工作方式似乎相当奇怪 它只压缩已经压缩的文件 我的整个设置是 GzipHandler gzipHandler new GzipHandler gzipHandler setHandler myHandle
  • 为什么 Swift 语言将 8 位二进制值赋给 Int8 类型的 var 时会出现溢出?

    当我在操场上写下这一行时 let firstBits Int8 0b11111111 出现错误 存储到 Int8 时整数文字溢出 由于 Int8 是有符号值 其范围是从 128 到 127 从左起第一位代表单数 减号或加号 其余 7 位代表

随机推荐