IOS - 限制用户最多选择 8 个图像并使用 For 循环将多个图像上传到 Firebase

标签 ios swift firebase for-loop firebase-realtime-database

我是 IOS 新手。我正在使用 Xcode 和 Swift 构建一个图像共享应用程序

我陷入了图像上传部分。

如何限制用户最多选择 8 张图片,然后使用 For 循环将所选图片上传到 Firebase?

我想使用For循环,因为我想将第一张图片设置为图标图片。

以下是我现在能做的事情

我创建了一个注册页面,并允许用户使用 ImagePicker 选择 1 个图像并将其上传到 Firebase。下面是我的代码。

import UIKit
import Firebase

class SignUpViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate
{

    @IBOutlet weak var iconfield: UIImageView!

    @IBOutlet weak var usernamefield: UITextField!

    @IBOutlet weak var emailfield: UITextField!

    @IBOutlet weak var passwordfield: UITextField!

    @IBOutlet weak var confirmpasswordfield: UITextField!

    @IBOutlet weak var signupbutton: UIButton!

    let picker = UIImagePickerController()
    var userStorage: StorageReference!
    var ref: DatabaseReference!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        picker.delegate = self
        let storage = Storage.storage().reference(forURL: "gs://whatisit-8484a.appspot.com/")
        ref = Database.database().reference()
        userStorage = storage.child("users")
        // Do any additional setup after loading the view.
        iconfield.layer.cornerRadius=iconfield.frame.size.width/2
        iconfield.clipsToBounds = true
    }

    @IBAction func selectionpressed(_ sender: Any)
    {
        picker.allowsEditing = true
        picker.sourceType = .photoLibrary
        present(picker,animated:true,completion:nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
    {
        if let image = info[UIImagePickerControllerEditedImage] as? UIImage
        {
            self.iconfield.image = image
            signupbutton.isHidden = false
        }
        self.dismiss(animated:true,completion:nil)
    }

    @IBAction func confirmsignup(_ sender: Any)
    {
        guard usernamefield.text != "",emailfield.text != "",passwordfield.text != "", confirmpasswordfield.text != "" else {return}

        if passwordfield.text == confirmpasswordfield.text
        {
            Auth.auth().createUser(withEmail: emailfield.text!, password: passwordfield.text!, completion: { (user, error) in
                if let error = error
                {
                    print(error.localizedDescription)
                }

                if let user = user
                {
                    let changeRequest = Auth.auth().currentUser!.createProfileChangeRequest()
                    changeRequest.displayName = self.usernamefield.text!
                    changeRequest.commitChanges(completion: nil)

                    let imageRef = self.userStorage.child("\(user.uid).jpg")
                    let data = UIImageJPEGRepresentation(self.iconfield.image!, 0.5)

                    let uploadTask = imageRef.putData(data!, metadata: nil, completion: { (metadata, err) in
                        if err != nil{
                            print(err!.localizedDescription)
                        }
                        imageRef.downloadURL(completion: { (url, er) in
                            if er != nil{
                                print(er!.localizedDescription)
                            }

                            if let url = url
                            {
                                let userInfo: [String: Any] = ["uid": user.uid,"E-mail":self.emailfield.text,"username": self.usernamefield.text,"urlToImage": url.absoluteString]
                                self.ref.child("users").child(user.uid).setValue(userInfo)
                                let vc = UIStoryboard(name: "Main",bundle:nil).instantiateViewController(withIdentifier: "homeview")
                                self.present(vc,animated:true,completion:nil)
                            }
                        })
                    })
                    uploadTask.resume()
                }
            })
        }

最佳答案

您的问题非常广泛,实际上涵盖了几个不同的问题。实际上,您应该分解问题并只为每个问题发布一个问题,但我会给您一些指导。

  • How to select multiple images using a UIImagePickerController - 基本上你不能,你要么需要使用库,要么使用 PhotoLibrary 自己实现
  • How to upload an image to Firebase应该相当简单。
  • 多次上传可能会稍微复杂一些。您可以使用 NSOperationQueue 来管理要处理的项目队列并指定一次要处理的项目数,您可以使用 SerialQueue 一次处理一个项目,或者使用 DispatchQueue 一次触发所有请求,它会让您知道什么时候结束。一旦达到这一点,首先尝试一下,研究一下提到的方法。如果您遇到困难,请提出另一个问题并解释您的方法、您希望它如何工作以及出了什么问题。

This other answer可能有助于多次上传,如果没有,请在线查找 Grand Central Dispatch 或查看 here

关于IOS - 限制用户最多选择 8 个图像并使用 For 循环将多个图像上传到 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49321441/

相关文章:

ios - scheduledTimerWithTimeInterval 有时不按正确的时间间隔调用

ios - 如何在swift 2中设置随机颜色的计时器?

swift - 在 SwiftUI View 结构中使用常量是否有负面影响?

ios - UILabel 中的 NSAttributedString 尾部截断

android - 火力地堡不工作。安卓

arrays - 检索快照时,如何使用数组中的最后一个值作为 .child() 的路径?

ios - 我正在构建一个简单的 RSS 阅读器应用程序并收到一条奇怪的错误消息

ios - 加密或部分加密核心数据数据库?

ios - 通过 subview 禁用触摸 View

Android Firebase - Android SDK 24 的 Firebase UI 和 Android 设计支持库的版本号