๋ฌธ์ ์ํฉ
ํ๋ก์ฐ ํ๋ก์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋์๋ค.
์ ๋ฒ๊ณผ ๊ฐ์ ๊ตฌ๋ ํ๊ธฐ๊ฐ ๋ฐ์์ด ์๋๋ ์ด์์ด๋ค. ํ์ง๋ง ์ํฉ์ด ์กฐ๊ธ ๋ค๋ฅด๋ค..!
์ ๋ฒ ์ด์์ ์์ธ์
onAppear์ onDisappear์ ์๋ชป๋ ํธ์ถ ์์๋ก ๊ตฌ๋ ํ๊ธฐ ๋ฒํผ์ ๋๋ ์๋, ๋ทฐ๋ฅผ ๋๊ฐ๋ค ๋ค์ด์ค๋ฉด ๋ฐ์์ด ๋์ง ์์๋ ๊ฒ์ด์๋๋ฐ
์ด๋ฒ์๋ ๋น์ทํ ์ํฉ์ด์ง๋ง ์กฐ๊ธ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ค.
์ด๋ฒ ์ด์์ ์์ธ์ ForEach ์๋ค. ๋ฌธ์ ๋ ์๋์ง๋ง ,, ๋ฌธ์ ๊ฐ ๋๋ ์ฝ๋๋ฅผ ํ๋ฒ ๋ณด๋ฉด
// 1๋ฒ ์ฝ๋
ForEach(0..<searchedUser.count ,id: \.self) { i in
NavigationLink {
UserDetailView(userVM: userVM, magazineVM: magazineVM, user: searchedUser[i])
} label: { ...
์์ ์ฝ๋์์ searchedUser๊ฐ ์ด๋์ ๋์จ๊ฑฐ๋ ํ๋ฉด
๊ฒ์ ๋ทฐ์์ ์ ์ ๋ฅผ ๊ฒ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฒ์๋ ์ ์ ๋ค์ด searchedUser ๋ฐฐ์ด์ ์ ์ฅ๋๊ฒ ๋๋ค.
// 2๋ฒ ์ฝ๋
var searchedUser: [UserDocument] {
var arr = userVM.users.filter {
ignoreSpaces(in: $0.fields.nickName.stringValue)
.localizedCaseInsensitiveContains(ignoreSpaces(in: self.searchWord)) ||
ignoreSpaces(in: $0.fields.introduce.stringValue)
.localizedCaseInsensitiveContains(ignoreSpaces(in: self.searchWord))
}
return Array(arr)
}
๊ทผ๋ฐ ์ด๊ฒ ์ ๋ฌธ์ ๊ฐ ๋ ๊น ?
์์ ์ฝ๋์ฒ๋ผ UserDetailViewd์ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๊ณ
UserDetailView๋ก ๋ทฐ๊ฐ ๋์ด๊ฐ์๋, ๊ตฌ๋ ํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด
// 3๋ฒ ์ฝ๋
userVM.updateCurrentUserArray(type: "following", arr: currentUserFollowing, docID: currentUser.id.stringValue)
userVM.updateCurrentUserArray(type: "follower", arr: magazineUserFollower, docID: userData.fields.id.stringValue)
์ด์ ๊ฐ์ด userVM์ updateCurrentUserArray๋ฅผ ํตํด userVM ์ @Published ๋ณ์๊ฐ ์ ๋ฐ์ดํธ ๋๋ฉด์ ๋ทฐ๊ฐ ์๋ก ๊ทธ๋ ค์ง๊ฒ ๋๋ค.
๋ฐ์ ์ฝ๋๋ ๊ตฌ๋ ์ ์๋ฅผ ๋ณด์ฌ์ฃผ๋ Text ์ด๋ค. ์ด๋ถ๋ถ์์ user๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๊ณ ์์ง ์์๋ค.
// 4๋ฒ ์ฝ๋
Text("\(user.fields.follower.arrayValue.values.count == 1 ? 0 : userData.fields.follower.arrayValue.values.count-1)")
๋ถ๋ช userVM์ด ์ ๋ฐ์ดํธ ๋์๋๋ฐ ์ ๋ฐ์์ด ์๋๊ณ ์๋๊ฒ์ผ๊น?
user๋ ์๊น 1๋ฒ ์ฝ๋์์ user ํ๋ผ๋ฏธํฐ์ ๋๊ฒจ์ค searchedUser[i]๋ userVM์์ ํ์๋์ด ๋์จ ์น๊ตฌ์ธ๋ฐ…
useVM ์ด ์ ๋ฐ์ดํธ ๋๋ฉด user๋ ํจ๊ป update ๋์ด์ผ ํ๋๊ฒ์๋๊ฐ… ?
์์ธ
์ ๋ฒ ์ผ์ด์ค์ ๋ฌด์์ด ๋ค๋ฅผ๊น ์๊ฐํด๋ณด๋
์ด๋ฒ ์ผ์ด์ค์์๋ ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ForEach ๋ฅผ ์ฌ์ฉํด ๋ฆฌ์คํธ๋ก ๋ณด์ฌ์ฃผ๊ณ ๊ฑฐ๊ธฐ์ ๋ํ ์ผ๋ทฐ๋ก ๋์ด๊ฐ๊ณ ์์์ต๋๋ค.
์ํ…!!!
1๋ฒ ์ฝ๋์ ForEach๋ฅผ ๋ค์ํ๋ฒ ์ดํด๋ณด๋
ForEach(0..<searchedUser.count ,id: \.self)
searchedUser ๊ฐ ๋ญ๋ผ๊ตฌ์ฉ? userVM์ users ํ๋กํผํฐ์์ ํํฐ๋ง์ ๊ฑฐ์น ์นญ๊ตฌ์ ๋๋ค.
๋ด๊ฐ ๊ตฌ๋ ํ๊ธฐ๋ฅผ ๋๋ฅด๋ฉด userVM์ @Published users ํ๋กํผํฐ๊ฐ ์ ๋ฐ์ดํธ๋์ฃ ! ๊ทธ๋ผ ๊ฒ์ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ๋ทฐ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๊ฒ ๋๊ฒ ์ฃ !
๊ทธ๋ฐ๋ฐ ์ง๊ธ ํ์ฌ ๋ด๊ฐ ๊ตฌ๋ ํ๊ธฐ๋ฅผ ๋๋ฅธ ๋ทฐ์์๋ user ๊ฐ ๊ทธ๋๋ก์ธ ๊ฒ๋๋ค ใ ใ
์๋ํ๋ฉด..!
ForEach๋ ๋ฆฌ์คํธ๋ทฐ๋ฅผ ์์ ์๋กญ๊ฒ ๊ทธ๋ฆฌ๊ธฐ ๋๋ฌธ์ด์ฃ !
๊ทธ๋์ ๊ธฐ์กด์ ์๊ธด userDetailView๋ ๊ทธ๋๋ก ์ ๋ฐ์ดํธ๊ฐ ๋์ง ์์ ์ํ๋ก ๋จ๊ฒจ์ง๊ณ ,,
ForEach๋ก ์๋ก์ด ๋ทฐ๋ค์ ๋ค์ ์ ๋ฐ์ดํธ ํด์ ๋ง๋๋ ๊ฒ์ ๋๋ค..๐ณ
๊ทธ๋์ userVM๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋์ด๋, userDetailView์์ 4๋ฒ์ฝ๋์ user๋ ์ ๋ฐ์ดํธ๊ฐ ๋์ง ์์ ์ํฉ์ด์๋ ๊ฒ์ด์๋ ๊ฒ์ ๋๋ค..๐ฅน
๊ทธ๋์ ์ด๋ป๊ฒ ํด์ค๊ผฌ ํ๋ ,,
userVM ์ด ์ ๋ฐ์ดํธ๋๋ฉด ,, ForEach๊ฐ ์๋ก ๋์๊ฐ๊ฑฐ๊ณ ,,, ๊ทธ๋ผ ใ ใ ์ด๋ป๊ฒ ํด์ผ๋… ๐ซ
ํด๊ฒฐ๋ฐฉ๋ฒ
ํ์ฌ ๋ฌธ์ ๋ ForEach ๊ฐ ์๋ก ๋ทฐ๋ฅผ ๋ง๋ค๋ฉด์ ์ ์ ์์ฑ๋ userDetailView๊ฐ ์๋๋ง๋ก ๋๊ฐ๋ฆฌ๋์ด์
user๊ฐ ์ ๋ฐ์ดํธ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ ๋ฐ์ดํธ๋ ํ๋ก์ ์ ๊ฐ ๋ฐ์์ด ์๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ์๊ฐํ ๋ก์ง์ ์ง๊ธ ๋๊ฐ๋ฆฌ๋ userDetailView์์
userVM.users์ ๋ณ๊ฒฝ์ ๊ฐ์งํด์ user ๊ฐ์ ๋ทฐ ๋ด์์ ๊ฐ์ ์ ๋ฐ์ดํธ ์์ผ์ฃผ๋๊ฒ๋๋ค.
๋ฌด์จ ๋ง์ธ์ง ์ฝ๋๋ก ํ๋ฒ ๋ณด์ฌ๋๋ฆด๊ฒ์!
๋จผ์ ์ ์ผ ๋จผ์ ํด๊ฒฐํด์ผํ๋ ์น๊ตฌ.. user๋ฅผ ์ ๋ฐ์ดํธ ์์ผ์ฃผ์ด์ผํฉ๋๋ค.
๋จผ์ @State userData ๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
let user: UserDocument
@State var userData: UserDocument?
๊ทธ ๋ค์ onAppear ๋ฉ์๋์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์จ user ๋ณ์๋ฅผ userData ์ ๋ฃ์ด์ค๋๋ค.
.onAppear {
self.userData = user
}
๊ทธ ๋ค์ userViewModel ์ users ํ๋กํผํฐ์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ธฐ ์ํด
๋๋ง์ task(id:) !!!!!! ๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
task(id:)
๋จผ์ task ๋ฉ์๋์ ๋ํด ์ค๋ช ๋๋ฆฌ์๋ฉด
SwiftUI ์์ task(id:) ๋ฉ์๋๋ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋์ธ๋ฐ์ !
์ด ๋ฉ์๋๋ View ํ๋กํ ์ฝ์ ์ผ๋ถ์ด๊ณ , SwiftUI ๋ทฐ์ ๋ณธ๋ฌธ์ ํฌํจ๋ ์ ์์ต๋๋ค.
task(id:) ๋ฉ์๋๋ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ์์ ์ ์คํํ๊ณ , ์์ ์ด ์๋ฃ๋๋ฉด ๋ทฐ์ ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค!
task(id:) ๋ฉ์๋๋ ๋ ๊ฐ์ง ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ต๋๋ค.
์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์์ ์ ์ ์ํ๋ ํด๋ก์ ์ด๊ณ , ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ์์ ์ ID์ ๋๋ค. (์์ ์ ID๋ ์์ ์ด ์คํ๋ ๋๋ง๋ค ๋ณ๊ฒฝ๋๋ ๊ฐ์ ๋๋ค. )
์ด๋ฅผ ํตํด SwiftUI๊ฐ ์์ ์ ์งํ ์ํ๋ฅผ ์ถ์ ํ๊ณ ๋ณ๊ฒฝ์ ๊ฐ์งํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋น๋๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ทฐ์ ํ์ํ๋ ๊ฒฝ์ฐ task(id:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ์ด ์๋ฃ๋๋ฉด ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ๋์ด ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ํ์๋ฉ๋๋ค ๐
์ด๋ ๊ฒ task(id:) ๋ฅผ ์ฌ์ฉํด์ userVM.users์ ๋ณํ๋ฅผ ๊ฐ์งํด์ ์๋ก์ด userData๋ฅผ ์ ๋ฐ์ดํธ ์์ผ์ฃผ๋๊ฒ๋๋ค. !
.task(id: userVM.users) {
if let user = userVM.users.first(where: {
$0.fields.id.stringValue == user.fields.id.stringValue
}) {
self.userData = user
}
}
์ด๋ ๊ฒ task(id: )๋ฅผ ์ฌ์ฉํด์ userVM.users ์ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด
์ ๋ฐ์ดํธ ๋ userVM์ users์์ ์๋ก ํํฐ๋ง์ ๊ฑฐ์ณ ์ ๋ฐ์ดํธ ๋ ์ ์ ์ ๋ณด( user ) ๋ฅผ userData ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋๊ฑฐ์ฃ !
userData๋ @State ๋ณ์์ด๊ธฐ ๋๋ฌธ์
userData๊ฐ ์ ๋ฐ์ด๋ ๋๋ ๋์์ ๊ตฌ๋ ์ ์๊ฐ ์ ๋ฐ์ดํธ ๋ ์ ์ ์ ํ๋ก์ ์๋ฅผ ๋ฐ์ํด ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค !!!
Text("\(userData.fields.follower.arrayValue.values.count == 1 ? 0 : userData.fields.follower.arrayValue.values.count-1)")
์๋ก ์๊ฒ๋ ๋ฉ์๋
- task(id:) : ๋ด๊ฐ ์๊ณ ์ถ์ ํ๋กํผํฐ์ ๋ณ๊ฒฝ์ ๊ฐ์งํด์ action์ ์ํํ๊ณ ์ถ์๋ ์ฃผ๋ก ์ฌ์ฉํ๋ฉด ์์ฅฌ ์ ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค.
๋๋์
์ง์ง ์ง์ง ๋ด๊ฐ ๊ฒช์๋ ํธ๋ฌ๋ธ ์ด์์ค์ ์ ์ผ ๋ชจ๋ฅด๊ฒ ๊ณ , ์ด๋ ค์ ๋ ๋ฌธ์ ์๋ค.
ํ๋ก์ ์๊ฐ ๋ฐ๋ก ๋ฐ์์๋๋๊ฒ์ด ํฐ ๋ฌธ์ ์ผ๊น ,, ์๊ฐํด๋ณด์์ง๋ง ์ฑ๊ฒฉ์ ์๊ณ ์น๋๊ฑฐ ์ ๋์๋ ๋ฌด์ ๊ฑด ๊ณ ์ณ์ผํด …..
๋ค๋ฅธ ๋ถ์ด ์์ ํ๋ ์ฝ๋์์ ๊ธฐ๋ฅ ์ถ๊ฐ๋ก ์ธํด ํ ์ค๋ฐ์ ๋ด๊ฐ ์๋ก ๋๋ฑ๋๋ฑ ๋ง๋๋ ค๋ค๋ณด๋ ๋ง๊ฐ์ง๊ฐ ์์๋ค ..ใ ใ
ํ์ง๋ง ์ด๋ฒ ๊ณ๊ธฐ๋ก ๋ค์ ์์ ๋ชจ๋ ๋ฌธ์ ๋ค์ ์์ธ์ ์๊ณ ํด๊ฒฐํ ์ ์์๋ต๋๋ค ๐
์ด์ ๋๋ ๋ชจ๋ ํด๊ฒฐ ํ ์ ์์๊ฑฐ๊ฐ์๋๋ค…. ํงํ
์ด๋ ๊ฒ ํด์ ์ค๋๋ ํด๊ฒฐ ์๋ฃ!!! ๐