2016-09-08 2 views
0

Ich bin auf der Suche nach einem Anfang bis Ende Codebeispiel zum Abrufen eines Bildes aus Firebase Storage, nur um ein Bild anzuzeigen. Entweder als Bildansicht oder für eine Tabelle. Ich habe Posts hier und verschiedene Tutorials angeschaut. Es fühlt sich immer so an, als wäre etwas ausgelassen. Wenn ich das ganze Bild sehen könnte, kann ich das besser verstehen.Abrufen von Image aus Firebase Storage mit Swift

Der angehängte Code ist mein aktueller Versuch, photo1 von lokal zu ändern, um aus Firebase Storage zu ziehen.

import UIKit 
import Firebase 
import FirebaseAuth 
import FirebaseStorage 
import FirebaseDatabase 

class MainMenuTableViewController: UITableViewController { 



var mainMenu = [Menu]() 
var photo1 = UIImage() 
override func viewDidLoad() { 
    super.viewDidLoad() 
    loadMenu() 
} 

func loadMenu() { 

    let storage = FIRStorage.storage() 
    // Create a storage reference from the URL 
    let storageRef = storage.referenceForURL("https://firebasestorage.googleapis.com/v0/b/medicalpatientapp-7fd45.appspot.com/o/iconimages%2Ffile-medical-icons.png?alt=media&token=c95b9c51-67ae-4e93-b63c-62091015a9ff") 
    // 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!) 
     self.photo1 = pic! 

    } 


    //let photo1 = UIImage(named: "iconimages-file-medical-icons")! 
    let menu1 = Menu(name: "My Notes", photo: photo1)! 

    let photo2 = UIImage(named: "iconimages-file-medical-icons")! 
    let menu2 = Menu(name: "View Patients", photo: photo2)! 

    let photo3 = UIImage(named: "iconimages-add-medical-icons")! 
    let menu3 = Menu(name: "Add Persons", photo: photo3)! 

    mainMenu += [menu1, menu2, menu3] 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return mainMenu.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 


    // Configure the cell... 
    let cellIdentifier = "MenuTableViewCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MainMenuTableViewCell 

    // Fetches the appropriate meal for the data source layout. 
    let menu = mainMenu[indexPath.row] 

    cell.menuLabel.text = menu.name 
    cell.menuImage.image = menu.photo 

    return cell 
} 

}

Antwort

6

Wir hochFireBase Lagerung und die Firebase Realtime-Datenbank unter Verwendung empfehlen zusammen, dies zu erreichen. Hier ist ein vollständiges Beispiel:

Geteilt:

// Firebase services 
var database: FIRDatabase! 
var storage: FIRStorage! 
... 
// Initialize Database, Auth, Storage 
database = FIRDatabase.database() 
storage = FIRStorage.storage() 
... 
// Initialize an array for your pictures 
var picArray: [UIImage]() 

Upload:

let fileData = NSData() // get data... 
let storageRef = storage.reference().child("myFiles/myFile") 
storageRef.putData(fileData).observeStatus(.Success) { (snapshot) in 
    // When the image has successfully uploaded, we get it's download URL 
    let downloadURL = snapshot.metadata?.downloadURL()?.absoluteString 
    // Write the download URL to the Realtime Database 
    let dbRef = database.reference().child("myFiles/myFile") 
    dbRef.setValue(downloadURL) 
} 

Download:

let dbRef = database.reference().child("myFiles") 
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) 
    }) 
}) 

Weitere Informationen finden Sie Zero to App: Develop with Firebase, und es ist associated source code, für eine praktische Beispiel dafür, wie dies zu tun ist.

+0

Vielen Dank. Für den Download, zieht das alles aus "myfiles" oder muss man das für jeden tun? Kann Firebase-Speicher ohne die Datenbank alleine verwendet werden? Ich habe die "Zero To App" in einem früheren Post gesehen, ich benutze dies nicht, um ein Benutzerprofil zu diesem Zeitpunkt anzuhängen, und es war nicht so geradlinig wie Ihr Beispiel. –

+0

Firebase Storage ist so konzipiert, dass es unabhängig verwendet werden kann. Das heißt, es ist viel einfacher, Dateien aufzulisten und abzurufen, indem Sie sie in Verbindung mit der Echtzeitdatenbank verwenden. In diesem Beispiel werden alle Dateien abgerufen, die am Speicherort der Datenbank "myFiles" gespeichert sind, der durch die Uploads in "myFiles/{fileName}" aufgefüllt wurde. –

3

In Swift 3

let ref = Database.database().reference() 
    let uid = Auth.auth().currentUser?.uid 
    let usersRef = ref.child("users").child(uid!) 

    // only need to fetch once so use single event 
    usersRef.observeSingleEvent(of: .value, with: { snapshot in 

     if !snapshot.exists() { return } 

     //print(snapshot) 

     let userInfo = snapshot.value as! NSDictionary 
     print(userInfo) 
     print(userInfo["name"]!) 
     let profileUrl = userInfo["profilePicUrl"] as! String 

     print(profileUrl) 
     let storageRef = Storage.storage().reference(forURL: profileUrl) 
     storageRef.downloadURL(completion: { (url, error) in 
      let data = Data(contentsOf: url!) 
      let image = UIImage(data: data! as Data) 
      self.profilePic.image = image 
     }) 

Damit wird das Bild aus dem Speicher.

Verwandte Themen