Изображения не отображаются в imageView - PullRequest
0 голосов
/ 29 августа 2018

В настоящее время ничего не происходит, когда я прикасаюсь к кнопке, которая переводит меня в другой ВК, который должен получить изображение из firebase, а затем отображать его в виде изображения на ВК после нажатия кнопки с именем loadImageFunc

Что не так в моем коде? Я не получаю ошибок. Это просто не работает.

import UIKit
import FirebaseStorage
import FirebaseDatabase
import FirebaseAuth
import Firebase
​
class PhaseOneViewController: UIViewController {

    @IBOutlet weak var p1ImageView: UIImageView!
​
    @IBAction func loadImages(_ sender: Any) {
        self.downloadImages(folderPath: "\(Storage.storage().reference().child((Auth.auth().currentUser?.uid)!).child("post\(takePicViewController().finalPost + PhotoArray.sharedInstance.numberPost)").child(ImageUploadManager().imageName))", success: { (img) in
            self.p1ImageView.image = img
            print(img)
        }) { (error) in
            print("here is errorrrrrrrrrrr",  error)
        }
    }
​
    func downloadImages(folderPath:String,success:@escaping (_ image:UIImage)->(),failure:@escaping (_ error:Error)->()){
//        for i in 0 ..< 194 {
            // Create a reference with an initial file path and name
            let reference = Storage.storage().reference().child((Auth.auth().currentUser?.uid)!).child("post\(takePicViewController().finalPost + PhotoArray.sharedInstance.numberPost)").child(ImageUploadManager().imageName)
            reference.getData(maxSize: (3 * 1024 * 1024)) { (data, error) in
                if let _error = error { //code fails here and prints the error
                    print(_error)
                    failure(_error)
                } else {
                    if let _data  = data {
                        let myImage:UIImage! = UIImage(data: _data)
                        success(myImage)
                        self.p1ImageView.image = myImage
                    }
                }
            }
        //}
    }
}

После ответа на приведенный ниже ответ я выяснил, что блок if else с данными никогда не возникает, потому что код завершается с ошибкой в ​​строке, указанной выше (первая часть оператора if). Это приводит к ошибке ниже

Domain = FIRStorageErrorDomain Code = -13010 "Объект DOFoO2mCg7bnZcbIdT7SFafquB3 / post1 / 153555392.86284.jpg не существует." UserInfo = {Объект = DOFoO2mCg7bnZcbIdT7SFafFquB3 / post1 / 1535515392.86284.jpg, ResponseBody = NoSuchKey Указанный ключ не exist.No такого объекта: practicearraybasicimg1.appspot.com/DOFoO2Cg7bnZcbIdT7SFafFquB3/post1/1535515392.86284.jpg, ведро = practicearraybasicimg1.appspot.com данные =

Обновление : Я также попытался установить свои права на чтение и запись для следующих элементов в хранилище , как указано в ответе ниже. Однако никаких изменений не было.

    service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write ;
    }
  }
}

Обновление : Я попробовал следующий код:

    override func viewDidLoad() {
    super.viewDidLoad()
    database = Database.database()
    storage = Storage.storage()
    let dbRef = database.reference().child("Posts").child(uid!).child("post\(takePicViewController().finalPost + PhotoArray.sharedInstance.numberPost)")

    dbRef.observe(.childAdded, withchildAdded: { (snapshot) in
        // Get download URL from snapshot
        let downloadURLsnapshot;.value() as! String
        // Create a storage reference from the URL
        let storageRef = storage.referenceFromURL(downloadURL)
        // Download the data, assuming a max size of 1MB (you can change this as necessary)
        storageRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
            // Create a UIImage, add it to the array
            let pic = UIImage(data: data)
            picArray.append(pic)
        };
    })

}

@IBAction func loadImages(_ sender: Any) {

    for image in picArray {
        self.p1ImageView.image = image
    }
}

Но я получаю это:

Метки аргументов '(_ :, withchildAdded :)' не соответствуют никаким доступным перегрузкам

На линии, которая идет dbRef.observe ...

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Попробуйте это

let reference = Storage.storage().reference().child((Auth.auth().currentUser?.uid)!).child("post\(takePicViewController().finalPost + PhotoArray.sharedInstance.numberPost)").child(ImageUploadManager().imageName)
reference.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in

    // Create a UIImage, from data
    if let pic = UIImage(data: data){
        print(pic)
    }
})
0 голосов
/ 29 августа 2018

Александр, я думаю, вы обновляете пользовательский интерфейс в фоновом потоке. Во-первых, проверьте, выполняется ли оператор, если да, затем попробуйте сделать это в основном потоке, например

 DispatchQueue.main.async {
        if let _data  = data {
            let myImage:UIImage! = UIImage(data: _data)
            success(myImage)
            self.p1ImageView.image = myImage
        }
    }

попробуйте так

let dbRef = database.reference().child("childName")
  dbRef.observeEventType(.ChildAdded, withBlock: { (snapshot) in
   // Get download URL from snapshot
     let downloadURL = snapshot.value() as! String
  // Create a storage reference from the URL
  let storageRef = storage.referenceFromURL(downloadURL)
  // Download the data, assuming a max size of 1MB (you can change this as necessary)
   storageRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
    // Create a UIImage, add it to the array
  let pic = UIImage(data: data)
  picArray.append(pic)
 })
})

Обновлено

dbRef.observe(.childAdded, with: { (snapshot) in

       let downloadURL = snapshot.value() as! NSDictionary
        ...

    })

Просто нужно обновить с помощью Блока, чтобы только с

...