江戸一番のジャスタウェイ職人のブログ

江戸一番のジャスタウェイ職人

SwiftでTwitter Streaming APIをparseするのに便利なNSData分割読み込みライブラリ

Twitter Streaming APIはCRLF区切りでJSONを送ってくるのですが、これを都度Stringに変換しcomponentsSeparatedByStringで配列にし、最後の手前まではNSDataに戻してJSONに、最後の要素はバッファに詰めて次回処理で先頭にくっつける...というのがいかにもパフォーマンス上よろしくなさそうなので、NSDataからデータを変換せずにある区切り毎にデータを読めるライブラリを書きました。

以前のコードと比較すると7倍弱高速化されました、パフォーマンスを体感することはないでしょうが消費電力が下がるという見方もできます。

また、コードの可読性も高まりました。

import Foundation
import MutableDataScanner
import SwiftyJSON

class TwitterAPIStreamingRequest: NSObject, NSURLSessionDataDelegate {

    let scanner = MutableDataScanner(delimiter: "\r\n")

    // ...

    func connection(connection: NSURLConnection, didReceiveData data: NSData) {
        self.scanner.appendData(data)
        while let data = self.scanner.nextLine() {
            if data.length > 0 {
                let json = JSON(data: data)
            }
        }
    }
}

github.com
Swift 2以降のみ対応です