如何在 Swift/Objective C 中从 HTTP 请求返回数据

2023-12-14

我正在尝试使用 Coinbase 的 API 来获取有关我的在线比特币钱包的信息,并且我正在尝试使用 Swift 的 NSURLSession 对象来执行此操作。也许我在苹果文档中遗漏了一些明显的东西,但是在阅读了有关 NSURLSession 和 NSURLSessionTask 的信息后,我仍然不明白如何发出 HTTP 请求,然后返回响应的正文,以便正文可以在整个生命周期中持续存在我的应用程序。到目前为止,我只看到能够使用返回 void 的完成块,或者本身返回 void 的委托或使用也返回 void 的完成块。我想稍后在应用程序中使用从响应中获得的数据,但因为我使用的是完成块,所以我必须在响应到达后立即处理响应数据。

为了清楚起见,我想按照下面的伪代码函数做一些事情:

func makeHTTPCall(urlString : String) -> String? {
    create NSURLSession object
    create request with proper headers and using the passed-in urlString
    use the session object to send out the request 
    get the response object, extract the response body as a string, and return it
}

然后,我可以这样称呼:

let myObject : MyObject = MyObject()
let respData : String = myObject.makeHTTPCall("https://coinbase.com/api/v1/account/balance")

该数据返回一个 JSON 对象字符串,这是我想要在响应及其完成块的生命周期之外保留的字符串。既然我可以在 Xcode 6 中使用,我该如何在 Swift 或 Objective C 中执行此操作?

编辑:已经发布了两个答案,但他们错过了这个问题的基本要点。我需要返回从响应中收到的数据。这两个答案(以及我在 SO 上看到的所有其他答案)都只是打印收到的数据。我想要的代码不使用返回 void 的完成处理程序,而是返回数据,以便稍后在应用程序的生命周期中使用它。如果我的问题有任何不清楚的地方,请告诉我,尽管我不知道如何才能更清楚地说明这一点。


在编辑您的问题时,您说:

我需要返回从响应中收到的数据。这两个答案(以及我在 SO 上看到的所有其他答案)都只是打印收到的数据。我想要的代码不使用返回 void 的完成处理程序,而是返回数据,以便稍后在应用程序的生命周期中使用它。如果我的问题有任何不清楚的地方,请告诉我,尽管我不知道如何才能更清楚地说明这一点。

我理解这个策略的吸引力,因为它感觉非常直观合乎逻辑。问题是您的网络请求应该始终异步运行(例如,使用您提到的完成处理程序模式)。

虽然有一些技术可以使函数“等待”异步请求完成(即使异步请求NSURLSession方法同步运行或使用旧的同步网络请求方法之一),由于多种原因,这是一个非常糟糕的主意:

  • 如果您从主线程执行此操作,则会导致糟糕的用户体验(在请求正在进行时应用程序将无响应,并且用户不知道应用程序是否正忙于执行某些操作或是否因某种未知原因而被冻结) )。

  • 同样,如果您从主线程执行此操作,您还可能面临 iOS“看门狗”进程杀死您的应用程序的风险(因为如果您在错误的时间阻塞主队列超过几秒钟,特别是当应用程序进入前台,操作系统将毫不客气地终止您的应用程序)。看技术问答#1693有关同步网络请求问题的讨论。

  • 我们通常更喜欢异步网络技术,因为它们提供了同步技术无法提供的更多功能(例如,使请求可取消、在使用基于委托的网络请求时提供进度更新等)。

您确实应该使用其他问题建议的完成处理程序模式,并在这些处理程序中管理应用程序的更改状态。在某些情况下,在某些网络请求完成之前,您绝对不能让用户继续进行(例如,在您确认用户的比特币余额之前,您不能让用户购买东西,并且在他们登录之前您不能这样做),然后更改UI 指示此类请求正在进行中。例如,调暗 UI、禁用控件、弹出活动指示器视图(也称为“旋转器”)等。只有这样,您才会发起请求。请求完成后,您将恢复 UI。我知道这看起来很多,但当用户在之前的请求完成之前绝对无法继续时,这是正确的方法。

我还仔细思考是否真的必须强迫用户等待先前的网络请求完成。有时,在某些情况下,您可以让用户在网络请求正在进行时执行/查看其他操作。是的,有时这是不可能的,但如果您可以在应用程序中找到此类机会,您最终将获得更优雅的用户体验。

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

如何在 Swift/Objective C 中从 HTTP 请求返回数据 的相关文章

  • 错误消息:您输入的捆绑包 ID 已被使用

    我正在尝试发布一个 iPhone 应用程序 这不是第一个 我过去已经发表过其他的 因此 我在第一个和第二个表单中输入了所需的信息 然后填写了第三个大表单 您还可以在其中上传图标和屏幕截图 好吧 我在上传屏幕截图之前按下了 保存 按钮 因为我
  • Flutter 应用程序在 iOS 平台的 firebase 电话身份验证中崩溃

    我在我的项目中实现了 Firebase Phone auth 在 Android 端 一切正常 但对于 iOS 端 当我尝试从我的端发送验证码时 应用程序崩溃并失去连接 我已在下面提交了我的代码 主程序 dart class MyApp e
  • 如何为 iPhone 6+、6 和 5 指定不同尺寸?

    我想让 iPhone 6 6 和 5 上的视图看起来几乎相同 在附图中 我的意思是 例如 取消 按钮在 iPhone 5 中距离屏幕左边缘应为 30 像素 在 6 中为 35 像素 在 6 中为 45 像素 其他元素也类似 如何为每种类型设
  • Swift:设置协议的可选属性

    如何设置协议的可选属性 例如 UITextInputTraits 有许多可选的读 写属性 当我尝试以下操作时 出现编译错误 无法分配给 textInputTraits 中的 keyboardType func initializeTextI
  • 有什么方法可以询问方法的名称吗?

    我正在尝试调试我正在开发的 iPhone 应用程序 向各种源文件添加 50 条 NSLog 语句的想法让我感到很兴奋 我想做的是写一对陈述 比如 NSString methodName self methodName NSLog metho
  • jQuery:离线后 POST 出错(iOS 和 Chrome)

    我构建了一个具有离线功能的 HTML5 Web 应用程序 使用 AppCache 程序流程为 Online 在网络上时 应用程序预加载一些基本信息 工作 Offline 用户拿着装有应用程序的平板电脑offline 然后在应用程序上执行他们
  • 我的 UICollectionView 无法使用 Swift 平滑滚动

    我有一个CollectionView它使单元出队取决于message类型 例如 文本 图像 我遇到的问题是当我向上 向下滚动时滚动确实很不稳定 因此用户体验不是很好 这仅在第一次加载单元格时发生 之后滚动就会平滑 我有什么想法可以解决这个问
  • 未知异常和崩溃

    当我尝试快速滚动表格视图或从远程重新加载数据时 我的应用程序崩溃了 当我先进行远程获取然后滚动表格视图时 一切似乎都工作正常 我不知道下面的崩溃日志意味着什么 它只是有时工作正常 有时崩溃 Incident Identifier 710A1
  • 在 iOS 上使用 RNCryptor 异步解密大文件

    我需要在 iOS 上使用 RNCryptor 异步解密一个大文件 以便显示进度条 我在任何地方都找不到示例 因此尝试了我猜对的方法 但是 我想出的方法不起作用 解密器的处理程序从未被调用 并且线程在发送所有数据后因 EXC BAD ADDR
  • 无法以编程方式快速设置 NSLayoutConstraint 乘数...“无法分配给此表达式的结果

    我试图以编程方式快速设置乘法器的约束 当我设置该值时 它只会给我错误 无法分配给该表达式的结果 我用 IBOutlet 声明了 NSLayoutConstraint 然后设置乘数 就像我对另一个常量所做的那样 效果很好 但这个不会接受它 I
  • 使用 UITabBarController 时覆盖整个屏幕的视图?

    我想在 UITabBarController 设置中在整个屏幕上覆盖 HUD 样式的透明图形 执行此操作的按钮位于第一个选项卡的屏幕 FirstViewController 中 并且覆盖层也应该覆盖选项卡 这可能吗 您可以将新视图直接附加到
  • 在 Objective-C 中的 Swift 类上调用 NSStringFromClass 返回模块损坏的名称

    我知道这个问题 https stackoverflow com questions 24107658 get a user readable version of the class name in swift in objc nsstri
  • Xcode 异步单元测试在主线程上等待

    我正在尝试使用 Xcode 中的单元测试来测试一些异步代码 但主线程被阻塞 问题在于 某些正在测试的代码期望从 iOS 类 AVFoundation 接收回调 但是 AVFoundation 类似乎只会在主线程上回调 问题是 如果我正在进行
  • 从现有坐标地图套件中查找最近的位置

    我正在为拥有多家商店的客户开发 iPhone 应用程序 目标 C 我有数组中所有商店 20 的坐标 纬度 长 目前我正在考虑循环遍历商店坐标数组并获取从用户当前位置到商店位置的距离 然后将它们添加到数组中并按最小距离进行排序 这是正确的方法
  • 无法将项目添加到 NSMutableArray ivar

    我的目标是将字符串添加到数组中 并在我调用的方法中执行此操作 在这个方法中 我在数组中得到一个空值 但不知道为什么 我在课程开始时有这样的内容 NSMutableArray listOfEvents 以及我在每个事件上调用的方法 void
  • Glib 在 iPhone 应用程序中的使用

    我想基于现有的开源 Objective C 框架开发一个 iPhone 应用程序 但是该框架广泛使用了 glib 库 我找不到一种方法来构建和包含 iPhone 应用程序的 glib 库 非越狱 有什么办法可以做到这一点 或者有没有推荐的方
  • 在 Object 子类及其自己的子类上实现ignoreProperties()

    我是领域新手 我正在使用继承自 Object 的基类以及该基类的自定义子类创建模型 我的模型要求基类通过覆盖静态来声明一些属性被忽略ignoredProperties 方法 当尝试在某些基类子类上重写该方法时 我收到一个 Swift 编译器
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b
  • 上传存档错误:“缺少 iOS 发行版签名身份......”

    我正在尝试使用 Xcode 将我的 iOS 应用程序存档上传到 iTunes Connect 但是当我单击 上传到 App Store 时 出现错误 Xcode 尝试查找或生成匹配的签名资产并 由于以下问题未能做到这一点 缺少 iOS 为
  • 致命错误:在 Swift 中解包可选值时意外发现 nil

    所以我试图获取 Swift 中输入字段的文本 这就是我得到的 class ViewController UIViewController IBOutlet var passwordField UITextField IBOutlet var

随机推荐