2016-05-05 6 views
0

写真のようなfirebase構造を持っていますenter image description herefirebaseからイメージを取得していますか?

私はアップロードした画像ファイルを取り出したいと思います。 base64Stringをデコードして表示します。すべてのユーザーは投稿を作成でき、ファイアベースに送信される情報には説明などがあり、画像もあります。今私はこのコードを取得しようとしましたが、何も動作しませんでした。

var REF_LIST = Firebase(url: "\(URL_BASE)/listItems") 

REF_LIST.observeEventType(FEventType.Value, withBlock: { snapshot in 
let image = snapshot.value.objectForKey("images") as! String 

しかし、これはすでに私にその行には何のエラーも与えていないので、私は解読できませんでした。私はなぜそれが私に無限のエラーを与えているのか理解していると思います、firebaseのlistItemsに画像がありません、最初に一意のIDと画像のスペックを持っています。 ID?

UPDATE:

import UIKit 
import FBSDKLoginKit 
import Alamofire 
import Firebase 

class ListVC: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! 

    var lists = [List]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = self 
     tableView.dataSource = self 

     dispatch_async(backgroundQueue, { 
     self.initObservers() 
     }) 

    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     self.tableView.reloadData() 

    } 

    func initObservers() { 

     LoadingOverlay.shared.showOverlay(self.view) 

      DataService.ds.REF_LISTS.observeEventType(.Value, withBlock: { snapshot in 
       print(snapshot.value) 

       self.lists = [] 

       if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] { 


        for snap in snapshots { 
         print("SNAP: \(snap)") 

         if let listDict = snap.value as? Dictionary<String, AnyObject> { 
          let key = snap.key 
          let list = List(listKey: key, dictionary: listDict) 
          self.lists.insert(list, atIndex:0) 
         } 
        } 
       } 

       self.tableView.reloadData() 
       LoadingOverlay.shared.hideOverlayView() 

      }) 
    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return lists.count 
    } 

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

     if let cell = tableView.dequeueReusableCellWithIdentifier("ListCell") as? ListCell { 
      let list = self.lists[indexPath.row] 

      cell.request?.cancel() 

      cell.configureCell(list) 

      return cell 

     } else { 

      return ListCell() 
     } 

    } 

} 

addController firebaseにデータをポスト:firebaseからデータを受信するかを tableViewController

import UIKit 
import Firebase 
import Alamofire 
import FBSDKCoreKit 

class AddVC: UIViewController, UITextFieldDelegate, UITextViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    @IBOutlet weak var addTitle: UITextField! 
    @IBOutlet weak var addDescription: UITextView! 
    @IBOutlet weak var addLocation: UITextField! 
    @IBOutlet weak var placeholderLbl: UILabel! 
    @IBOutlet weak var freeSwitch: UISwitch! 
    @IBOutlet weak var tradeSwitch: UISwitch! 
    @IBOutlet weak var imageSelectorImg: UIImageView! 
    @IBOutlet weak var overlayView: UIView! 

    var currentUsername = "" 
    var imageSelected = false 
    var imagePicker: UIImagePickerController! 
    var base64String: NSString = "" 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     addTitle.delegate = self 
     addDescription.delegate = self 
     addLocation.delegate = self 

     imagePicker = UIImagePickerController() 
     imagePicker.delegate = self 


     getCurrentUser() 
     hideKeyboardWhenTappedAround() 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     addTitle.text = "" 
     addDescription.text = "" 
     addLocation.text = "" 
     freeSwitch.setOn(false, animated: false) 
     tradeSwitch.setOn(false, animated: false) 
     placeholderLbl.hidden = false 
    } 

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

    func getCurrentUser() { 
     DataService.ds.REF_USER_CURRENT.observeEventType(FEventType.Value, withBlock: { snapshot in 

      let currentUser = snapshot.value.objectForKey("username") as! String 

      print("Username: \(currentUser)") 
      self.currentUsername = currentUser }, withCancelBlock: { error in 
       print(error.description) 
     }) 
    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 
     imagePicker.dismissViewControllerAnimated(true, completion: nil) 
     imageSelectorImg.image = image 
     dispatch_async(backgroundQueue, { 
     let uploadImage = image 
     let imageData = UIImageJPEGRepresentation(uploadImage, 0.5) 
     self.base64String = imageData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 
     }) 

     imageSelected = true 
    } 

    @IBAction func selectImage(sender: UITapGestureRecognizer) { 
     presentViewController(imagePicker, animated: true, completion: nil) 
    } 


    func postToFirebase() { 

     // LoadingOverlay.shared.showOverlay(self.overlayView) 
     var post: Dictionary<String, AnyObject> = ["username": self.currentUsername, "description": self.addDescription.text!, "title": self.addTitle.text!, "location": self.addLocation.text!, "images": self.base64String] 

     if self.freeSwitch.on && self.tradeSwitch.on { 
      post["tradeOption"] = "Gratis/Te ruil" 
     } else if self.freeSwitch.on { 
      post["tradeOption"] = "Gratis" 
     } else if self.tradeSwitch.on { 
      post["tradeOption"] = "Te ruil" 
     } 

     let firebasePost = DataService.ds.REF_LISTS.childByAutoId() 
     firebasePost.setValue(post) 

    } 


    @IBAction func postListItem(sender: AnyObject) { 

     if let addTitle = addTitle.text where addTitle != "", let addDescription = addDescription.text where addDescription != "", let addLocation = addLocation.text where addLocation != "" { 

      dispatch_async(backgroundQueue, { 
       self.postToFirebase() 

       dispatch_async(dispatch_get_main_queue(), {() -> Void in 

        let storyboard = UIStoryboard(name: "Main", bundle: nil) 
        let listVC = storyboard.instantiateViewControllerWithIdentifier("TBC") as! UITabBarController 
        listVC.selectedIndex = 1 
        self.presentViewController(listVC, animated: false, completion: nil) 
       }) 
      }) 
     } 
    } 

    func textViewDidBeginEditing(textView: UITextView) { 
     placeholderLbl.hidden = true 
    } 

    func textViewDidEndEditing(textView: UITextView) { 
     if textView.text == "" { 
      placeholderLbl.hidden = false 
     } 
    } 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 

     return true 
    } 

} 

とセルを構成するための迅速なファイル:

import UIKit 
import Alamofire 
import Firebase 

class ListCell: UITableViewCell { 

    @IBOutlet weak var listImg: UIImageView! 
    @IBOutlet weak var listTitle: UILabel! 
    @IBOutlet weak var listTradeOption: UILabel! 
    @IBOutlet weak var listLocation: UILabel! 
    @IBOutlet weak var headImg: UIImageView! 

    var list: List! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    func retrieveImages() { 
    DataService.ds.REF_LISTS.observeEventType(FEventType.Value, withBlock: { snapshot in 

     if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] { 

      for snap in snapshots { 
       let image = snap.value.objectForKey("images") as! String 

       let decodedData = NSData(base64EncodedString: image, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) 
       let decodedImage = UIImage(data: decodedData!) 
       self.headImg.image = decodedImage 

      } 
     } 

    }) 
} 

func configureCell(list: List) { 

    self.list = list 
    self.listTitle.text = list.listTitle 
    self.listTradeOption.text = list.listTradeOption 
    self.listLocation.text = list.listLocation 
    retrieveImages() 

} 

}も

リストモデルファイル:私はまた、私はこのコードでユニークなIDでユーザーを作成DataServicefile、持って

import Foundation 
import Firebase 

class List { 
    private var _listTitle: String! 
    private var _listDescription: String! 
    private var _listTradeOption: String! 
    private var _listLocation: String! 
    private var _listImageURL: String? 
    private var _listKey: String! 
    private var _listRef: Firebase! 

    var listTitle: String? { 
     return _listTitle 
    } 

    var listDescription: String? { 
     return _listDescription 
    } 

    var listTradeOption: String? { 
     return _listTradeOption 
    } 

    var listLocation: String? { 
     return _listLocation 
    } 

    var listKey: String { 
     return _listKey 
    } 

    var listImageURL: String? { 
     return _listImageURL 
    } 

    init(title: String, description: String, tradeOption: String, location: String, listImageURL: String?) { 
     self._listTitle = title 
     self._listDescription = description 
     self._listTradeOption = tradeOption 
     self._listLocation = location 
     self._listImageURL = listImageURL 
    } 

    init(listKey: String, dictionary: Dictionary<String, AnyObject>) { 
     self._listKey = listKey 

     if let title = dictionary ["title"] as? String { 
      self._listTitle = title 
     } 

     if let desc = dictionary ["description"] as? String { 
      self._listDescription = desc 
     } 

     if let trade = dictionary ["tradeOption"] as? String { 
      self._listTradeOption = trade 
     } 

     if let loc = dictionary ["location"] as? String { 
      self._listLocation = loc 
     } 

     if let imgUrl = dictionary["images"] as? String { 
      self._listImageURL = imgUrl 
     } 

     self._listRef = DataService.ds.REF_LISTS.childByAppendingPath(self._listKey) 
    } 

} 

var REF_USER_CURRENT: Firebase { 
     let uid = NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID) as! String 
     let user = Firebase(url: "\(REF_BASE)").childByAppendingPath("users").childByAppendingPath(uid) 
     return user! 
    } 

    func createFirebaseUser(uid: String, user: Dictionary<String, String>) { 
     REF_USERS.childByAppendingPath(uid).setValue(user) 
    } 

が、私はそれは知っていますたくさんありますが、おそらく最も効果的な方法です。

答えて

0

リストセルで編集してください

var imageURL = String() 


func retrieveImages() { 

let decodedData = NSData(base64EncodedString: imageURL, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) 
let decodedImage = UIImage(data: decodedData!) 
self.headImg.image = decodedImage 

} 

func configureCell(list: List) { 

self.list = list 
self.listTitle.text = list.listTitle 
self.listTradeOption.text = list.listTradeOption 
self.listLocation.text = list.listLocation 
self.imageURL = list.listImageURL //you already had the image url for that specific cell 

retrieveImages() 

} 
+0

私は本当にあなたが言っていることを理解していない...私はこれにかなり新しいです:p私はこの場合に必要な.swiftファイルで私の質問を更新します。多分あなたはそれを私に説明することができますか? –

+0

確かに、私はもう一度見て、あなたを助けようとします – valencieu

+0

私は質問を更新:)すでにthx! –

関連する問題