[TIL] 2021.04.01

승아·2021년 4월 1일
0

👩🏻‍💻 오늘 공부한 내용

Fireabase 사용하기 ( Firebase docs )

1. FIRDatabaseReference 가져오기

  • 데이터베이스에서 데이터를 읽거나 쓰려면 FIRDatabaseReference의 인스턴스가 필요합니다.

✅⠀Firebase docs

var ref: DatabaseReference!

ref = Database.database().reference()

✅⠀나의 코드

// 저는 하위에 Rank위치를 만들었습니다.
let db =  Database.database().reference().child("Rank")

2. 데이터 쓰기

  • setValue() : 지정된 참조에 데이터를 저장하고 해당 경로의 기존 데이터를 모두 바꾼다.
  • NSString, NSNumber, NSDictionary, NSArray와 같은 유형을 전달함.

✅⠀Firebase docs

// 노드의 범위를 크게 설정할 시 해당 노드의 하위 노드를 포함하여 모든 데이터를 덮어쓰니 주의하자.
// 범위 크게
self.ref.child("users").child(user.uid).setValue(["username": username])
// 범위 작게
self.ref.child("users/\(user.uid)/username").setValue(username)

✅⠀나의 코드

db.child(date).setValue(["rank":rank])

3. 데이터 읽기

✅⠀Firebase docs

  • 값 이벤트를 수신 대기하여 데이터 읽기
    - 리스너가 연결될 때 한 번 호출된 후 하위 요소를 포함하여 데이터가 변경될때마다 다시 호출된다.
    - 하위 데이터를 포함하여 해당 위치의 모든 데이터를 포함하는 snapshot이 이벤트 콜백에 전달됩니다.
    - 데이터가 없으면 스냅샷은 exists()를 호출할 때 false를 반환하고 value 속성을 읽을 때 nil을 반환합니다.
refHandle = postRef.observe(DataEventType.value, with: { (snapshot) in
  let postDict = snapshot.value as? [String : AnyObject] ?? [:]
  // ...
})
  • getData()를 사용하여 데이터 한 번 읽기
    - 데이터가 한 번만 필요한 경우 getData()를 사용하여 데이터베이스에서 데이터의 스냅샷을 가져올 수 있다.
self.ref.child("users/\(user.uid)/username").getData { (error, snapshot) in
    if let error = error {
        print("Error getting data \(error)")
    }
    else if snapshot.exists() {
        print("Got data \(snapshot.value!)")
    }
    else {
        print("No data available")
    }
}
  • 관찰자를 사용하여 데이터 한 번 읽기
    - 서버의 업데이트된 값을 확인하는 대신 로컬 캐시의 값을 즉시 반환하고 싶을 때 사용.
    - 한 번 로드된 후 자주 변경되지 않거나 능동적으로 수신 대기할 필요가 없는 데이터에 유용. 예를 들어 사용자의 프로필 같은 경우
let userID = Auth.auth().currentUser?.uid
ref.child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
  // Get user value
  let value = snapshot.value as? NSDictionary
  let username = value?["username"] as? String ?? ""
  let user = User(username: username)

  // ...
  }) { (error) in
    print(error.localizedDescription)
}

✅⠀나의 코드

db.observeSingleEvent(of:.value) { (snapshot) in
   guard let rankValue = snapshot.value as? [String: Any] else {
     return
  }
}

4. 데이터 업데이트

  • updateChildValues : 다른 하위 노드를 덮어쓰지 않고 특정 하위 노드에 동시에 쓰려면 사용

✅⠀Firebase docs

guard let key = ref.child("posts").childByAutoId().key else { return }
let post = ["uid": userID,
            "author": username,
            "title": title,
            "body": body]
let childUpdates = ["/posts/\(key)": post,
                    "/user-posts/\(userID)/\(key)/": post]
ref.updateChildValues(childUpdates)

✅⠀나의 코드

db.child(String(wish.timestamp)).updateChildValues([ "timestamp" : wish.timestamp])

5. 데이터 삭제

  • removeValue 사용
  • setValue, updateChildValues 등 으로 nil을 저장하여 삭제할 수 도 있다.

✅⠀나의 코드

db.child(String(wish.timestamp)).removeValue()

alert에 textfield 추가( 참고 사이트 )

  1. alert.addTextField() : textField 추가
  2. alert.textFields?[0].text로 text 가져오기
let alert = UIAlertController(title: nil, message: "랭킹에 추가 할 이름을 입력하세요.", preferredStyle: .alert)
let ok = UIAlertAction(title: "확인", style: .default){ (ok) in
    if alert.textFields != nil{
        self.rankViewModel.addRank( alert.textFields?[0].text ?? "-", self.timeCount, self.todayGameViewModel.todayGame.today)
        self.dismiss(animated: true, completion: nil)
    }
}
let cancle = UIAlertAction(title: "취소", style: .cancel){ (cancle) in
    self.dismiss(animated: true, completion: nil)
}

alert.addAction(cancle)
alert.addAction(ok)
alert.addTextField()

present(alert, animated: true, completion: nil)

Xcdoe Storyboard 검은색 오류 ( 참고 사이트 )

failed to launch): failed to launch ibagent-ios via coresimulator spawn

  1. Finder -> 응용프로그램 -> Xcdoe -> 정보 가져오기
  2. Rosetta를 사용하여 열기 체크 해제
  3. clean project ( cmd + shitf + k )
  4. xcode 다시 열기

0개의 댓글