【Swift】Firebaseから取得するデータを調べてみた
保存してあるデータ
解説
Firebaseからデータを取得する時、
- どのような型(クラス)で取得されるのか?
- どんなメソッドがあるのか?
という疑問が湧かないだろうか?
udemyで初めてFirebaseを知り、自分で試してみて、挫折しかけた。
クエリはもちろん、海藻や階層のURLの扱い方すらちんぷんかんぷんだった。
中でも、取得するデータの扱いには一苦労。
なんとなーく使ってるあなたや僕のためにも、今回はFirebaseから取得するデータを調べてみた。
デバック結果
「snap」
「snap.children」
9
「snap.exists」
true
「snap.hasChildren」
true
「snapdata」
「item」
[["State": "ボロボロ", "UserID": "userID", "Date": "2019/02/01 12:17:54", "Title": "gfdsf", "DeliveryBurden": "着払い(受取人)", "Good": "0", "DeliveryDay": "5~6日", "UserName": "userName", "ItemID": "BfdQbs7ry", "DeliveryWay": "普通郵便", "Status": "display", "Category": "スポーツ"], ["?": "?"], ["?": "?"], ["?": "?"], ["?": "?"]]
ソースコード
func downloadImageData() { //FIrebaseのデータベースの参照URL let ref = Database.database().reference(fromURL: "https://bookshare-b78b4.firebaseio.com/") ref.child("Item").observe(.value) { (snap) in //階層下のデータを全部表示 print(snap) //階層下のデータのメモリ情報? print(snap.children) //階層下のデータ数 print(snap.childrenCount) //階層は存在する? print(snap.exists()) //階層下にデータはある? print(snap.hasChildren()) for item in snap.children { let snapdata = item as! DataSnapshot //1つのデータ print(snapdata) let item = snapdata.value as! [[String:String]] //snapdataを辞書型に変換 print(item) } } }
【Swift】Firebaseに画像を保存/画像を読み込む
完成図
「操作画面」
「保存されているデータ」
解説
Firebaseから画像を取得するには、2つの方法がある。
↓
- Storageの参照で取得
- FiirebaseUIで取得
(参考ページ)
前者は一般的な方法だがクロージャやエラーハンドリングのせいでコードが長くなりやすい。
今回は、たった3行でFirebaseから画像をダウンロードする方法を紹介する。
(ついでに画像を保存する方法も載せておく。)
(参考ページ)
「アップロード時のファイル名について」
画像やファイルをアップロードするとき、
- Storage.storage.reference(forURL: ストレージのURL).child(ファイル名(階層名))
で保存する。
もし好きなファイル名にしたいなら、
child(命名したい文字列)
ランダムに命名したいなら、
childByAutoId()
ソースコード
import UIKit import Firebase import FirebaseUI class FirebaseStorage: UIViewController { @IBOutlet weak var imageView: UIImageView! @IBAction func uploadImage(_ sender: Any) { uploadImage() } @IBAction func loadImage(_ sender: Any) { loadImage() } //Storageに画像を保存する func uploadImage() { //Storageの参照("Item"という名前で保存) let storageref = Storage.storage().reference(forURL: "gs://sample-e206e.appspot.com").child("Item") //画像 let image = UIImage(named: "猫.png") //imageをNSDataに変換 let data = image!.jpegData(compressionQuality: 1.0)! as NSData //Storageに保存 storageref.putData(data as Data, metadata: nil) { (data, error) in if error != nil { return } } self.dismiss(animated: true, completion: nil) } //取得したURLを基にStorageから画像を取得する func loadImage() { //StorageのURLを参照 let storageref = Storage.storage().reference(forURL: "gs://sample-e206e.appspot.com").child("Item") //画像をセット imageView.sd_setImage(with: storageref) } }
【Swift】アルバムとカメラを起動する
完成図
(アルバム画面はEvernoteのものです。)
解説
過去に同じ記事を書いたが、
というテキトーな記事だったのに、新たに書き直した。
※注意
下記のソースコードに加え、ナビゲーターエリア(左のメニュー)にある、
- info.plist
に変更を加える必要がある。
下記の2つ(Key)を追加し、それぞれを起動する際にアラートで表示したい文章(Value)を入力すればいい。
↓
- Privacy - Photo Library Usage Description //アルバム
- Privacy - Camera Usage Description //カメラ
ソースコード
import UIKit class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate{ @IBOutlet weak var imageView: UIImageView! @IBAction func button(_ sender: Any) { //アルバムを起動 changeImage() } func changeImage() { //アルバムを指定 //SourceType.camera:カメラを指定 //SourceType.photoLibrary:アルバムを指定 let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.photoLibrary //アルバムを立ち上げる if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){ // インスタンスの作成 let cameraPicker = UIImagePickerController() cameraPicker.sourceType = sourceType cameraPicker.delegate = self //アルバム画面を開く self.present(cameraPicker, animated: true, completion: nil) } } //アルバム画面で写真を選択した時 func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { //imageにアルバムで選択した画像が格納される if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { //ImageViewに表示 self.imageView.image = image //アルバム画面を閉じる self.dismiss(animated: true, completion: nil) } } }
【Swift】遷移時(modalのsegue)のアニメーションをコードで実装
解説
segueのアニメーションは以下。
- coverVertical:下から出現
- crossDisolve:フェードイン
- flipHorizontal:180度回転する(裏返る)
- partialCurl:ペラっとめくれる
遷移先をインスタンスで取得し、modalTransitionStyleプロパティに上記のいずれかを格納する。
ストーリーボード
ソースコード
import UIKit class segueAnimation: UIViewController { @IBAction func animation1(_ sender: Any) { transition(.coverVertical) } @IBAction func animation2(_ sender: Any) { transition(.crossDissolve) } @IBAction func animation3(_ sender: Any) { transition(.flipHorizontal) } @IBAction func animation4(_ sender: Any) { transition(.partialCurl) } //遷移 func transition(_ style:UIModalTransitionStyle) { let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main) let vc = storyboard.instantiateViewController(withIdentifier: "transition") vc.modalTransitionStyle = style self.present(vc, animated: true, completion: nil) } }