2016-10-19 3 views
0

Я пытаюсь использовать сервер объектов Realm в моем приложении ios. Я размещаю его на 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 
    }) 
} 

Я подтверждено считывает и записывает в синхронизированных Realm и нашел что-то своеобразное: царство, кажется, есть fileURL нуль, даже когда я в состоянии записывать данные успешно. Я обращаюсь к области в других частях моего приложения, используя let realm = try! Realm(), и когда я делаю print(realm.configuration.fileURL) Я всегда получаю нуль даже для действительных синхронизированных областей.

Итак, мой вопрос: мне нужно подождать некоторое время для того, чтобы синхронизированное царство было доступно? Если да, то как мне это сделать? Любая помощь по этому вопросу будет высоко оценена.

ответ

0

Ожидается, что fileURL конфигурации с синхронизированным контентом будет nil, так как местоположение файла управляется моим Королевством и недоступно для пользователя (вас).

При открытии синхронизированного Realm в первый раз на устройстве Realm будет доступен, как только будет существовать действительный SyncUser, предоставляемый обратным вызовом SyncUser.authenticate(...). Однако его содержимое будет заселено асинхронно, поэтому realm.objects(Dot.self) пуст, сразу же открывая Царство, но позже получает объекты с сервера.

Если это важно, чтобы ждать, что данные должны быть доступны, прежде чем приступить к части вашего приложения, есть два способа Realm работает над, чтобы сделать это в ближайшем будущем:

+0

Спасибо за ваш ответ. Поэтому в моем приложении я загружаю коллекцию, основанную на синхронизированной области. Каким будет лучший способ дождаться заполнения области перед загрузкой? Я могу использовать 'Thread.sleep()', но это взломать, очевидно. Я также не хочу, чтобы задача таймера постоянно проверяла обновления пользовательского интерфейса. – rparikh

+0

Вы должны использовать уведомления о коллекциях, чтобы знать, когда происходят изменения, будь то синхронизация, другие процессы или другие потоки. – jpsim

+0

Не могли бы вы уточнить, что вы подразумеваете под уведомлениями о коллекции? – rparikh

Смежные вопросы