You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift+Firestore用户名占用校验及文档创建功能实现咨询

Fixing Firestore Username Existence Check in Swift

Got it, let's get that username existence check working for your Swift + Firestore setup! The core issue with your current code is that you're missing the actual Firestore call to verify if the document exists, plus there's a hardcoded document ID ("trinidad") when creating the entry that needs fixing. Here's a complete, working solution with explanations:

Key Fixes & Explanations

  • Add Firestore Document Check: Use getDocument() to fetch the document snapshot and check its exists property
  • Main Thread for UI: All alert presentations run on the main thread (since Firestore callbacks happen in the background)
  • Dynamic Document ID: Use the user's input username as the document ID for both check and creation (so future checks work correctly)
  • Better Input Handling: Added a guard statement to safely unwrap and validate the username input

Full Corrected Code

func nextButtonPressed(){ 
    let db = Firestore.firestore() 
    
    // Safely unwrap and validate username input
    guard let username = usernameTextField.text, !username.trimmingCharacters(in: .whitespaces).isEmpty else {
        let emptyAlert = UIAlertController(title: "Missing Username", message: "Please enter a valid username", preferredStyle: .alert)
        emptyAlert.addAction(UIAlertAction(title: "OK", style: .default))
        present(emptyAlert, animated: true)
        return
    }
    
    let usernameDocRef = db.collection("Taken User Names").document(username)
    
    // Check if the username document exists in Firestore
    usernameDocRef.getDocument { [weak self] documentSnapshot, error in
        guard let self = self else { return }
        
        // Handle Firestore errors first
        if let error = error {
            print("Error checking username: \(error.localizedDescription)")
            return
        }
        
        guard let snapshot = documentSnapshot else {
            print("Failed to retrieve document snapshot")
            return
        }
        
        if snapshot.exists {
            // Username is taken - show alert to user
            let takenAlert = UIAlertController(title: "Username Taken", message: "Sorry, that username is already in use. Please pick another one.", preferredStyle: .alert)
            takenAlert.addAction(UIAlertAction(title: "OK", style: .default))
            // Run UI update on main thread
            DispatchQueue.main.async {
                self.present(takenAlert, animated: true)
            }
        } else {
            // Username is available - create the document
            usernameDocRef.setData(["Taken User Name": username]) { error in
                if let error = error {
                    print("Error creating username document: \(error.localizedDescription)")
                } else {
                    print("Username document created successfully!")
                    // Optional: Navigate to next screen or trigger post-creation logic here
                }
            }
        }
    }
}

Bonus Tips for Improvement

  • Add Loading State: Show a spinner while the Firestore check is in progress so users know the app is working
  • Input Validation: Add rules for allowed characters (e.g., no spaces, special chars) before hitting Firestore to reduce unnecessary network calls
  • Use [weak self]: Prevents retain cycles in the Firestore closure (already included in the code above)

内容的提问来源于stack exchange,提问作者user9043410

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:58:07