💻/Firebase
[Firebase-DB] Firebase 예제 프로젝트(modify) - Realtime DB에서 데이터 변경하기
eungding
2019. 5. 31. 04:19
728x90
반응형
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)
}
}
돌려보면 수정기능이 잘 작동합니다 굿굿
반응형