【Swift】Firebaseから取得するデータを調べてみた

 

 

保存してあるデータ

 

f:id:nekokichi_yos2:20190204113353p:plain

 

解説

 

Firebaseからデータを取得する時、

  • どのような型(クラス)で取得されるのか?
  • どんなメソッドがあるのか?

という疑問が湧かないだろうか?

 

udemyで初めてFirebaseを知り、自分で試してみて、挫折しかけた。

 

クエリはもちろん、海藻や階層のURLの扱い方すらちんぷんかんぷんだった。

 

中でも、取得するデータの扱いには一苦労。

 

なんとなーく使ってるあなたや僕のためにも、今回はFirebaseから取得するデータを調べてみた。

 

デバック結果

 

「snap」

f:id:nekokichi_yos2:20190204114525p:plain

f:id:nekokichi_yos2:20190204114541p:plain

f:id:nekokichi_yos2:20190204114600p:plain

f:id:nekokichi_yos2:20190204114611p:plain

 

 

「snap.children」

 9

 

「snap.exists」
true

 

「snap.hasChildren」
true


「snapdata」

f:id:nekokichi_yos2:20190204114636p:plain

 


「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に画像を保存/画像を読み込む

 

完成図

 

「操作画面」

f:id:nekokichi_yos2:20190204110834p:plain

 

「保存されているデータ」

f:id:nekokichi_yos2:20190204110838p:plain

 

解説

 

Firebaseから画像を取得するには、2つの方法がある。

  • Storageの参照で取得
  • FiirebaseUIで取得

(参考ページ)

 

firebase.google.com

 

前者は一般的な方法だがクロージャやエラーハンドリングのせいでコードが長くなりやすい。

 

今回は、たった3行でFirebaseから画像をダウンロードする方法を紹介する。
(ついでに画像を保存する方法も載せておく。)

 

(参考ページ)

firebase.google.com

 

「アップロード時のファイル名について」

 

画像やファイルをアップロードするとき、

  • 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】アルバムとカメラを起動する

 

完成図

 

f:id:nekokichi_yos2:20190204110314p:plainf:id:nekokichi_yos2:20190204110325p:plain

(アルバム画面はEvernoteのものです。)

 

解説

 

過去に同じ記事を書いたが、

というテキトーな記事だったのに、新たに書き直した。

 

※注意

下記のソースコードに加え、ナビゲーターエリア(左のメニュー)にある、

  • info.plist

に変更を加える必要がある。

 

下記の2つ(Key)を追加し、それぞれを起動する際にアラートで表示したい文章(Value)を入力すればいい。

  • Privacy - Photo Library Usage Description //アルバム
  • Privacy - Camera Usage Description //カメラ

 

f:id:nekokichi_yos2:20190204110105p:plain

 

 

ソースコード

 

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プロパティに上記のいずれかを格納する。

 

ストーリーボード

 

f:id:nekokichi_yos2:20190105202831p:plain


 

 

ソースコード

 

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)
    }

}