Swift集成Firebase开发时如何将图片上传设置为可选?
问题原因
你的所有提交逻辑全部包裹在针对选中图片的if let可选绑定块中,只有当SelecSubStorge有值(即用户选中了图片)、且图片可正常转换为JPEG数据时,块内的代码才会执行,未选图片时整个逻辑直接跳过,自然无法提交其他数据。
修复思路
- 将写入Firebase数据库的逻辑抽为独立的公用方法,支持传入可选类型的图片链接参数
- 点击提交按钮时先判断是否存在选中的图片:
- 存在图片:先上传图片到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
相关产品推荐
相关产品推荐

