2016-10-19 11 views
0

私のアプリケーションでRealm Object Serverを使用しようとしています。私はAWSでそれをホストしています。私は正常に読み書きできます。しかし、私は、アプリケーションを起動した後、同期された領域にアクセスする際に問題が発生しています。打ち上げでは、私が正常に認証した後起動時に同期レルムが読み込まれない

(たとえば、アプリで提供するものに非常に似ている)、ログイン・ビュー・コントローラを持って、私が提示したビューコントローラを決定する同期レルムにアクセスしたいです。私が検証してい

@IBAction func logIn(sender: AnyObject?) { 
    guard userInputValid() else { 
     return 
    } 
    self.activityIndicator.startAnimating() 
    self.logInButton.isHidden = true 
    SyncUser.authenticate(with: Credential.usernamePassword(username: userNameTextField.text!, password: passwordTextField.text!, actions: []), server: syncAuthURL!, onCompletion: { user, error in 
     guard let user = user else { 
      self.presentError(error: error as! NSError) 
      self.activityIndicator.stopAnimating() 
      self.logInButton.isHidden = false 
      return 
     } 

     Realm.Configuration.defaultConfiguration = Realm.Configuration(
      syncConfiguration: (user, self.syncServerURL!), 
      objectTypes: [Dot.self, Mod.self] 
     ) 

     let realm = try! Realm() 
     // realm.objects(Dot.self).count == 0 here even though there is a Dot object persisted in the server 
     // When I access the realm later in the app (e.g in a viewDidAppear of another controller) the object is there 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
     let vc = DotCollectionViewController(nibName: "DotCollectionViewController", bundle: nil) 
     let navVC = UINavigationController(rootViewController: vc) 
     appDelegate.window?.rootViewController = navVC 
    }) 
} 

は読み込みと同期レルムへの書き込み、独特の何かを見つけた:私が正常にデータを書き込むことができるよ場合でも、レルムは、ヌルのfileURLを持っているようです。私はlet realm = try! Realm()を使って私のアプリの他の部分の領域にアクセスしています。print(realm.configuration.fileURL)を実行すると、有効な同期レルムについても常にゼロになります。

私の質問は、同期されたレルムがアクセス可能になるまでにある程度の時間をおかなければなりませんか?もしそうなら、私はこれをどうやってやりますか?この問題についての助けがあれば幸いです。

答えて

0

同期されたレルムの構成のfileURLnilであることが予想されます。ファイルの場所は自分のレルムで管理されているため、ユーザー(あなた)はアクセスできません。

デバイス上で初めて同期レルムを開くと、有効なSyncUserが存在するとすぐにレルムにアクセスできます(SyncUser.authenticate(...)コールバックによって提供されます)。ただし、内容は非同期に設定されるため、すぐに領域を開くときにはrealm.objects(Dot.self)は空ですが、後でサーバーからオブジェクトを取得します。

それはあなたのアプリケーションの一部を進める前に、利用できるようにそのデータを待つことが重要だ場合は、レルムが近い将来にそれを行うに取り組んでいる2つの方法があります。

+0

ご返信ありがとうございます。私のアプリでは、同期された領域に基づいてコレクションビューを読み込んでいます。レルムがロードされる前に移入するのを待つ最善の方法は何でしょうか?私は 'Thread.sleep()'を使うことができますが、それは明らかにハックです。また、タイマータスクで常にUIの更新をチェックしたくない場合もあります。 – rparikh

+0

変更がかどうかの同期、他のプロセス、または他のスレッドから、来るときあなたが知っているコレクションの通知を使用する必要があります。あなたは、コレクションの通知によって何を意味するか – jpsim

+0

を明確にもらえますか? – rparikh

関連する問題