图片未在imageView中显示

时间:2018-08-29 03:43:57

标签: swift firebase imageview firebase-storage

当前,当我触摸将我带到另一个应该从Firebase获取图像的VC并按下名为loadImageFunc的按钮后,将其显示在VC的图像视图中时,什么也没发生 >

我的代码有什么问题?我没有任何错误。只是不起作用。

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代码= -13010“对象DOFoO2mCg7bnZcbIdT7SFafquB3 / post1 / 153555392.86284.jpg不存在。” UserInfo = {object = DOFoO2mCg7bnZcbIdT7SFafFquB3 / post1 / 1535515392.86284.jpg,ResponseBody = NoSuchKey该指定的键不存在。不存在这样的对象:Practicearraybasicimg1.appspot.com/DOFoO2Cg7bnZcbIdT7SFafFjpgB.3452 .COM,数据= <3c3f786d 6c207665 7273696f 6e3d2731 2e302720 656e636f 64696e67 3d275554 462d3827 3f3e3c45 72726f72 3e3c436f 64653e4e 6f537563 684b6579 3c2f436f 64653e3c 4d657373 6167653e 54686520 73706563 69666965 64206b65 7920646f 6573206e 6f742065 78697374 2e3c2f4d 65737361 67653e3c 44657461 696c733e 4e6f2073 75636820 6f626a65 63743a20 79756269 70726163 74696365 61727261 79626173 6963696d 67312e61 70707370 6f742e63 6f6d2f44 4f466f4f 326d4367 37626e5a 63624964 54375346 61664671 7542332f 706f7374 312f3135 33353531 35333932 2e383632 38342e6a 70673c2f 44657461 696c733e 3c2f4572 726f723e>,data_contenttype charset = UTF-8,NSLocalizedDescription =对象DOFoO2mCg7bnZcbIdT7SFafFquB3 / post1 / 1535515392.86284.jpg不存在。,ResponseErrorDomain = com.google.HTTPStatus,ResponseErrorCode = 404}

更新:我还试图按照答案下面的说明在存储中设置对以下内容的读写权限。但是没有变化。

    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 :(得分:0)

亚历山大,我想您正在后台线程中更新UI。首先,检查语句是否正在执行(如果是),然后尝试在主线程(例如

)中执行此操作
 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
        ...

    })

只需将withBlock更新为仅使用

答案 1 :(得分:0)

尝试这个

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)
    }
})
相关问题