Table of Contents
iOS用のリアルタイムの株式市場ダッシュボードの構築には、ネットワーク、データ処理、チャートレンダリングの固有な把握が必要です。このガイドでは、プロジェクトセットアップとAPI統合からライブ更新とパフォーマンスチューニングまで、ワークフロー全体をカバーしています。これにより、応答性、生産品質アプリを配信できます。
前提条件と工具
開始する前に、環境が整っていることを確認してください。
- macOS] は、Xcodeの最新バージョンがインストールされています。
- [Swift 5.7+] - この実装全体で使われる言語。
- [Alamofire] - HTTPリクエストと応答処理を簡素化する高レベルのネットワークライブラリ。 Swift Package Manager(SPM)またはCocoaPodsを介して統合します。
- [Charts[]] - よく知られているiOSのチャートライブラリ(MPAndroidChartのポート)。 SPMを使用してください: [
- [ ストックデータ API] – 人気のオプションには、アルファVantage (APIキーで無料ティア)、[]]IEXクラウド[]、または[Finnhub]]])が含まれます。 各オファーはリアルタイムおよび歴史的なエンドポイントです。
- []CocoaPods または SPM[ – 依存関係管理者。 SPM は Xcode に組み込まれ、推奨されます。
プロジェクト設定と依存関係
[]App[[]テンプレートを使用して、新しいXcodeプロジェクトを作成します。 ]の下で、ファイル> パッケージを追加、Alamofireとチャートを追加します。 Alamofireの場合、メインブランチURL とチャートはを使用します。 これは、手動ダウンロードを避け、最新の状態にあなたの依存関係を維持します。
追加したら、[Info.plistを構成して、APIドメインのApp Transport Security例外でネットワークアクセス(HTTPが必要な場合)を許可するか、HTTPSエンドポイントを使用する。
データモデルの設計
プロバイダーが返したJSON構造をミラーリングする 構造を作成します。ほとんどの API は、]、]、 、 、 [、 []]のようなフィールドを持つオブジェクトの配列を返します。リアルタイムダッシュボードでは、最新の価格と履歴データの転がり窓(例えば、100)に焦点を当てます。
struct StockDataPoint: Codable {
let timestamp: TimeInterval
let price: Double
let volume: Int
}
これらの点の配列を保持する [ コンテナを定義します。また、シンボルや最後のリフレッシュタイムのようなメタデータ。APIからヘビ case にマッチして、Swift で camelCase を使用します。
リアルタイム機能を備えたネットワークレイヤー
Alamofire を使用してデータを取得する クラスを作成します。 リアルタイムの更新には、2 つのアプローチがあります。
- [Polling] - 定期的にHTTP GETリクエストを送信します(APIレート制限に応じて5〜30秒)。 シンプルで効率的です。
- []WebSocket] - プッシュ更新を受信するための永続的な接続を維持します(Finnhub、IEXなどによってサポートされています)。 遅延を抑え、オーバーヘッドを削減します。
出版社を返すメソッドを実装するか、 パターンを使用して最新のデータを取得します。 ポーリングのために、ビューモデルでをスケジュールします。 WebSocket の場合、Apple の または Starscream のようなライブラリ (Alamofire 5 では実験的な WebSocket サポートがあります) を使用します。
例 関数をフェッチ:
func fetchLatestPrice(for symbol: String) async throws -> StockDataPoint {
let url = "https://api.example.com/quote?symbol=\(symbol)&apikey=\(apiKey)"
let response = try await AF.request(url).serializingDecodable(StockDataPoint.self).value
return response
}
データの解析と保存
ビューモデルは、レスポンスを処理し、チャートエントリにマップし、最近のポイントのバッファを維持する必要があります。 [プロパティを使用して、SwiftUIまたはUIKitビューが変更に反応できます。 たとえば、最後のNデータポイントを表す []オブジェクトの配列を維持します。
新しいデータが到着したら、エントリーを追加して、チャートビューのフィニトを維持するために古いものをトリムします。これにより、メモリの肥大を防ぎ、チャートの読みやすい状態を維持します。
チャートライブラリでチャートをビルドする
チャートライブラリから、プログラムを瞬時にドラッグするか、またはプログラムをインスタンス化します。制約を設定し、外観を設定します。
- [ 配列で [] を使用します。
- 価格ラベルの[を有効にしますが、混乱を避けるために、最後の数点に制限します。
- よりスムーズなラインに[]を設定。
- 軸フォーマッタをカスタマイズ – x軸(時間)とy軸(価格)のフォーマットで[。
事例:
let entries = stockDataPoints.map { ChartDataEntry(x: $0.timestamp, y: $0.price) }
let dataSet = LineChartDataSet(entries: entries, label: "\(symbol) Price")
dataSet.drawCirclesEnabled = false
dataSet.lineWidth = 2
dataSet.setColor(.systemBlue)
let chartData = LineChartData(dataSet: dataSet)
lineChartView.data = chartData
リアルタイムの更新では、すべてのティックにセットされたデータ全体をリセットしません。代わりに、新しいエントリを追加し、[を呼び出して、ビューを増分的に更新します。
リアルタイムアップデート戦略
タイマーでポーリング
ビューモデルのを使用します。ビューが消えるときに無効にしてください。 APIレート制限が留意してください。無料のティアは、多くの場合、毎分5〜10リクエストしか許可しません。 長い間隔(10〜15秒)を使用して、構成可能なリフレッシュレートをexpose。
Webソケット接続
API が WebSocket をサポートしている場合、ビューが表示されるときに接続を作成し、ストリームされたデータを取得するループで を呼び出すと接続を作成します。JSON として各受信メッセージをパースし、チャートを更新します。[]] を使用して例:
let task = session.webSocketTask(with: url)
task.resume()
func receive() {
task.receive { result in
switch result {
case .success(let message):
if case .string(let text) = message,
let data = text.data(using: .utf8),
let point = try? JSONDecoder().decode(StockDataPoint.self, from: data) {
DispatchQueue.main.async { self.updateChart(with: point) }
}
self.receive()
case .failure(let error):
// reconnect logic
}
}
}
WebSocketはレイテンシとネットワーク負荷を軽減しますが、再接続と保護ピンの処理が必要です。
UIレイアウトと応答性
ダッシュボードには以下が含まれます:
- ストックシンボルを入力するには、]の検索バーまたはピッカー[。
- アニメーションの更新(例:価格上昇/減少のためのフラッシュグリーン/赤)の現在の価格ラベル[[]]。
- 行のグラフ]] は、画面のスペースの大部分を占めています。
- 追加メトリック: 日替率、高/低、ボリューム。
- 接続状態を示す[ スタタスインジケータ] (接続/切断/ロード)。
オートレイアウトで宣言的なレイアウトやUIKit用のSwiftUIを使用します。 重作業(パーシング、チャートのデータ構造)がメインスレッドからオフに実行されていることを確認してください。 UIの更新をに解除します。
エラー処理とレジリエンス
ネットワーク障害は避けられない。HTTPリクエスト()に対して、応答性バックオフでリトライロジックを実行します。AlamofireのRequestRetrier)。WebSocketの場合、クローズコードを聴いて、遅延後に再接続を試みます。データが停止したときにユーザーフレンドリーなエラーバナーまたはプレースホルダーチャートを表示します。
をで使用して、エラーをうまく処理します。 生成中のCrashlyticsのようなリモートサービスにエラーをログ化します。
パフォーマンスの最適化
リアルタイムチャートは毎分何度も更新されます。UIをスムーズに保つには:
- データのポイント数を固定ウィンドウ(200件)に制限します。
- 不要な要素([])、[の描画を複数回のみ無効にします。
- UIKit の レイヤー バック または SwiftUI の を金属でバック コンパイルする 使用します。
- スロットルの更新: WebSocket メッセージが画面のリフレッシュレート(60 Hz)よりも速く到着したら、複数のポイントを1つのチャートの更新にバッチします。
ダッシュボードのテスト
mock JSON 応答を使用して、データ解析とネットワーク マネージャーのユニットテストを記述します。 [ または ]] を使用して、API 応答をシミュレートします。 チャートビューでは、] でテストをスナップショットして、更新後に正しいレンダリングを検証できます。 タイムされたモックデータをカスタム サーバー経由で注入する UI テストでリアルタイムの動作をテストします。
導入検討
APIキーを安全に保存します。決してハードコードしません。Xcodeスキームやgitignoredので環境変数を使用します。ローカルキャッシュ(例、Core Data)を実施することを検討して、ダッシュボードは、新鮮なデータ待ち時にすぐに起動時に既知のデータを示しています。
App Store の投稿では、アプリがバックグラウンドアプリのリフレッシュ設定を尊重し、 [BGTaskScheduler]] を使用することを確認してください。アプリが偽造されていないときに定期的な更新が必要な場合は、実際の時間感のために、WebSocket の接続はフォアグラウンドでのみ機能します。
コンテンツ
ネットワークリクエストのAlamofireと組み合わせることで、視覚化のためのチャートライブラリ、およびライブ更新用の苗木またはWebSocketsのいずれかを組み合わせることで、iOS用の堅牢なリアルタイムの株式市場ダッシュボードを作成できます。 クリーンなアーキテクチャ、優雅なエラー処理、およびユーザーが信頼するプロフェッショナルなエクスペリエンスを提供するパフォーマンスチューニングに焦点を当てます。 APIレート制限を尊重し、データが遅延したときに明確なフィードバックを提供してください。 これらの基盤により、複数のシンボル、テクニカルインジケータ、またはウォッチリストでダッシュボードを拡張できます。