2016-04-14 19 views
0

oluşturmadan önce Firebase'de verinin olup olmadığını kontrol etme Yeni kullanıcının kullanıcı adını, şifresini ve bir takma adını eklemesi gereken bir kullanıcı giriş formu var (temel firebase auth olarak kullanıcı adı olarak sadece e-postayı kabul eder, değil mi?). Kullanıcı

Bu

ben nickname enter image description here

anahtar kullanıcı adı dayanmaktadır almaya Firebase oluşturulmuş bir kullanıcıların yapıdır ve 2 çocuk babasıdır: nick ve ident.

Kullanıcıya Firebase'den kimlik doğrulama yöntemlerini kullanarak oluşturmaya başlamadan önce, takma adın zaten mevcut olup olmadığını kontrol etmek için sorgularim. Evet ise, kullanıcı oluşturmaz ve bir uyarı atar. Takma ad mevcut değilse, kullanıcıyı oluşturur ve ardından kullanıcı adının yukarıdaki resimdeki kullanıcı yapısına eklemesini ekler.

Bir süre düşünme ve ben iyi bir fikir createuser kodu almak ve eklemek olduğunu düşündüm (takma zaten var olsaydı kod önce check 'observeSingleEventOfType' atlama ve CREATEUSER infaz edildi) orada burada kodu değiştirmeden nickname sorgusunda doğrudan observeSingleEventOfType içinde 'snapshot.exists()' için 'else' olarak '...

Çalışıyor gibi görünüyor, ancak' doğru 'olup olmadığını bilmiyorum Bunu gerçekleştirmenin yolu ...

Bunu yapmanın başka bir yolu var mı (daha iyi bir yol)?

Yöntem aşağıdadır. Teşekkürler!

func createUser(username: String, password: String, nickname: String){ 

    var userCreated = false 
    var errorCode = 0 

    users.queryOrderedByChild("Nickname").queryEqualToValue(nickname).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
     if snapshot.exists() { 
      errorCode = 3 
      self.delegate?.didReceiveResponseFromFirebaseCreateUser!(userCreated, errorCode: errorCode) 
     } 
     else{ 
      self.ref.createUser(username, password: password, withCompletionBlock: { (error) in 
       if error != nil { 
        print (error.description) 

        if error.description.rangeOfString("EMAIL_TAKEN") != nil { 
         errorCode = 1 
        } 
        else if error.description.rangeOfString("INVALID_EMAIL") != nil { 
         errorCode = 2 
        } 

       } 
       else{ 
        userCreated = true 
        let newUser = User(username: username, nickname: nickname) 

        let newUserRef = self.users.childByAppendingPath(username.stringByReplacingOccurrencesOfString(".", withString: "-")) 
        newUserRef.setValue(newUser.toAnyObject()) 

       } 

       self.delegate?.didReceiveResponseFromFirebaseCreateUser!(userCreated, errorCode: errorCode) 

      }) 
     } 


    }) 
} 
+1

Bu soru için artık gerekli değil, ancak genel olarak: Sorunuzdaki JSON ağacının resminin, metin olarak JSON'a sahip olduğu kadar kullanışlı olmadığını unutmayın. Firebase veritabanınız. JSON'un metne dönüştürülmesini sağlamak, onu gerçek verilerinizle test etmek ve cevabımızda kullanmak için genel olarak kullanmamıza izin verir ve genel olarak yapılması gereken sadece iyi bir şeydir. –

cevap

3

En son Firebase uygulamasını oluştururken aynı sorunla karşılaştım. Bunu çözmek için kullandığım yöntem, kullanıcı adından kullanıcı kimliğine ek bir eşleme oluşturmaktı.

users: { 
    accounts: { 
     uid1: { 
      username: frank, 
      ... 
     }, 
     uid2: { 
      username: monique, 
      ... 
     } 
     ... 
    }, 
    username_to_uid: { 
     frank: uid1, 
     monique: uid2, 
     ... 
    } 
} 

Bu iki önemli şeyler verir: Yani benim yapısı böyle bir şey görünüyor (uid Firebase auth kullanıcı id) kullanıcı kayıt çalışsa da kullanıcı adı eğer

  1. , önce kontrol edebilirsiniz diye "username_to_uid" eşlemesi kullanıldığında zaten mevcut olan
  2. Kullanıcı adlarını ve şifrelerini kullanarak da giriş yapabilirsiniz. Varsayılan olarak, Firebase auth kullanarak bir e-posta ve şifre ile kullanıcı giriş yapabilirsiniz. Burada, verilen bir kullanıcı adı için "username_to_uid" eşleştirmesini kullanarak bu kullanıcı adıyla ilişkili kullanıcı kimliğini kolayca geri yükleyebilmeniz, böylece kullanıcı adlarını ve şifrelerini kullanarak kullanıcı girişi yapabilirsiniz. Ben Firebase Olay Observer ile vardı eşzamanlılık konuda
+0

Vay! Bu güzel bir fikir! Burada deneyeceğim. Kesinlikle denemeliyim. Teşekkür ederiz! –

+0

@LucasAlmeida Bunu duymak harika! – pkacprzak

+0

Outh işlemi daha iyi (e-posta yerine takma ad kullanarak) yapmak için elverişli bir şekilde gelecektir, ancak firebase-hızlı mesele için şu anki yolu koruyacak mıyım mı diye anlamaya ihtiyacım olacak ... ObserveSingleEventOfType eşzamansız olarak davrandığından, bloğu yürütülmeden önce createUser komutunu çalıştırıyordu ve varolan bir takma ad için true döndüren değişken yanlış olarak gönderiliyordu, böylece aynı kullanıcı adıyla birden çok kullanıcı oluşturuluyordu. Thats neden observeSingleEventOfType blogunun içindeki createUser kodunu 'sandviçledim' ... –

0

Sadece bir kafaları yukarı:

Dün, ben başka viewController açmak için bir segue ararken ben (o çağırıyordu sorunları vardı, o çalıştığımı sanıyordum Gözlemci hala hiçbir sonuç ile çalışırken ve delege yönteminin diğer görünümde bildirilmediği için uygulama çöktü iken yeni görünüm) ...

Çözüm olarak, tüm delegelerden kurtuldum ve tamamlama işleyicileri kullanarak yöntemler ... Şimdi gerçekten iyi gidiyor!

Oh, ve @pkacprzak: Değişiklikleri yaptım ve takma ad ile kullanıcı kimliği arasındaki ilişkiyi depolamak için bu 'köprü yapısını' kullanmaya başladım. Dostum, şimdi tekmeleme! Bunun için çok teşekkür ederim!

+0

Awesome! Tamamlama işleyicilerinden bahsetmişken, eğer güçlerini bilen varsa, async görevlerini zincirleme konusunda harika bir kavram var. – pkacprzak