Firebase には、インターフェイス ミラーリングなどのアプリケーション固有の同期を行うための特定のプリミティブはありません。やりたいことは、インターフェイスの現在の状態を JSON として Firebase にモデル化することです。そのため、UI の一部が変更されると、それらを Firebase に保存します。次に、補完もセットアップする必要があります。Firebase からの変更によりイベントが発生した場合は、UI を更新します。ジェスチャやアクションなどにも同じタイプのモデリングが必要です。それらのアイテムを Firebase に保存しておきます (または、それが意味的に簡単に変換できない場合は、アクションの副作用を保持します。たとえば、スワイプによってボタンが位置を移動し、ボタンの位置を Firebase に保存します。)
具体的には、2 つのタブを同期させる例を次に示します。これは、デフォルトの Xcode プロジェクト テンプレート「Tabbled application」に基づいています。その中で、いくつかのことを行います。
- タブ項目が変更されたときの KVO オブザーバーを追加する
- Firebase からの変更に反応するミラーリングをセットアップする
- 実際に UI の新しい状態を Firebase に保存する
#import <Firebase/Firebase.h>
#define kFirebase @"https://mirror.firebaseio-demo.com"
@implementation FAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController *viewController1 = [[FFirstViewController alloc] initWithNibName:@"FFirstViewController" bundle:nil];
UIViewController *viewController2 = [[FSecondViewController alloc] initWithNibName:@"FSecondViewController" bundle:nil];
self.tabBarController = [[UITabBarController alloc] init];
// Add KVO observer for when the UI changes so we can eventually synchronize this data to Firebase
[self.tabBarController.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionNew context:nil];
self.tabBarController.viewControllers = @[viewController1, viewController2];
// Setup the mirroring of the UI state; when Firebase lets us know the value has been updated, reflect that in the UI
Firebase* f = [[[Firebase alloc] initWithUrl:kFirebase] childByAppendingPath:@"selectedIndex"];
[f observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
self.tabBarController.selectedIndex = [snapshot.value intValue];
}];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSUInteger newIndex = [((UITabBar *)object).items indexOfObject:change[NSKeyValueChangeNewKey]];
// We've been notified via KVO that the UI has changed, so save the new state to Firebase
[[[[Firebase alloc] initWithUrl:kFirebase] childByAppendingPath:@"selectedIndex"] setValue:[NSNumber numberWithInt:newIndex]];
}
@end
インターフェースのミラーリングに取り組む際に留意すべき点: あるデバイスのユーザーが方向の切り替えを行ったとします。これを Firebase に保存することは容易ですが、ミラーリングされた側でアプリケーション固有の変換を行う必要があります (他のデバイスがデバイスを回転させないことを選択しますか?)。