Swift 3:URLSession / URLRequest 不起作用

2023-11-22

我仍在尝试将我们的应用程序从 Swift 2 转换为 Swift 3,因为我们所有的 Apple 设备现在都运行 iOS 10,所以我被迫这样做。

我已经完成了代码转换,并认为我做得很好,但是,在尝试调试我的 JSON 问题(发布在另一个问题中)时,我现在正在处理甚至没有发送的请求。

let params: [String:AnyObject] = [
    "email":"\(self.preferences.string(forKey: "preference_email")!)" as AnyObject
]
let requestParams: [String:AnyObject] = [
    "action":"601" as AnyObject,
    "params":params as AnyObject
]

do {
    let requestObject = try JSONSerialization.data(withJSONObject: requestParams, options:[])
    var request = URLRequest(url: URL(string: "http://domain.tld/path/")!)

    request.httpBody = requestObject
    request.httpMethod = "POST"

    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    NSLog("Got here?")

    session.dataTask(with: request) {data, response, error in
        guard let data = data, error == nil else {
            print("error=\(error)")
            return
        }

        NSLog("Got here 3?")

        let object:JSON = JSON(data:data)

        NSLog("Object: \(object)")
    }.resume()

    NSLog("Got here 4?")
} catch {
    NSLog("Got here catch?")
}

NSLog("End of getUser")

上面的代码产生以下输出:

2016-10-04 13:00:12.011969 OneTouch[1589:623015] [DYMTLInitPlatform] platform initialization successful
2016-10-04 13:00:12.264319 OneTouch[1589:622954] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2016-10-04 13:00:12.265321 OneTouch[1589:622954] [MC] Reading from public effective user settings.
2016-10-04 13:00:12.295055 OneTouch[1589:622954] Got here?
2016-10-04 13:00:12.295445 OneTouch[1589:622954] Got here 4?
2016-10-04 13:00:12.295515 OneTouch[1589:622954] End of getUser
(lldb) 

这意味着甚至没有提出请求。是否有一些密钥需要再次添加到 PLIST 中?这开始变得烦人了。

下面是我的旧代码,它甚至不再工作:

let params: [String:AnyObject] = [
    "email":"\(self.preferences.string(forKey: "preference_email")!)" as AnyObject
]
let requestParams: [String:AnyObject] = [
    "action":"601" as AnyObject,
    "params":params as AnyObject
]

do {
    let requestObject = try JSONSerialization.data(withJSONObject: requestParams, options:[])
    let request = NSMutableURLRequest(url: URL(string: "http://domain.tld/path/" as String)!, cachePolicy:NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 20)

    request.httpBody = requestObject
    request.httpMethod = "POST"

    NSLog("Got here?")

    let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {data, response, error in
        if error != nil {
            NSLog("Got here 2?")
        }

        NSLog("Got here 3?")

        let object:JSON = JSON(data:data!)

        NSLog("Object: \(object)")
    })

    NSLog("Got here 4?")

    task.resume()
} catch {
    NSLog("Got here catch?")
}

NSLog("End of getUser")

上面的代码产生与其他代码相同的输出!


如果调用后立即设置断点getUser, the URLSession异步运行的任务完成处理程序(即通常稍后完成,除非请求立即失败或由某些缓存的响应满足)可能没有机会被调用。

如果你在里面放置一个断点dataTask完成处理程序,此时您应该看到您的数据。


就我个人而言,我会确保给予getUser一个完成处理程序,以便您知道它何时完成:

func getUser(completionHandler: @escaping (JSON?, Error?) -> Void) {
    let params = [
        "email":"\(preferences.string(forKey: "preference_email")!)"
    ]

    let requestParams: [String: Any] = [
        "action": "601",
        "params": params
    ]

    do {
        let requestObject = try JSONSerialization.data(withJSONObject: requestParams)

        var request = URLRequest(url: URL(string: "http://domain.tld/path/")!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 20)

        request.httpBody = requestObject
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("application/json", forHTTPHeaderField: "Accept")

        let task = URLSession.shared.dataTask(with: request) {data, response, error in
            guard let data = data, error == nil else {
                completionHandler(nil, error)
                return
            }

            completionHandler(JSON(data: data), nil)
        }

        task.resume()
    } catch {
        completionHandler(nil, error)
    }
}

然后当你调用它时,你可以执行以下操作:

getUser { json, error in
    guard let json = json else {
        print(error)
        return
    }

    // do something with json
    print(json)
}

只需将你的断点放入getUser的完成处理程序。请记住,您无法保证完成处理程序是否会在主队列上运行,因此您需要确保将 UI 或模型更新分派回主队列。

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

Swift 3:URLSession / URLRequest 不起作用 的相关文章

随机推荐

  • 角材料表宽度 100%

    我在角度材料卡内使用材料表 这是我的代码
  • 如何让具有所需权限的用户通过php下载文件?

    我有一个 php 文件 它充当我希望人们下载的所有文件的看门人 他们有足够的权限 我使用的代码将文件扔给用户是 header Content Description File Transfer header Content Type app
  • 为什么 scala 不将该类型 lambda 与底层类型统一?

    trait A type T def test t T Unit case class B S lt A a S t S T def test a test t Error type mismatch found B this t type
  • nginx 500 错误,tmp 文件夹的权限被拒绝

    当我尝试上传照片时 我从 Django admin 得到了 500 当我检查 error log 时 我发现 2014 03 13 23 00 55 crit 16478 0 24 open var lib nginx tmp client
  • MVC4 Bundle 缩小不适用于 javascript 保留字

    使用最新版本的 MVC4 当 javascript 包含保留字作为键名时 我无法缩小 javascript 请参阅下面的错误 其中包含应已缩小的有效 JavaScript 有谁知道如何解决重写 javascript 以使用 表示法的问题 P
  • 使用 HtmlHelper.BeginForm() 是如何工作的?

    好的 我想知道如何
  • 是否可以通过 LKM 添加系统调用?

    我想通过 LKM 添加新的系统调用 但我不知道如何执行此操作 也就是说 我知道如果我想添加一个全新的系统调用 我可以查看sys call table并找到一个sys ni syscall然后替换它 但我很好奇是否真的有可能add to th
  • 从 ASP.NET 页面返回 JSON 对象

    在我的特殊情况下 我有几个解决方案来解决我的问题 我想知道哪一种更可行 在这种情况下 我还可以通过从服务器端代码返回 JSON 对象来实现我的目标 但是 我不知道它是如何完成的以及最好的方法是什么 首先 我不需要完整的 aspx 页面 因为
  • 为什么我的 cron 作业执行多次?

    我已经设置了一个需要每天执行一次的 cron 作业 但它会执行多次 我已经按照下面提到的方式设置了它 5 8 sh file path 谁能告诉我为什么会发生这种情况以及我应该做什么来解决这个问题 如果没有更多关于您的特定设置 系统的知识
  • 在Python中检测像素化图像

    我试图确定图像是否是平方的 像素化的 我听说过 numpy 或 scipy 的二维傅里叶变换 但它有点复杂 目标是确定由于压缩不良而产生的平方区域的数量 如下所示 img a 我不知道这是否可行 但是 您可以尝试的方法是获取像素周围最近的邻
  • 看似有效的 JSON 上的 JSON.parse 错误[重复]

    这个问题在这里已经有答案了 我在用着JSON parse 解析一个json这是从使用 jquery 调用的 api Laravel 5 返回的 get The json看似有效 然而JSON parse 在 Safari 和 Chrome
  • 将一个上下文中的 spring bean 替换为另一个上下文中的模拟版本

    我正在编写一个集成测试 其中应用程序上下文 xml 在启动期间初始化 测试类中有几个使用特定 bean X 已在 xml 中定义 的测试方法 我的实际要求是仅针对其中一种测试方法来模拟 bean X 在测试方法内部 我尝试使用 ClassP
  • GCP - 验证 PubSub 推送的云函数 https 端点的所有权

    很确定没有办法做到这一点 但很高兴联系看看其他人是否有任何想法 我想做的是 我有 2 个微服务作为云托管在 Google Cloud Platform 上 功能 我的第一个微服务执行任务并触发 PubSub 主题为 x 的消息 我想将我的第
  • 集合的位向量实现

    在阅读 aho 的数据结构书中有关集合基本操作的章节时 我在集合的位向量实现主题中遇到了以下行 if the universal set is sufficiently small so that a bit vector fits in
  • 如何缩小/剪切 Git 存储库

    我们有一个 Git 存储库 其中有 7 名贡献开发人员 拥有超过 2 5 年的历史和大约 10 000 次提交 我们使用 Assembla 进行推拉 当我们添加新的开发人员时 将存储库克隆到他们的开发计算机上需要将近一个小时 我不确定这是否
  • MySQL 触发器 - AFTER INSERT 触发器 + UDF sys_exec() 问题

    问题 我有一个保存某些记录的表 插入完成后 我想通过 MySQL 的 sys UDF 调用外部程序 php 脚本 现在 问题是我已将记录的 ID 传递给脚本的触发器 当我尝试通过脚本提取数据时 我得到 0 行 在我自己的测试中 我得出的结论
  • 为什么我的 Perl 就地脚本即使失败,也会以零退出代码退出?

    我有一个单行 Perl 搜索和替换 大致如下所示 perl p i e s foo bar non existent file txt 因为该文件不存在 这不是故意的 但这是自动构建脚本的一部分 所以我想防止这种情况发生 Perl 退出时出
  • 发布到 Facebook 后如何关闭弹出窗口?

    在我们的博客上 我们有一个链接 用户可以将我们的文章发布到他们的时间线 弹出窗口打开 用户向 Facebook 发帖 然后弹出窗口停留在那里并重定向到 www oursite com 当用户完成发布或单击取消按钮时 我们如何关闭弹出窗口 根
  • 使用 pip 安装软件包会返回错误[重复]

    这个问题在这里已经有答案了 不久前我从下载了 piphttps pip pypa io en stable installing 在我意识到我的 python 版本已经附带了 pip 之前 我成功地使用它来下载 pygame 但现在我尝试下
  • Swift 3:URLSession / URLRequest 不起作用

    我仍在尝试将我们的应用程序从 Swift 2 转换为 Swift 3 因为我们所有的 Apple 设备现在都运行 iOS 10 所以我被迫这样做 我已经完成了代码转换 并认为我做得很好 但是 在尝试调试我的 JSON 问题 发布在另一个问题