自作で作ったiOSフレームワーク「ChatQueueKit」の紹介
私は最近、iOS向けのフレームワーク「ChatQueueKit」を開発しました。このフレームワークは、リアルタイムチャットのように頻繁に追加されるデータを効率的に管理し、テーブル表示に反映させるための強力なツールです。今回は、具体的なソースコードとサンプルアプリケーションを用いて、このフレームワークの特徴と使い方を紹介します。
ChatQueueKitの特徴
ChatQueueKitは、データをキューに一時的に保持し、指定された閾値に達したときにメインデータへ移動する仕組みを提供します。これにより、頻繁なデータの追加が行われる環境での効率的なデータ管理を可能にしています。例えば、チャットアプリではメッセージがリアルタイムに追加されますが、このフレームワークを使えば、その処理を最適化することができます。
動画
少しわかりづらいかもしれませんが、動画のようにデータを一つずつ追加した場合と、一度に大量に追加された場合とで、テーブル挿入時の挙動を変えることができます。
主な機能
- 一定時間毎に、キューに貯まったデータをメインデータへ移動します。
- キューにデータが大量に貯まった(閾値を超えた)場合は、メインデータへ即座に移動させます。
- デリゲートを使ったテーブルのリロードが可能で、キューからメインデータに移動したタイミングでデリゲートが呼び出されます。
- メインデータにデータを追加する際に、上または下に挿入する昇降順を選べるオプションを提供します。
- データのソート、フィルタリング、置換など、メインデータとキューデータを外部から操作可能です。
ソースコードの詳細
以下に、ChatQueueKitのメインコードと、それを利用したサンプルアプリケーションのコードを紹介します。
フレームワークのメインコード
DataManagerクラスは、データの管理を行います。このクラスでは、キューデータとメインデータを管理し、指定された閾値に達したらキューデータをメインデータに移動します。また、デリゲートを使ってテーブルのリロードを行います。
public protocol DataManagerDelegate: AnyObject {
func doReloadTable<T>(isQueueFull: Bool, movedData: [T])
}
public class DataManager<T> {
public enum DataContainerType {
case QueueData
case MainData
}
private var mainData = CoreDatas<T>()
private var queueData = CoreDatas<T>()
public weak var delegate: DataManagerDelegate?
private var timer: Timer?
private let queueThreshold: Int
private let reloadTableTimeInterval: TimeInterval
private let insertAtTop: Bool
public init(queueThreshold: Int = 50, reloadTableTimeInterval: TimeInterval = 1.0, insertAtTop: Bool = false) {
self.queueThreshold = queueThreshold
self.reloadTableTimeInterval = reloadTableTimeInterval
self.insertAtTop = insertAtTop
}
public func append(_ data: T) {
queueData.append(data)
checkQueueLimit()
}
// キューが満杯になったらデータを移動
private func moveQueueToMain(isQueueFull: Bool) {
let allQueueData = queueData.getDatas()
guard !allQueueData.isEmpty else { return }
for item in allQueueData {
if insertAtTop {
mainData.insert(item, at: 0)
} else {
mainData.append(item)
}
}
queueData.clear()
delegate?.doReloadTable(isQueueFull: isQueueFull, movedData: allQueueData)
}
// 他の機能は省略...
}
ChatQueueKitの導入方法
ChatQueueKitは、CocoaPodsを使って簡単にインストールすることができます。以下の手順に従って、プロジェクトに導入してください。
Podfileの設定
まず、プロジェクトのPodfileにChatQueueKitのリポジトリを指定します。以下のように設定を追加してください。
target 'YourAppTargetName' do
use_frameworks!
pod 'ChatQueueKit', :git => 'https://github.com/aragig/ChatQueueKit.git'
end
YourAppTargetNameを実際のプロジェクトのターゲット名に置き換えてください。use_frameworks!は、Swiftベースのフレームワークを使用するために必要です。Podfile内にこの行がない場合は追加してください。
CocoaPodsのインストール
次に、以下のコマンドを実行してPodをインストールします。
$ pod install
CocoaPodsがChatQueueKitをダウンロードし、プロジェクトに統合します。
プロジェクトでの利用
インストールが完了したら、プロジェクトでimport ChatQueueKitを記述して、ChatQueueKitを使用できるようになります。準備が整ったら、次のサンプルコードや自身のプロジェクトでChatQueueKitを活用して、効率的なデータ管理を実現しましょう。
サンプルアプリケーション
次に、ChatQueueKitを利用したサンプルアプリケーションを紹介します。このアプリケーションでは、ボタンを押すことでチャットデータを追加し、キューデータが一定数を超えると、自動的にテーブルに反映される仕組みを実装しています。
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var chatData = DataManager<Comment>(queueThreshold: 5, reloadTableTimeInterval: 1.0, insertAtTop: true)
var lastNo = 0
override func viewDidLoad() {
super.viewDidLoad()
chatData.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
@IBAction func onTappedAddButton(_ sender: UIButton) {
let nextNo = lastNo + 1
chatData.append(Comment(no: nextNo, content: "New message \(nextNo)"))
lastNo = nextNo
}
}
extension ViewController: DataManagerDelegate {
func doReloadTable<T>(isQueueFull: Bool, movedData: [T]) {
self.tableView.reloadData()
}
}
▼ サンプルコードの詳しくは、こちらのリポジトリをご参考ください。 GitHub - aragig/ChatQueueKit
まとめ
ChatQueueKitは、頻繁に追加されるデータを効率的に管理し、テーブル表示をスムーズに行うための便利なフレームワークです。このフレームワークを活用することで、チャットアプリやリアルタイムで更新されるリストビューのパフォーマンスを向上させることができます。ぜひ試してみてください!
\自作Frameworkの作り方の記事も書いてます/