最初にする必要があるのは、firebaseから取得したデータをパラメータとして含む呼び出しを作成することです。ログインしたときにユーザーデータを取得するには、次のようにします。その後、私のアプリと 私のユーザークラスがこのようなものです(私はこれは絶対に間違ったアプローチであるVCとの間でデータを渡すする意図を持っていない)私のアプリケーションのすべての部分では、これらのデータを使用します。後
import Foundation
class User {
static let sharedInstance = User()
var uid: String!
var username: String!
var firstname: String!
var lastname: String!
var profilePictureData: Data!
var email: String!
}
別のクラスのFirebaseUserManagerを作成しました(あなたのView Controllerでこれを行うことができますが、今後のアップデートを容易にするために、あなたのコントローラとあなたのモデルのビューを分離することは常に評価されています)あなたや他の開発者のための)のために は、だから私のfirebaseUserManagerクラスは、この
import Foundation
import Firebase
import FirebaseStorage
protocol FirebaseSignInUserManagerDelegate: class {
func signInSuccessForUser(_ user: FIRUser)
func signInUserFailedWithError(_ description: String)
}
class FirebaseUserManager {
weak var firebaseSignInUserManagerDelegate: FirebaseSignInUserManagerDelegate!
func signInWith(_ mail: String, password: String) {
FIRAuth.auth()?.signIn(withEmail: mail, password: password) { (user, error) in
if let error = error {
self.firebaseSignInUserManagerDelegate.signInUserFailedWithError(error.localizedDescription)
return
}
self.fechProfileInformation(user!)
}
}
func fechProfileInformation(_ user: FIRUser) {
var ref: FIRDatabaseReference!
ref = FIRDatabase.database().reference()
let currentUid = user.uid
ref.child("users").queryOrderedByKey().queryEqual(toValue: currentUid).observeSingleEvent(of: .value, with: { snapshot in
if snapshot.exists() {
let dict = snapshot.value! as! NSDictionary
let currentUserData = dict[currentUid] as! NSDictionary
let singletonUser = User.sharedInstance
singletonUser.uid = currentUid
singletonUser.email = currentUserData["email"] as! String
singletonUser.firstname = currentUserData["firstname"] as! String
singletonUser.lastname = currentUserData["lastname"] as! String
singletonUser.username = currentUserData["username"] as! String
let storage = FIRStorage.storage()
let storageref = storage.reference(forURL: "gs://versus-a107c.appspot.com")
let imageref = storageref.child("images")
let userid : String = (user.uid)
let spaceref = imageref.child("\(userid).jpg")
spaceref.data(withMaxSize: 1 * 1024 * 1024) { data, error in
if let error = error {
// Uh-oh, an error occurred!
print(error.localizedDescription)
} else {
singletonUser.profilePictureData = data!
print(user)
self.firebaseSignInUserManagerDelegate.signInSuccessForUser(user)
}
}
}
})
}
}
のようなものが含まれていますので、基本的に、このクラスには、ユーザーを取得すること、いくつかの私たちが実装しますプロトコルとマネージャーfirebaseサインインしてfechProfileInformation二つの機能が含まれています情報私は、以下のなかった私のログインビューコントローラに比べ
: ログインbuttoで1プロトコルを実装
class LoginViewController: UIViewController, FirebaseSignInUserManagerDelegate
2 nは私がやったプロトコルメソッドを実装
@IBAction func loginAction(_ sender: UIButton) {
guard let email = emailTextField.text, let password = passwordTextField.text else { return }
let firebaseUserManager = FirebaseUserManager()
firebaseUserManager.firebaseSignInUserManagerDelegate = self
firebaseUserManager.signInWith(email, password: password)
}
3次のボタンで記号をユーザーがクリックがあったときに、今{
// Do something example navigate to the Main Menu
}
func signInUserFailedWithError(_ description: String) {
// Do something : example alert the user
}
: FUNCのsignInSuccessForUser(FIRUser _ユーザー)オブジェクトが作成されたオブジェクトがfirebaseデータベースに保存されています
あなたの質問の答え:どのようにアプリケーションのどこにユーザデータを取得するのですか
私のアプリのすべての部分で私は
print(User.sharedInstance.uid) or print(User.sharedInstance. username)
を作ることができて、私は私がしたい値を取得します。
PS:シングルトンを適切に使用するには、インスタンス化時にオブジェクトを呼び出す必要があります。
シングルトンについて読んで、あなたの問題を解決するためにそれについて考えるようお願いします:) –
@AchrefGassoumi確かに、あなたが提案できるリソースはありますか? – user2722667
私はこれがあなたが必要としていると思う https://krakendev.io/blog/the-right-way-to-write-a-singleton 、あなたがあなたの問題を解決した場合私はあなたの答えを見てみたい場合は残してくださいコメントと私は後で答えを投稿する(今私はそれを行うことはできません、申し訳ありません) また、これをお読みください https://www.raywenderlich.com/86477/introducing-ios-design-patterns-in- swift-part-1 –