ํ”„๋กœ์ ํŠธ ๐Ÿ› ๏ธ/ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

task(id: ) ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

WonderPark 2023. 6. 10. 02:26

 

๋ฌธ์ œ ์ƒํ™ฉ

ํŒ”๋กœ์šฐ ํŒ”๋กœ์ž‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ• ๋•Œ์˜€๋‹ค.

์ €๋ฒˆ๊ณผ ๊ฐ™์€ ๊ตฌ๋…ํ•˜๊ธฐ๊ฐ€ ๋ฐ˜์˜์ด ์•ˆ๋˜๋Š” ์ด์Šˆ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ƒํ™ฉ์ด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค..!

 

์ €๋ฒˆ ์ด์Šˆ์˜ ์›์ธ์€

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์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์„๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•„์ฅฌ ์ž˜ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

๋А๋‚€์ 

์ง„์งœ ์ง„์งœ ๋‚ด๊ฐ€ ๊ฒช์—ˆ๋˜ ํŠธ๋Ÿฌ๋ธ” ์ด์Šˆ์ค‘์— ์ œ์ผ ๋ชจ๋ฅด๊ฒ ๊ณ , ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ์˜€๋‹ค.

ํŒ”๋กœ์›Œ ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ๋ฐ˜์˜์•ˆ๋˜๋Š”๊ฒƒ์ด ํฐ ๋ฌธ์ œ์ผ๊นŒ ,, ์ƒ๊ฐํ•ด๋ณด์•˜์ง€๋งŒ ์„ฑ๊ฒฉ์ƒ ์•ˆ๊ณ ์น˜๋Š”๊ฑฐ ์ ˆ๋Œ€์•ˆ๋Œ ๋ฌด์ €๊ฑด ๊ณ ์ณ์•ผํ•ด …..

๋‹ค๋ฅธ ๋ถ„์ด ์ž‘์—…ํ•˜๋˜ ์ฝ”๋“œ์—์„œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋กœ ์ธํ•ด ํ† ์Šค๋ฐ›์•„ ๋‚ด๊ฐ€ ์ƒˆ๋กœ ๋š๋”ฑ๋š๋”ฑ ๋งŒ๋“œ๋ ค๋‹ค๋ณด๋‹ˆ ๋ง˜๊ฐ™์ง€๊ฐ€ ์•Š์•˜๋‹ค ..ใ…Žใ…Ž

ํ•˜์ง€๋งŒ ์ด๋ฒˆ ๊ณ„๊ธฐ๋กœ ๋’ค์— ์žˆ์„ ๋ชจ๋“  ๋ฌธ์ œ๋“ค์˜ ์›์ธ์„ ์•Œ๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ต๋‹ˆ๋‹ค ๐Ÿ™‚

์ด์ œ ๋‚˜๋Š” ๋ชจ๋“  ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์„๊ฑฐ๊ฐ™์Œ๋‹ˆ๋‹ค…. ํ™งํŒ…

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์˜ค๋Š˜๋„ ํ•ด๊ฒฐ ์™„๋ฃŒ!!! ๐Ÿ˜Ž