2017-10-23 1 views
0

単純なテストプロジェクトにレルムオブジェクトサーバーを使用していますが、ROS接続セットアップの同期に問題があり、レルムオブジェクトの使用状況をフォローアップしてデータベースにアクセスしています。レルムオブジェクトを同期させるフォローアップレルムオブジェクトを使用してサーバー接続を完了

のviewDidLoad機能で
var realmRos: Realm! 

override func viewDidLoad() { 
    connectROS() 
    if(FBSDKAccessToken.current() != nil){ 
     // logged in 
     getFBUserData() 
    }else{ 
     // not logged in 
     print("didLoad, FB user not logged in") 
    } 
} 

func connectROS() { 
    let username = "realm-admin" 
    let password = "*********" 
    SyncUser.logIn(with: .usernamePassword(username: username, password: password, register: false), server: URL(string: "http://146.185.154.***:9080")!) 
    { user, error in 
      print("ROS: checking user credentials") 
      if let user = user { 
       print("ROS: user credentials OK") 
       DispatchQueue.main.async { 
        // Opening a remote Realm 
        print("ROS: entering dispatch Q main async") 
        let realmURL = URL(string: "realm://146.185.154.***:9080/~/***book_test1")! 
        let config = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: realmURL)) 
        self.realmRos = try! Realm(configuration: config) 
        // Any changes made to this Realm will be synced across all devices! 
       } 
      } else if let error = error { 
       // handle error 
       print("ROS: user check FAIL") 
       fatalError(String(describing: error)) 
      } 
    } 
} 

次のステップは、FBが(このケースでは、私はFB認証を使用しています)のユーザーをログイン得ることです: のviewDidLoadで私が呼んでいるconnectROSはrealmRosは/接続オブジェクトを初期化するために機能します。ログに記録されたFBユーザーがフェッチされた後、アプリケーション実行チェックでは、FBユーザーは自分のアプリケーションの新しいユーザーであり、私の独自のROSユーザーのテーブルです。

func checkForExistingProfile(user: User) -> Bool { 
    var userThatExist: User? 

     do { 
      try self.realmRos.write() { 
       userThatExist = self.realmRos.object(ofType: User.self, forPrimaryKey: user.userName) 
      } 
     } catch let error as NSError { 
      print("ROS is not connected") 
      print(error.localizedDescription) 
     } 

    if userThatExist != nil { 
     return true 
    } else { 
     return false 
    } 
} 

この時点でcheckForExistingProfileは、通常は(常にではない)ゼロであることを起こるトライself.realmRos.write()でクラッシュします。 問題は、connectROSの実行(非同期)とcheckForExistingProfile(connectROSが完了する前に実行される)の間の同期に起因すると思います。

答えて

0

の後にcheckForExistingProfile()がどのように呼び出されたかはわからなかったので、これは推測ですが、あなたが説明したすべての内容に基づいて考えられます。

同期ユーザーがログインし、self.realmRos変数が初期化されるまで、必要な操作はcheckForExistingProfile()になりません。 Cocoa Touchは、非同期パターン(logIn()など)を使用して書かれたコードを自動的に同期させるものは何もしていません。したがって、コールバックする前にlogIn()が何をするかを手動で確認する必要がありますその完了に依存する追加コード。

+1

おかげさまでオースチン –

関連する問題