我正在使用Realm Object Server进行一个简单的测试项目,我遇到了同步ROS连接设置和跟踪领域对象的使用以访问数据库的问题。 在viewDidLoad中我正在调用connectROS函数来初始化realmRos对象/连接:
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))
}
}
}
在viewDidLoad函数中,下一步是获取FB登录用户(在这种情况下我使用的是FB身份验证)。获取记录的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 :(得分:0)
由于你没有说明checkForExistingProfile()
之后viewDidLoad()
是如何调用的,这是猜想,但基于你所描述的其他一切,这可能是原因。
在同步用户登录并且您的checkForExistingProfile()
变量已初始化之前,您需要执行的操作不是致电self.realmRos
。 Cocoa Touch无法自动同步使用异步模式编写的代码(如logIn()
,它会立即返回,但会在回调中报告其实际完成状态),因此您需要手动确保所有logIn()
是假设的在你调用依赖于完成的任何其他代码之前已经完成了。