简体   繁体   中英

Trying to build multiple image upload to Firebase: 2 Errors in SWIFT 4, FIREBASE 5.0.0

I am making a project very similiar to Instagram's multiple image post feature, and I have 2 errors that are connected to each other in my capturePhotoController because of my ImageUploadManager. The errors are:

Cannot assign to immutable expression of type 'ImageUploadManager.Type' Type 'ImageUploadManager?' has no member 'uploadImage'

It is happening in this view controller: *The errors are marked with a comment

import UIKit

class takePicViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!

    let imagePicker = UIImagePickerController()

    override func viewDidLoad() {
        super.viewDidLoad()

        imagePicker.delegate = self
        imagePicker.sourceType = .camera
        imagePicker.allowsEditing = false

    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
 // Error       ImageUploadManager = ImageUploadManager()
 // Error        ImageUploadManager?.uploadImage(userPickedImage, progressBlock: { (percentage) in
                print(percentage)
            }, completionBlock: { (fileURL, errorMessage) in
                 print(fileURL)
                print(errorMessage)
            })

            PhotoArray.sharedInstance.photosArray.append(userPickedImage)  //append converted data in array

            imageView.image = userPickedImage

        }

        imagePicker.dismiss(animated: true, completion: nil)
    }

    @IBAction func cameraButtonPressed(_ sender: UIButton) {

        present(imagePicker, animated: true, completion: nil)

    }


}

Here is the code for the ImageUploadManager:

import UIKit
import FirebaseStorage
import Firebase

struct Constants {

    struct Car {
        static let imagesFolder: String = "carImages"
    }

}

class ImageUploadManager: NSObject {

    func uploadImage(_ image: UIImage, /**/ progressBlock: @escaping (_ percentage: Double) -> Void, /**/ completionBlock: @escaping (_ url: String?, _ errorMessage: String?) -> Void) {

        let data = Data()

        let storage = Storage.storage()
        let storageRef = storage.reference()

        let imageName = "\(Date().timeIntervalSince1970).jpg"
        let imagesReference = storageRef.child(Constants.Car.imagesFolder).child(imageName)

        if let imageData = UIImageJPEGRepresentation(image, 0.8) {
            let metadata = storageRef.child("image/jpg")


            let uploadTask = metadata.putData(data, metadata: nil) { (metadata, error) in
                guard let metadata = metadata else {
                    // Uh-oh, an error occurred!
                    return
                }

                storageRef.downloadURL { (url, error) in
                    guard let downloadURL = url else {
                        // Uh-oh, an error occurred!
                        return
                    }
                }
            }

            uploadTask.observe(.progress, handler: { (snapshot) in
                guard let progress = snapshot.progress else {
                    return
                }

                let percentage = (Double(progress.completedUnitCount) / Double(progress.totalUnitCount)) * 100
                progressBlock(percentage)

            })
        } else {
            completionBlock(nil, "Image could not be converted to Data.")
        }

        }

}

Is the commented code: // Error ImageUploadManager = ImageUploadManager() your declaration of ImageUploadManager ? if so that is totally wrong. It should be declared as below:

if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
    let imageUploadManager = ImageUploadManager()
    imageUploadManager.uploadImage(userPickedImage, prog.....

Reading your ImageUploadManager it looks like it's an stateless object and you can declare your function as a class function.

`class func uploadImage(_ image: UIImage`......`

You can then call it:

if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
    ImageUploadManager.uploadImage(userPickedImage, prog.....

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM