1

好的。我肯定错过了什么。

我试图让两台 iPad 镜像他们的界面,这样当一个用户执行 UISwipeGesture 来推送另一个视图时,它也会被复制到另一台设备上。我实际上希望实时推送视图并在应用程序的两个实例中显示。我一直在审查并使用 Firebase 进行测试项目,但不知道如何解决这个问题。但是,我已经看到使用 Firebase 执行此操作的原生 iOS 应用程序(更不用说 javascript 绘图示例)。

有没有人有任何好的代码示例或者可以指出我正确的方向?

谢谢,道格

4

1 回答 1

1

Firebase 没有用于执行特定于应用程序的同步(例如接口镜像)的任何特定原语。您要做的是将接口的当前状态作为 JSON 建模到 Firebase 中。因此,随着 UI 的一部分发生变化,您可以将它们保存到 Firebase。然后,您还需要设置补充:当由于 Firebase 的更改而触发事件时,更新 UI。手势和动作之类的东西需要相同类型的建模——将这些项目保存在 Firebase 中(或者,如果这在语义上不容易翻译,则保留动作的副作用;例如,如果滑动导致按钮移动位置,将按钮的位置保存在 Firebase 中。)

具体来说,这是一个保持两个选项卡同步的示例。这是基于默认的 Xcode 项目模板“Tabbled 应用程序”。在其中我们做了几件事:

  1. 为选项卡项更改时添加 KVO 观察器
  2. 设置镜像以响应来自 Firebase 的更改
  3. 实际上将 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 但必须在镜像端进行应用程序特定的转换(如果另一个设备选择不旋转他们的设备?)。

于 2013-04-10T23:54:27.410 回答