Swift隨手紀錄Day25-Fetch Data Form Firebase Database
防止偷懶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的內容可能還會儲存在裡面
