MongoDB Realm SwiftUI 继续会话/自动登录
MongoDB Realm SwiftUI continue session / auto login
我将 SwiftUI 2 与 MongoDB 同步领域 (10.5.2) 一起使用,目前我对如何在用户重新打开应用程序后继续会话感到困惑。
作为身份验证,我通过发布者使用电子邮件和密码,我知道我可以检查用户是否使用此功能登录:
app.currentUser!.isLoggedIn
这对我的用户来说也是 returns 正确的。但是我不知道如何从
获得发布者 $0
app.login(credentials: .emailPassword(email: username, password: password))
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: {
self.state.shouldIndicateActivity = false
switch [=12=] {
case .finished:
break
case .failure(let error):
self.state.error = error.localizedDescription
}
}, receiveValue: {
self.state.cardPublisher.send([=12=])
})
.store(in: &state.cancellables)
我用的方法
self.state.cardPublisher.send([=13=])
获取我的数据。所以我的问题是 如果用户重新启动应用程序,我如何获得 $0。
抱歉,如果这是一个愚蠢的问题,但我对组合还很陌生。
非常感谢任何帮助:)
如果对你有帮助,我目前有这两个发布者:
var cardPublisher = PassthroughSubject<RealmSwift.User, Error>()
let cardRealmPublisher = PassthroughSubject<Realm, Error>()
它们是这样使用的:
cardPublisher
.receive(on: DispatchQueue.main)
.flatMap { user -> RealmPublishers.AsyncOpenPublisher in
self.shouldIndicateActivity = true
var realmConfig = user.configuration(partitionValue: "teamID=123")
realmConfig.objectTypes = [Card.self, Dog.self]
return Realm.asyncOpen(configuration: realmConfig)
}
.receive(on: DispatchQueue.main)
.map {
self.shouldIndicateActivity = false
return [=15=]
}
.subscribe(cardRealmPublisher)
.store(in: &self.cancellables)
cardRealmPublisher
.sink(receiveCompletion: { result in
if case let .failure(error) = result {
self.error = "Failed to log in and open realm: \(error.localizedDescription)"
}
}, receiveValue: { realm in
self.cardRealm = realm
self.loadData()
})
.store(in: &cancellables)
我自己解决了,其实很简单。对于任何可能需要它的人,只需在应用加载后使用此方法:
if app.currentUser!.isLoggedIn {
app.currentUser.publisher
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: {
self.shouldIndicateActivity = false
switch [=10=] {
case .finished:
break
case .failure(let error):
self.error = error.localizedDescription
}
}, receiveValue: {
self.error = nil
self.cardPublisher.send([=10=])
})
.store(in: &self.cancellables)
} else {
// Regular Login
}
我将 SwiftUI 2 与 MongoDB 同步领域 (10.5.2) 一起使用,目前我对如何在用户重新打开应用程序后继续会话感到困惑。
作为身份验证,我通过发布者使用电子邮件和密码,我知道我可以检查用户是否使用此功能登录:
app.currentUser!.isLoggedIn
这对我的用户来说也是 returns 正确的。但是我不知道如何从
获得发布者 $0app.login(credentials: .emailPassword(email: username, password: password))
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: {
self.state.shouldIndicateActivity = false
switch [=12=] {
case .finished:
break
case .failure(let error):
self.state.error = error.localizedDescription
}
}, receiveValue: {
self.state.cardPublisher.send([=12=])
})
.store(in: &state.cancellables)
我用的方法
self.state.cardPublisher.send([=13=])
获取我的数据。所以我的问题是 如果用户重新启动应用程序,我如何获得 $0。
抱歉,如果这是一个愚蠢的问题,但我对组合还很陌生。
非常感谢任何帮助:)
如果对你有帮助,我目前有这两个发布者:
var cardPublisher = PassthroughSubject<RealmSwift.User, Error>()
let cardRealmPublisher = PassthroughSubject<Realm, Error>()
它们是这样使用的:
cardPublisher
.receive(on: DispatchQueue.main)
.flatMap { user -> RealmPublishers.AsyncOpenPublisher in
self.shouldIndicateActivity = true
var realmConfig = user.configuration(partitionValue: "teamID=123")
realmConfig.objectTypes = [Card.self, Dog.self]
return Realm.asyncOpen(configuration: realmConfig)
}
.receive(on: DispatchQueue.main)
.map {
self.shouldIndicateActivity = false
return [=15=]
}
.subscribe(cardRealmPublisher)
.store(in: &self.cancellables)
cardRealmPublisher
.sink(receiveCompletion: { result in
if case let .failure(error) = result {
self.error = "Failed to log in and open realm: \(error.localizedDescription)"
}
}, receiveValue: { realm in
self.cardRealm = realm
self.loadData()
})
.store(in: &cancellables)
我自己解决了,其实很简单。对于任何可能需要它的人,只需在应用加载后使用此方法:
if app.currentUser!.isLoggedIn {
app.currentUser.publisher
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: {
self.shouldIndicateActivity = false
switch [=10=] {
case .finished:
break
case .failure(let error):
self.error = error.localizedDescription
}
}, receiveValue: {
self.error = nil
self.cardPublisher.send([=10=])
})
.store(in: &self.cancellables)
} else {
// Regular Login
}