Swift隨手紀錄Day25-Fetch Data Form Firebase Database

Darren
Swift

防止偷懶Day25 在完成註冊手續之後 接下來就是讓使用者可以新增隊伍然後在HomeController會去Fetch使用者新增過的隊伍資料 然後用tableView顯示出來

防止偷懶Day25

在完成註冊手續之後

接下來就是讓使用者可以新增隊伍然後在HomeController會去Fetch使用者新增過的隊伍資料

然後用tableView顯示出來

第一步先來看看目前想到在Database儲存資料的形式

User的地方是昨天處理好的部分,當使用者註冊時會將資料儲存在一個uid底下

包含了使用者的email跟name這兩項資訊

而今天要讓使用者在新增球隊資訊之後

會在Team底下創造一個tid,裡面會儲存球隊名稱的字串TeamName

以及這個team屬於哪個使用者的uid

開工第一步先來把該有的工具準備好

在Model裡面新增一個定義User這個class的new file

命名成User.swift

然後修改一下Team.swift這個class的內容

內容如下

Team.swift

import

class
Team
NSObject
    var
String
    var
String
}

User.swift

import

class
User
NSObject
    var
String
    var
String
    var
String
}

然後來到要處理資料的HomeController

一樣先看看程式碼再來一步一步處理

import
import

class
HomeController
UITableViewController
    
    let
=
"cellId"
    var
=
Team
    var
=
User
    
    override
var
Bool
        return
false
    }
    
    override
func
viewDidLoad
        super
        let
=
UIBarButtonItem
"New Team"
self
#selector
        navigationItem.rightBarButtonItem =
        
        let
=
UIBarButtonItem
"Logout"
self
#selector
        navigationItem.leftBarButtonItem =
        checkUserIsLogin()
    }
    
    func
fetchTeam
        FIRDatabase
"Team"
in
            if
let
=
as?
AnyObject
                let
=
Team
                team.setValuesForKeys(dictionary)
                if
==
self
                    self
                }

                DispatchQueue
                    self
                }
                print
as
Any
as
Any
            }
        }, withCancel: nil
    }
    
    func
checkUserIsLogin
        if
FIRAuth
?
?
==
nil
            perform(#selector
nil
0
        } else
            fetchUserSetNavBarTitle()
        }
    }
    
    func
fetchUserSetNavBarTitle
        guard
let
=
FIRAuth
?
?
else
            return
        }
        FIRDatabase
"User"
in
            print
            if
let
=
as?
Any
                self
=
                self
=
"name"
as?
String
                self
            }
        }, withCancel: nil
    }
    
    func
handleLogout
        
        do
            try
FIRAuth
?
        } catch
let
            print
        }
        self
        let
=
LoginController
        loginController.homeController =
self
        present(loginController, animated: true
nil
    }
    
    func
toSetNewTeamController
        let
=
UIAlertController
"Add New Team"
""
        
        let
=
UIAlertAction
"OK"
            alert -> Void
in
            
            let
=
!
0
as
UITextField
            let
=
SetNewTeamController
            
            if
!
!=
""
                controller.teamTitle =
!
                let
=
self
                let
=
FIRDatabase
"Team"
                let
=
                let
Any
=
"TeamName"
!
"uid"
as
Any
                teamRef.updateChildValues(value)
                self
UINavigationController
true
nil
            } else
                return
            }
            
        })
        
        let
=
UIAlertAction
"Cancel"
            (action : UIAlertAction
Void
in
        })
        
        alertController.addTextField { (textField : UITextField
Void
in
            textField.placeholder =
"Enter Team Name"
        }
        
        alertController.addAction(saveAction)
        alertController.addAction(cancelAction)
        
        self
true
nil
        
    }
    
    override
func
tableView
_
tableView
UITableView
numberOfRowsInSection
section
Int
Int
        return
    }
    
    override
func
tableView
_
tableView
UITableView
cellForRowAt
indexPath
IndexPath
UITableViewCell
        let
=
UITableViewCell
        
        cell.textLabel?
=
        
        return
    }
    
    override
func
tableView
_
tableView
UITableView
didSelectRowAt
indexPath
IndexPath
        let
=
SetNewTeamController
        controller.teamTitle =
        present(UINavigationController
true
nil
    }
    
}

第一步當然是實作讓使用者新增資料到Database上

之前在toSetNewTeamController這個function裡面實作了當使用者點擊右上方的Add Member時

會跳出一個AlertController讓使用者輸入新增球隊的名稱

在第87~91行我們讓使用者把現有的uid跟新增的teamName儲存到Database上的Team節點下

並自動產生一個id當子樹,不過這裡的uid怎麼來的?

當然我們就需要剛剛準備好的工具拉

第7, 8行實作一個teams來儲存Fetch到的Team內容

以及一個user來儲存Fetch到的User內容

接下來在fetchUserSetNavBarTitle這個function裡面第56行儲存使用者的uid

這樣就有自己的uid可以使用拉

然後就來實作Fetch隊伍資料的fetchTeam這個function

首先,fetchTeam會在fetchUserSetNavBarTitle拿到使用者的資訊之後執行

以確保自己儲存的uid不會是空值

fetchTeam執行時會去Database觀察Team這個子樹下的資料

如果裡面的uid跟現在使用者的uid是一樣的

就代表這隻Team是這個使用者所創建的

那就把這筆資料儲存到前面創好的teams裡面

最後重新整理現在的tableView內容

p.s.這裡要記得UI必須在主線程裡更新

但我們還沒處理tableView的內容

所以就修改一下numberOfRowsInSection回傳儲存的隊伍數量teams.count

以及cellForRowAt讓cell的文字顯示隊伍名稱teamName

還有didSelectRowAt所傳送的teamTitle

最後要記得處理當使用者登出時要把teams的內容移除

不然登入其他帳號時teams的內容可能還會儲存在裡面

Thanks for reading!

I hope you found this article helpful. Feel free to share your thoughts or questions.