比特币实时价格接收与显示代码【Swift】
在这篇文章中,我们将学习如何利用websocket开发一个可以实时接收并显示比特币/Bitcoin价格行情的Swift应用。
先看一下我们最终的成果:
比特币开发相关链接:
1、用URLSession创建WebSocket
借助于URLSessionWebSocketTask
,用URLSession创建WebSocket变得非常简单了。下面说明一个WebSocket连接的5个核心操作。
第1个,打开连接:
let urlSession = URLSession(configuration: .default) let webSocketTask = urlSession.webSocketTask(with: "wss://ws.finnhub.io?token=XYZ") webSocketTask.resume()
第2个,发送字符串或数据
webSocketTask.send(.string("Hello")){error in ...}
第3个,接收响应结果消息
webSocketTask.receive{result in ...}
第4个,断开连接
webSocketTask.cancel(with: .goingAway, reason: nil)
第5个,我们可以利用ping/pong机制来保证连接保持激活:
webSocketTask?.sendPing { (error) in ... }
2、基于SwiftUI + WebSocket实现比特币实时行情界面
首先到这个网站生成可以访问比特币行情的API KEY:
下面的SwiftUI视图包含一个SF符号图片以及一个显示比特币实时价格的文本框:
import SwiftUI import Combine import Foundation struct ContentView: View { @ObservedObject var service = WebSocketService() var body: some View { VStack{ Image(systemName: "bitcoinsign.circle.fill") .font(.system(size: 150)) .foregroundColor(Color(red: 247 / 255, green: 142 / 255, blue: 26 / 255)) .padding() Text("USD") .font(.largeTitle) .padding() Text(service.priceResult) .font(.system(size: 60)) }.onAppear { self.service.connect() } } }
priceResult
需要从ObservableObject
类发布 —— 可以在下面的WebSocketService.swift
中看到:
class WebSocketService : ObservableObject { private let urlSession = URLSession(configuration: .default) private var webSocketTask: URLSessionWebSocketTask? private let baseURL = URL(string: "wss://ws.finnhub.io?token=XYZ")! let didChange = PassthroughSubject<Void, Never>() @Published var price: String = "" private var cancellable: AnyCancellable? = nil var priceResult: String = "" { didSet { didChange.send() } } init() { cancellable = AnyCancellable($price .debounce(for: 0.5, scheduler: DispatchQueue.main) .removeDuplicates() .assign(to: \.priceResult, on: self)) } }
在上面的代码中,我们定义了一些属性并在init
方法中建立了订阅。你需要使用自己的API KEY来替换XYZ
。
用于Publisher
上的操作符非常重要。我们使用了Debounce
来降低实时更新的频率,还使用了removeDuplicates
来剔除重复的值。
要手动将变化发送到SwiftUI视图,当priceResult
属性被更新时可以触发didChange.send()
方法。
构造WebSocket URLSession的WebSocketService
类的其他代码如下:
class WebSocketService : ObservableObject { func connect() { stop() webSocketTask = urlSession.webSocketTask(with: baseURL) webSocketTask?.resume() sendMessage() receiveMessage() } func stop() { webSocketTask?.cancel(with: .goingAway, reason: nil) } private func sendMessage() { let string = "{\"type\":\"subscribe\",\"symbol\":\"BINANCE:BTCUSDT\"}" let message = URLSessionWebSocketTask.Message.string(string) webSocketTask?.send(message) { error in if let error = error { print("WebSocket couldn’t send message because: \(error)") } } } private func receiveMessage() { webSocketTask?.receive {[weak self] result in switch result { case .failure(let error): print("Error in receiving message: \(error)") case .success(.string(let str)): do { let decoder = JSONDecoder() let result = try decoder.decode(APIResponse.self, from: Data(str.utf8)) DispatchQueue.main.async{ self?.price = "\(result.data[0].p)" } } catch { print("error is \(error.localizedDescription)") } self?.receiveMessage() default: print("default") } } } }
下面的结构模型用来解码API的响应结果:
struct APIResponse: Codable { var data: [PriceData] var type : String private enum CodingKeys: String, CodingKey { case data, type } } struct PriceData: Codable{ public var p: Float private enum CodingKeys: String, CodingKey { case p } }
现在使用WatchOS仿真器运行应用,看起来是这样:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
疫情结束后,会影响程序员年后找工作吗?
截止到2.19日,疫情发展已呈现下降态势,很多年前已经辞职,或者有想法的离职的朋友,大家在关心疫情好转的同时,不免担心年后找工作的事情。 那么究竟疫情会给年后找工作的求职者们带来哪些影响呢?1.整个求职周期拉长 当前这一阶段正处于肺炎疫情的爆发期,正如前几天网上传的段子,几时能动?钟南山爷爷说动才动!显然当下为了避免疫情的进一步蔓延,国家延长了假期,前面也说到过,各大企业的复工时间也拉长,自然影响企业HR的招聘计划啊,无疑这是个漫漫求职路啊。 而从正常的时间周期来看,从面试到上岗,至少需要几个星期,慢则甚至几个月,其中还不乏企业必须要走的流程,层层审核,何况搁置了的人员调动等其他工作,从面试到正式上岗,找工作除了等还是等啊,对求职者来说这是场长久拉锯战啊。 2.企业招聘需求缩减 不用说,受疫情的影响,企业原定的初八甚至初六就开始上班的,这么一耽搁,加上整个社会的国民消费经济寒冬,无论什么企业受到的影响不可估量。尤其像旅游业和餐饮业,过年这段时间本就是旺季,一年当中营业额最高的时候,全国商场的统一关门,春节档院线的相继撤档,饭店集体地低价出售肉菜,旅游业更是无人问津,一般小公司小企业哪能...
- 下一篇
研发面经:3轮面试,远程面试4天拿到的offer!
马上快到金三银四都春招阶段了,在这本就是跳槽、找工作的年后黄金时间,大多数求职者都早早做好年后求职的准备,其中不乏有年前早早辞了工作准备年后跳槽的有经验的职场老人们,也有一批即将毕业的应届毕业生的职场新人们。 但是受此次“新冠肺炎”疫情影响之后,“金三银四”逐渐演变成千军万马过独木桥,一边是摩拳擦掌有经验的职场老人们,而另一边则是即将毕业跃跃欲试的新鲜血液,只会让求职人才们越积越多,面对这样岗位少求职者多的情况下,竞争力可想而知,再加上企业的招聘计划调整,侧面也是加剧了求职的难度。 当然也有少部分公司现在也已经开始了远程面试,对于才能怎样拿到腾讯、阿里、字节跳动等大厂的offer,我问了一些在大厂工作的朋友。 大概总结一下,技术基础扎实是通过一、二面的首要条件,但是接下来的三四面就不是这么一帆风顺。 由于一些程序员们只重视技术,而在工作经验、项目经验等等方面有所欠缺。而在职业发展方面,你需要得到他人的帮助,学会“站在巨人的肩膀上。” 比如说通过系统性课程的学习和有丰富项目经验的导师辅导,从工具、思维、方法论、逻辑等双管齐下,才能离想要的offer更进一步。 在这里我分享一份我们整理的《...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路