公司是做金融相關(guān)锌介,最近需要實(shí)現(xiàn)一個金融客戶端必不可少的東西:K線圖猾警。這個東西如果是自己從頭來搞,可真的不是一件簡單的事发皿,幸好,在這個領(lǐng)域有很多的先驅(qū)穴墅,已經(jīng)在我們之前造好了輪子等著我們使用,一直對這些樂于分享玄货,樂于開源的大神們抱有感激,希望有一天自己的知識和經(jīng)驗(yàn)也能對后來人有所幫助松捉。
說起K線圖,為了做好這個東西前期也已經(jīng)研究了很久隘世,最終找到了一份算是不錯的K線圖demo,地址在這里:https://github.com/WillkYang/YYStock丙者,
有興趣的可以去看看。但是這篇blog的重點(diǎn)不在K線圖上永票,而是如何實(shí)現(xiàn)長連接,讓服務(wù)端實(shí)時推送股票的相關(guān)信息給客戶端。長連接的技術(shù)我之前也是沒有接觸過侣集,這次一次研究了個爽,找了很多的開源第三方的礦框架编振,包括:CocoaAsyncSocket:https://github.com/robbiehanson/CocoaAsyncSocket,
Facebook出品的SocketRocket https://github.com/facebook/SocketRocket踪央,
以及今天要說道的socket.io https://github.com/socketio/socket.io-client-swift瓢阴。
這三個可以實(shí)現(xiàn)長連接的框架,都很厲害荣恐,但是因?yàn)槲覀兊姆?wù)端是用socket.io實(shí)現(xiàn)的,所以我們客戶端使用socket.io相關(guān)的也就最容易實(shí)現(xiàn)叠穆。
最新的是Socket.IO-Client-Swift,一個swift實(shí)現(xiàn)的Socket.IO框架硼被,我們?nèi)绻褂胏ocopods的話,直接
pod 'Socket.IO-Client-Swift'
安裝好之后嚷硫,實(shí)現(xiàn)長連接就比較簡單了:
1)首先在你的viewController中引入這個第三方,
@import SocketIO;
注意是@而不是#import论巍,至于為何這樣寫請自行百度,這里就不贅述了嘉汰。
2)引入好了框架鞋怀,就開始連接
NSURL *url = [NSURL URLWithString:@"https://socketio-chat.now.sh/"];
//使用給定的url初始化一個socketIOClient持搜,后面的config是對這個socket的一些配置,比如log設(shè)置為YES葫盼,控制臺會打印連接時的日志等
SocketIOClient *socket = [[SocketIOClient alloc] initWithSocketURL:url config:@{@"log": @YES, @"forcePolling": @YES}];
//監(jiān)聽是否連接上服務(wù)器,正確連接走后面的回調(diào)
[socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"socket connected");
[socket emit:@"kline_day" with:@[@"430009"]];
}];
//監(jiān)聽new message抛猫,這是socketIO官網(wǎng)提供的一個測試用例,大家都可以試試闺金。如果成功連接,會收到data內(nèi)容败匹。
[socket on:@"new message" callback:^(NSArray* data, SocketAckEmitter* ack) {
NSLog(@"response is %@",data);
}];
[socket connect];
一般我們真正開發(fā)中,需要給服務(wù)端傳遞規(guī)定好的關(guān)鍵字掀亩,服務(wù)端才會正確的返回你想獲取的數(shù)據(jù),這個時候就要用到emmit()方法:
[socket emit:@"kline_day" with:@[@"430009"]];
上面的意思就是請求服務(wù)器430009這個股票代碼的日k數(shù)據(jù)捉蚤,一般我們將這個請求放在監(jiān)聽連接成功的方法中。
如果想停止本次長連接刹泄,也很簡單外里,只需要用上面創(chuàng)建的socket對象調(diào)用disconnect()方法即可。
[self.socket disconnect];
這樣一個長連接就成功了特石,之后就是解析獲取到的數(shù)據(jù)盅蝗,這個數(shù)據(jù)是每隔一定時間服務(wù)器自動推送的,我們是需要把這些數(shù)據(jù)展示在頁面上即可姆蘸。