티스토리 뷰
💻/Firebase
[Firebase-DB] Firebase 예제 프로젝트(modify) - Realtime DB에서 데이터 변경하기
eungding 2019. 5. 31. 04:19728x90
반응형
firebase-modify라는 feature브랜치를 만들어줍니다
프로젝트에서는 modify 대신 change라는 용어를 사용하고 있는데, change라는 네이밍을 사용하여 코딩해주겠습니다
FirebaseManager에 change함수를 추가해줍니다 수정할 메모의 키값과 새로운 메모를 받는 함수입니다
class func change(key: String, to memo: Memo) {
let rootRef = Database.database().reference()
let memoRef = rootRef.child("memos").child(key)
memoRef.setValue(memo.toDictionary())
}
수정을 누르면 이렇게 AlertViewController가 떠야하므로 textfield와 취소,확인 action을 붙인 alertcontroller를 만들고 present하는 로직을 changeAction에 추가해줍니다
(텍스트를 다 지우고 확인을 눌렀을 경우, 삭제를 해주게 했음)
func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let change = changeAction(at: indexPath)
return UISwipeActionsConfiguration(actions: [change])
}
private func changeAction(at indexPath: IndexPath) -> UIContextualAction {
let action = UIContextualAction(style: .normal, title: "수정") { [weak self] (action, view, completion) in
guard let `self` = self else { return }
let memo = self.viewModel.state.memos.value[indexPath.row]
let alertController = UIAlertController(title: "메모 수정", message: nil, preferredStyle: .alert)
alertController.addTextField(configurationHandler: { textField in
textField.text = memo.title
})
let cancleAction = UIAlertAction(title: "취소", style: .cancel, handler: { [weak self] _ in
self?.tableView.setEditing(false, animated: true)
})
let saveAction = UIAlertAction(title: "확인", style: .default, handler: { [weak self] _ in
if let textField = alertController.textFields?.first, let text = textField.text {
if text == "" {
self?.viewModel.action.deleteMemo.onNext(memo)
} else {
var newMemo = memo
newMemo.title = text
self?.viewModel.action.changeMemo.onNext(newMemo)
}
}
self?.tableView.setEditing(false, animated: true)
})
alertController.addAction(cancleAction)
alertController.addAction(saveAction)
self.present(alertController, animated: true, completion: nil)
}
action.backgroundColor = .orange
return action
}
위의 코드처럼 memo의 title을 바꿀 수 있게 해주기 위해 메모구조체의 title을 var로 지정해줍니다 -!
struct Memo {
let ID: String
var title: String
init(title: String) {
self.ID = ""
self.title = title
}
init?(dic: [String: Any], ID: String) {
guard let title = dic["title"] as? String else {
return nil
}
self.ID = ID
self.title = title
}
}
extension Memo {
func toDictionary() -> [String: Any] {
return ["title": title]
}
}
MemosViewModel에서 print를 빼고 change함수를 불러줍니다
struct MemosViewModel {
struct State {
var memos: BehaviorRelay<[Memo]> = BehaviorRelay.init(value: [])
}
struct Action {
let deleteMemo = PublishSubject<Memo>()
let changeMemo = PublishSubject<Memo>()
}
let state = State()
let action = Action()
private let bag = DisposeBag()
init() {
action.deleteMemo.subscribe(onNext: { memo in
FirebaseManager.delete(key: memo.ID)
}).disposed(by: bag)
action.changeMemo.subscribe(onNext: { memo in
FirebaseManager.change(key: memo.ID, to: memo)
}).disposed(by: bag)
FirebaseManager.fetchAll()
.bind(to: state.memos)
.disposed(by: bag)
}
}
돌려보면 수정기능이 잘 작동합니다 굿굿
반응형
'💻 > Firebase' 카테고리의 다른 글
[Firebase-Auth] Firebase 예제 프로젝트 - 회원가입 (0) | 2019.06.10 |
---|---|
[Firebase-Auth] Firebase 예제 프로젝트 - Auth를 사용하기 위해 준비하기 (0) | 2019.05.31 |
[Firebase-DB] Firebase 예제 프로젝트(delete) - Realtime DB에서 데이터 삭제하기 (2) | 2019.05.28 |
[Firebase-DB] Firebase 예제 프로젝트(fetch) - Realtime DB에서 데이터 가져오기 (3) | 2019.05.28 |
[Firebase-DB] Firebase 예제 프로젝트(insert) - Realtime DB에 데이터추가 (0) | 2019.05.28 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Python Type Hint
- Watch App for iOS App vs Watch App
- 구글 Geocoding API
- 장고 Custom Management Command
- Flutter 로딩
- Dart Factory
- flutter deep link
- Flutter getter setter
- Flutter Text Gradient
- Flutter Spacer
- github actions
- flutter 앱 출시
- SerializerMethodField
- 플러터 싱글톤
- DRF APIException
- Django Firebase Cloud Messaging
- Django FCM
- METAL
- PencilKit
- ribs
- flutter build mode
- Flutter Clipboard
- Sketch 누끼
- drf custom error
- cocoapod
- 플러터 얼럿
- ipad multitasking
- 장고 URL querystring
- flutter dynamic link
- Django Heroku Scheduler
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함