タブの遅延ロードを制御する設定を追加
Hotwire iOS SDK に lazyLoadTabs 設定が導入され、タブナビゲータの初期起動タイミングを開発者が選択できるようになりました。
背景
HotwireTabBarController.load(_:) が呼び出されると、従来は 全てのタブのナビゲータが即座に起動 し、各タブのコンテンツがバックグラウンドでロードされます。この挙動は、タブが多数あるアプリで起動直後に多数のリクエストが発生する原因となります。
そのため、ユーザーが実際にタブを選択したときに初めてそのタブのナビゲータを起動 させるオプションが求められていました。PR #194 はこの要件に応える形で設定フラグを追加しています。
結論:タブのロード方式を選択できる設定を持たせることで、既存コードに変更を加えずに起動時の動作を調整できる基盤が整いました。
技術的な変更
HotwireConfig に lazyLoadTabs プロパティが新規追加され、型は Bool、デフォルトは true です。プロパティのコメントは、true の場合は最初に選択されたタブのみが起動し、残りはユーザーが選択したときに起動することを説明しています。
public struct HotwireConfig {
// ... 既存プロパティ
/// Controls when tab navigators perform their initial visit in `HotwireTabBarController`.
///
/// When `true`, only the initially selected tab starts when tabs are loaded; each
/// remaining tab starts the first time the user selects it. When `false`, every
/// tab starts immediately when `HotwireTabBarController.load(_:)` is called.
public var lazyLoadTabs = true
// ... 後続プロパティ
}
サンプルアプリの Demo/AppDelegate.swift でも同フラグが設定されており、デフォルト動作が有効化されています。
Hotwire.config.backButtonDisplayMode = .minimal
Hotwire.config.showDoneButtonOnModals = true
Hotwire.config.animateReplaceActions = true
Hotwire.config.lazyLoadTabs = true
#if DEBUG
Hotwire.config.debugLoggingEnabled = true
#endif
HotwireTabBarController の load(_:) 実装が条件分岐で拡張され、フラグの真偽に応じて起動方式が変わります。true のときは従来通り activeNavigator.start() のみが呼び出され、false のときは全ナビゲータを即座に起動します。
open class HotwireTabBarController: UITabBarController, NavigationHandler {
public func load(_ tabs: [HotwireTab]) {
hotwireTabs = tabs
setupTabs()
if Hotwire.config.lazyLoadTabs {
activeNavigator.start()
} else {
navigatorsByIdentifier.values.forEach { $0.start() }
}
}
// ... 省略
}
結論:lazyLoadTabs フラグ一つで、タブの初期化処理が全体起動か遅延起動かを切り替えられ、既存コードベースへの侵入点は Hotwire.config への設定追加だけです。
設計判断
新しい設定は 既存の HotwireConfig 構造体に Boolean フラグとして追加 されたため、設定インターフェースの一貫性が保たれています。別の設定キーや API を導入せず、Hotwire.config 経路に統合した点が後方互換性を高める設計判断です。
デフォルトが true(遅延ロード)に設定されているため、既存アプリは設定を変更しなくても新機能の恩恵を受けます。フラグを false にすることで、従来通り全タブを即座に起動させることも可能です。
結論:シンプルなフラグ追加という最小限の変更で、タブロードの挙動を柔軟に制御できる設計となっており、既存ユーザーへの影響はありません。
まとめ
lazyLoadTabs 設定により、タブベースの iOS アプリは起動時のナビゲータ起動方法を選択できるようになりました。導入コストは Hotwire.config.lazyLoadTabs の真偽を切り替えるだけで、コードベースへの大きな変更は不要です。