gpt4 book ai didi

ios - 同步 Realm 对象服务器连接完成以及后续 Realm 对象使用情况

转载 作者:行者123 更新时间:2023-11-30 12:03:47 26 4
gpt4 key购买 nike

我正在使用 Realm 对象服务器进行一个简单的测试项目,但在同步 ROS 连接设置和跟踪 Realm 对象访问数据库的使用方面遇到问题。在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 之间的同步,其中 checkForExistingProfile 的执行发生在 connectROS 完成之前。

最佳答案

由于您没有展示在 viewDidLoad() 之后如何调用 checkForExistingProfile() ,这是推测,但基于您描述的其他所有内容,这可能是原因。

您需要做的是在同步用户登录并且您的 self.realmRos 变量已初始化之前不要调用 checkForExistingProfile()。 Cocoa Touch 不会自动同步使用异步模式编写的代码(例如 logIn(),它立即返回,但在回调中报告其实际完成状态),因此您需要手动确保无论 >logIn() 应该在调用任何依赖于其完成的其他代码之前完成。

关于ios - 同步 Realm 对象服务器连接完成以及后续 Realm 对象使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46896992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com