高級程式設計師筆記:如何在iOS中構建實時圖表

}

在上面的代碼中,我們聲明chartEntry了我們打算存儲所有圖表數據的位置。然後,我們遍歷可用的,visitors併為他們每個人添加一個新的ChartDataEntry(x: Double(i), y: visitors[i]),告訴圖表X和Y的位置。

我們設置折線圖將顯示的顏色。我們創建LineChartData並添加line包含我們數據點的顏色。最後,我們將數據添加到chartView並設置圖表視圖描述。

讓我們的模擬按鈕調用一個端點

我們需要做的下一件事是讓我們的請求按鈕觸發一個後端,後者會將模擬數據發送到Pusher。

為此,我們需要再次更新視圖控制器。在ViewController圖表包中正確導入Alamofire包:

import Alamofire

現在用simulateButtonPressed下面的代碼替換函數:

@IBAction func simulateButtonPressed(_ sender: Any) {

Alamofire.request("http://localhost:4000/simulate", method: .post).validate().responseJSON { (response) in

switch response.result {

case .success(_):

_ = "Successful"

case .failure(let error):

print(error)

}

}

}

在下面的代碼中,我們使用Alamofire發送POST請求到http:// localhost:4000 /模擬哪一個是本地Web服務器(我們將很快創建該後端)。在實際的應用程序中,這通常會指向一個真正的Web服務器。

這個端點沒有使用任何參數來簡化教程。我們也不需要對回應做任何事情。我們只需要在每次按下模擬訪問按鈕時發送POST請求。

使用Pusher綁定實時功能

為了完成所有這些工作,我們將創建一個函數來偵聽來自Pusher的事件,並且當收到一個事件時,我們將該值保存visitors並然後觸發我們之前創建的更新圖表函數。

為此,請打開頂部的Alamofire軟件包ViewController並導入PusherSwiftSDK:

import PusherSwift

接下來,我們將為Pusher實例聲明一個類屬性。我們可以在visitors聲明行下正確執行此操作:

var pusher: Pusher!

然後聲明屬性後,我們需要將下面的函數添加到類中,以便它可以偵聽事件:


private func listenForChartUpdates() {

pusher = Pusher(key: "PUSHER_KEY", options: PusherClientOptions(host: .cluster("PUSHER_CLUSTER")))

let channel = pusher.subscribe("visitorsCount")

channel.bind(eventName: "addNumber", callback: { (data: Any?) -> Void in

if let data = data as? [String: AnyObject] {

let count = data["count"] as! Double

self.visitors.append(count)

self.updateChart()

}

})

pusher.connect()

}

在上面的代碼中,我們實例化Pusher並傳入我們的密鑰和集群(您可以從Pusher應用程序的儀表板獲取密鑰和集群)。然後,我們訂閱visitorsChannel並綁定到該addNumber頻道上的活動名稱。

當事件被觸發時,我們觸發回調中的邏輯,它只是將計數附加到visitors,然後調用updateChart函數,實時更新實際圖表。

最後我們調用pusher.connect()哪些形式連接到Pusher。

在viewDidLoad函數中只需添加一個調用listenForChartUpdates方法:

override func viewDidLoad() {

super.viewDidLoad()

// ...stuff

listenForChartUpdates()

}

就這樣!我們在Xcode中創建了我們的應用程序,我們已準備好進行測試。然而,為了測試,我們需要創建後端,POST當點擊按鈕時,我們發送請求到後端。為了創建這個後端,我們將使用Node.js. 現在我們來做。

為我們的實時iOS圖表應用程序創建後端服務

要開始,請為該Web應用程序創建一個目錄,然後在該目錄內創建一些新文件:

文件:index.js

// -------------------------------------------------------

// Require Node dependencies

// -------------------------------------------------------

let Pusher = require('pusher');

let express = require('express');

let bodyParser = require('body-parser');

let app = express();

// Instantiate Pusher

let pusher = new Pusher(require('./config.js'));

// -------------------------------------------------------

// Load express middlewares

// -------------------------------------------------------

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({ extended: false }));

// -------------------------------------------------------

// Simulate multiple changes to the visitor count value,

// this way the chart will always update with different

// values.

// -------------------------------------------------------

app.post('/simulate', (req, res, next) => {

var loopCount = 0;

let sendToPusher = setInterval(function(){

let count = Math.floor((Math.random() * (100 - 1)) + 1)

pusher.trigger('visitorsCount', 'addNumber', {count:count})

loopCount++;

if (loopCount === 20) {

clearInterval(sendToPusher);

}

}, 2000);

res.json({success: 200})

})

// Handle index

app.get('/', (req, res) => {

res.json("It works!");

});

// Handle 404's

app.use((req, res, next) => {

let err = new Error('Not Found');

err.status = 404;

next(err);

});

// -------------------------------------------------------

// Serve application

// -------------------------------------------------------

app.listen(4000, function(){

console.log('App listening on port 4000!')

});

上面的文件是一個用JavaScript編寫的簡單的Express應用程序。我們實例化所有我們需要的包,並使用我們即將創建的配置文件來配置推送器。然後我們創建一條路線,/simulate並在此路線中觸發頻道中的addNumber事件visitorCount。這是應用程序正在偵聽的同一頻道和事件。

為了使它更簡單一些,我們使用setInterval每2000毫秒向Pusher後端發送隨機訪問者數量。循環20次後,循環停止。這應該足以測試我們的應用程序。

創建下一個文件config.js

module.exports = {

appId: 'PUSHER_APP_ID',

key: 'PUSHER_APP_KEY',

secret: 'PUSHER_APP_SECRET',

cluster: 'PUSHER_APP_CLUSTER',

};

用PUSHER_APP_*您自己的Pusher應用程序中的憑證替換密鑰。

下一個也是最後一個文件是package.json

{

"main": "index.js",

"dependencies": {

"body-parser": "^1.16.0",

"express": "^4.14.1",

"pusher": "^1.5.1"

}

}

現在打開終端並連接cd到Web應用程序目錄的根目錄並運行以下命令以分別安裝NPM依賴項和運行應用程序:

$ npm install

$ node index.js

安裝完成並且應用程序準備就緒後,您應該看到以下輸出:


高級程序員筆記:如何在iOS中構建實時圖表

測試應用程序

一旦運行了本地節點Web服務器,您需要進行一些更改,以便您的應用程序可以與本地Web服務器通信。在該info.plist文件中,進行以下更改:

高級程序員筆記:如何在iOS中構建實時圖表

通過這一改變,您可以構建並運行您的應用程序,並且可以直接與您的本地Web應用程序通話。

結論

本文向您展示瞭如何結合Pusher和Charts包創建實時iOS圖表應用程序。還有許多其他圖表類型可以使用該包創建,但為簡潔起見,我們已經完成了最簡單的操作。您可以瀏覽其他圖表類型,甚至可以為每個請求傳遞多個數據點。

如果您有任何問題,反饋或更正,可以將它們發佈在下面的評論部分。

上面的分享的源代碼需要的朋友可私信我“源碼”領取。


分享到:


相關文章: