मैं Firebase प्रामाणिक/भंडारण/फायरस्टोर का उपयोग कर एक नई पंजीकरण प्रक्रिया बना रहा हूं।

यहां नए पंजीकरण की प्रक्रिया है (पहले प्रामाणिक के साथ प्रमाणित करें, लौटे हुए उपयोगकर्ता को फायरस्टोर में पंजीकृत करें, यदि कोई छवि है तो URL सहेजें) प्रक्रिया है।

static func signUp(name: String, email: String, password: String, image: UIImage?, onSuccess: @escaping () -> Void, onError: @escaping (_ errorMessage: String?) -> Void) {
    Auth.auth().createUser(withEmail: email, password: password, completion: { user, error in
        if error != nil {
            onError(error)
            return
        }
        guard let uid = user?.user.uid else { return }
        var dict: [String: Any] = [
            "name": name,
            "email": email
        ]
        // If Image is Set
        if let image = image {
            StorageService.storage(image: image, path: .icon, id: uid) { (imageUrl) in
                dict["iconUrl"] = imageUrl
            }
        }
        Firestore.firestore().collection("users").document(uid).setData(dict) { (error) in
            if let error = error {
                print(error)
                return
            }
        }
        onSuccess()
    })
}

स्टोरेज यूआईएममेज को तर्क के रूप में लेने और यूआरएल      क्लास स्टोरेज सर्विस { को वापस करने का एक कार्य निम्नलिखित है

// Upload Image to Storage
static func storage(image: UIImage?, path: PathType, id: String, completion: @escaping (_ imageUrl: String?) -> ()) {
    guard let image = image, let imageData = UIImageJPEGRepresentation(image, 0.1) else {
        print("Non Image")
        completion(nil)
        return
    }
    let storageRef = Storage.storage().reference().child(path.rawValue).child(id)
    storageRef.putData(imageData, metadata: nil, completion: { (metaData, error) in
        if let error = error {
            print("Fail to Put Data in Storage : \(error)")
            completion(nil)
            return
        }
        storageRef.downloadURL { (imageUrl, error) in
            if let error = error {
                print("Fail to Download Url : \(error)")
                completion(nil)
                return
            }
            if let imageUrl = imageUrl?.absoluteString {
                completion(imageUrl)
            }
        }
    })
}

}

प्रमाणीकरण का पंजीकरण और फायरस्टोर में सहेजना सफल होता है, लेकिन जब कोई छवि होती है, हालांकि इसे स्टोरेज में संग्रहीत किया जाता है, तो छवि का यूआरएल फायरस्टोर में सहेजा नहीं जाता है।

स्टोरेज () क्या क्लोजर लिखने में कोई समस्या है?

0
son 19 सितंबर 2018, 15:33

1 उत्तर

सबसे बढ़िया उत्तर

फ़ंक्शन StorageService.storage अतुल्यकालिक है, जब कोई छवि होती है, तो URL प्रतिक्रिया प्राप्त किए बिना फायरस्टोर में सम्मिलित करने का कार्य निष्पादित किया जाता है। छवि का URL प्राप्त करने और सहेजने के लिए आपको अपना फ़ंक्शन डालने के लिए StorageService.storage के क्लोज़र में रखना होगा

// If Image is Set
    if let image = image {
      StorageService.storage(image: image, path: .icon, id: uid) { (imageUrl) in
          dict["iconUrl"] = imageUrl
          Firestore.firestore().collection("users").document(uid).setData(dict) { (error) in
              if let error = error {
                  print(error)
                  return
              }
              onSuccess()
          }
      }
    }else {
      Firestore.firestore().collection("users").document(uid).setData(dict) { (error) in
          if let error = error {
              print(error)
              return
          }
          onSuccess()
      }
    }
1
veradiego31 19 सितंबर 2018, 16:15