2016-10-19 8 views
0

내 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 
    }) 
} 

읽기 및 동기화 된 영역에 기록하고 독특한 무언가를 발견 : 나는 성공적으로 데이터를 기록 할 수있어 경우에도 영역이 null의 fileURL을 갖고있는 것 같아요. let realm = try! Realm()을 사용하여 응용 프로그램의 다른 영역에서 영역에 액세스하고 print(realm.configuration.fileURL)을 수행 할 때 유효한 동기화 된 영역에 대해서도 항상 0이됩니다.

제 질문은 동기화 된 영역에 액세스 할 수 있도록 일정 시간 동안 기다려야합니까? 그렇다면 어떻게해야할까요? 이 문제에 대한 도움을 많이 주시면 감사하겠습니다.

답변

0

는 파일 위치는 사용자 (당신) 내 영역 및 액세스를 관리하기 때문에 동기화 된 영역의 구성의 fileURLnil 될 것으로 예상합니다.

장치에서 동기화 된 영역을 처음 열면 SyncUser이 존재하는 즉시 영역에 액세스 할 수 있으며 SyncUser.authenticate(...) 콜백에 의해 제공됩니다. 그러나 해당 내용은 비동기식으로 채워집니다. 따라서 realm.objects(Dot.self)은 즉시 영역을 열 때 비어 있지만 나중에 서버에서 객체를 가져옵니다.

하면 해당 데이터가 응용 프로그램의 일부를 진행하기 전에 사용할 수 기다려야하는 것이 중요 경우, 영역은 가까운 장래에 그렇게 작업하고있는 두 가지 방법이 있습니다 :

+0

답장을 보내 주셔서 감사합니다. 그래서 내 애플 리케이션에서, 나는 동기화 된 영역을 기반으로하는 collectionview를로드하고있다. 영역이로드되기 전에 영역이 채워지기를 기다리는 가장 좋은 방법은 무엇입니까? 'Thread.sleep()'을 사용할 수는 있지만 분명히 해킹입니다. 타이머 작업을 지속적으로 UI 업데이트를 확인하고 싶지도 않습니다. – rparikh

+0

동기화, 다른 프로세스 또는 다른 스레드에서 변경 사항이 들어오는 시점을 알려면 콜렉션 알림을 사용해야합니다. – jpsim

+0

컬렉션 알림의 의미를 분명히 할 수 있습니까? – rparikh

관련 문제