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

Swift集成Firebase开发时如何将图片上传设置为可选?

问题原因

你的所有提交逻辑全部包裹在针对选中图片的if let可选绑定块中,只有当SelecSubStorge有值(即用户选中了图片)、且图片可正常转换为JPEG数据时,块内的代码才会执行,未选图片时整个逻辑直接跳过,自然无法提交其他数据。

修复思路

  1. 将写入Firebase数据库的逻辑抽为独立的公用方法,支持传入可选类型的图片链接参数
  2. 点击提交按钮时先判断是否存在选中的图片:
    • 存在图片:先上传图片到Storage,拿到下载链接后调用数据库写入方法,传入对应的图片链接
    • 不存在图片:直接调用数据库写入方法,图片链接参数传空即可

完整修改代码

@IBAction func SendBtn(_ sender: Any) {
    // 先校验非图片的必填参数,可根据你的业务逻辑调整校验规则
    guard let subject = self.subjectLB.text, !subject.isEmpty,
          let detail = self.detilesTextview.text, !detail.isEmpty,
          let color = self.ColorIsColor else {
        // 可在这里新增必填项为空的用户提示
        return
    }
    
    // 判断是否有选中的图片
    if let profileImage = SelecSubStorge, let profileIMG = profileImage.jpegData(compressionQuality: 0.1) {
        // 有图片,先走图片上传逻辑
        let udidImage = NSUUID().uuidString
        let storeg = Storage.storage().reference(withPath: "gs://myproduct-744cb.appspot.com").child(udidImage)
        
        storeg.putData(profileIMG, metadata: nil) { metaDate, error in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            storeg.downloadURL { url, error in
                let imgSub = url?.absoluteString
                // 拿到图片链接后调用数据库写入方法
                self.saveDataToDatabase(imgUrl: imgSub, color: color)
            }
        }
    } else {
        // 没有图片,直接调用数据库写入方法,图片链接传空
        self.saveDataToDatabase(imgUrl: nil, color: color)
    }
}

// 抽离的写入数据库公用方法
private func saveDataToDatabase(imgUrl: String?, color: UIColor) {
    self.labelColor = CIColor(cgColor: color.cgColor).stringRepresentation
    let ref = Database.database().reference()
    let sub = ref.child("Sub")
    guard let udid = sub.childByAutoId().key else { return }
    let setRef = sub.child(udid)
    let value = [
        "sub": self.subjectLB.text,
        "detiles" : self.detilesTextview.text,
        "ImgSub" : imgUrl,
        "SubID" : udid,
        "Color" : self.labelColor,
        "Alignment" : self.data0,
        "sizeFont" : self.SliderSize
    ] as [String : Any]
    
    setRef.setValue(value) { error, ref in
        if let error = error {
            print(error.localizedDescription)
            return
        }
        let alert = UIAlertController(title: "Done", message: "Done Send", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alert, animated: true)
    }
}

可选优化点

  • 可根据业务需求调整非图片必填项的校验规则,避免提交无效数据
  • 原代码对ColorIsColor使用强制解包,修改后新增可选绑定校验,可避免空值崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:36:03