ํฐ์คํ ๋ฆฌ ๋ทฐ
Swift Concurrency ๊ธฐ๋ฐ ํ์ด์ง + ๋ณ๋ ฌ ๋น๋๊ธฐ ํธ์ถ
ggasoon2 2025. 6. 25. 16:47
๋ฐฐ๊ฒฝ
๋ฐ์ดํฐ๋ฅผ ํ์ด์ง ๊ตฌ์กฐ๋ก ๋ถ๋ฌ์ค๊ณ ,
๊ฐ ๋ฐ์ดํฐ res๊ฐ์ ๋ํด ๋ณ๋๋ก ๋น๋๊ธฐ ์์ธ ์ ๋ณด API์ ์ถ๊ฐ๋ก ์์ฒญํ๊ณ
ํ๋ฉด์ ์ถ๋ ฅํ๋ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ค ํ์ต๋๋ค.
์ฌ๋ฌ api๊ฐ ๋์์ ํธ์ถ๋์ด์ผํ๋ ์ํฉ์ ๋๋ค.
๋ฌธ์ ์์ธ๊ณผ ํด๊ฒฐ
์ฒ์์๋ ๋จ์ํ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์ฒ๋ฆฌํ์ต๋๋ค.
func loadPage() async {
let page = try await api.fetchPage()
for item in page.items {
let detail = try await api.fetchDetail(id: item.id)
messages.append(detail)
}
listRelay.accept(messages)
}
์ด๋ ๊ฒ ํธ์ถํ์์๋์ ๋ฌธ์ ์ ์
์์ฒญ์ด ์์๋๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ๋๊ธฐ ์๊ฐ ๋์ ๋ฐ์ํฉ๋๋ค
์ฐ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋
api ํธ์ถ์ ๋ณ๋ ฌ๋ก ๋์์ ์ฒ๋ฆฌํด์ค ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํด์ผํฉ๋๋ค.
๊ทธ๋์
TaskGroup๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ ์์ฒญ์ ๋ณ๋ ฌ๋ก ๋์์ ์ฒ๋ฆฌํด์ฃผ๋๋ก ํ์๊ณ ,
let results = try await withTaskGroup {
for {
group.addTask {
...
return ..
}
}
}
๋ณ๋ ฌ๋ก ๋ฐ์ ๊ฐ๋ค์ ๋ํด ์์๋ฅผ ๋ณด์ฅํด์ฃผ๊ธฐ์ํด
api ํธ์ถ ์์ ์ index๋ฅผ ๋ถ์ฌํด์ฃผ์์ต๋๋ค.
let results = try await withTaskGroup {
for (index, item) in page.items.enumerated() {
group.addTask {
let detail = try await api.fetchDetail(id: item.id)
return (index, detail)
}
}
}
.sorted { $0.0 < $1.0 }
.map { $1 }
๊ทธ๋ฆฌ๊ณ index๊ฐ์ผ๋ก ์ ๋ ฌํ์ฌ
ํธ์ถ ์์๋๋ก ๊ฒฐ๊ณผ๊ฐ๋ค์ ์ ๋ ฌํด์ฃผ์์ต๋๋ค.
๊ทธ๋์ ์ด๋ฐ์์ผ๋ก ์์ ํ์ฌ ์ฒ์ ์ฝ๋์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ์์ต๋๋ค.
์๋๋ ์์ ๋ ์ฝ๋์ ๋๋ค.
@MainActor // model data race ๋ฐฉ์ง
func loadAllPages() async {
var token: String? = nil
resetState()
while !reachedEnd && !Task.isCancelled {
guard !isLoading else { return }
isLoading = true
let page = try await api.fetchPage(token: token)
let results = try await withTaskGroup {
for (index, item) in page.items.enumerated() {
group.addTask {
let detail = try await api.fetchDetail(id: item.id)
return (index, detail)
}
}
}
.sorted { $0.0 < $1.0 }
.map { $1 }
for message in results {
messages.insert(message, at: 0)
}
listRelay.accept(messages)
if page.hasMore {
token = page.nextToken
} else {
reachedEnd = true
}
isLoading = false
}
}
ํ๋ฒ์ ํน์ ๋ ์ง์ ๋ชจ๋ ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํ๊ธฐ ์ํด
while๋ก ๊ณ์ ํธ์ถํ๋๋ก ํด์ฃผ์๊ณ ,
res ๊ฐ์ hasMore์ด false์ผ๋๊น์ง ํธ์ถํ๋ ๊ตฌ์กฐ์ ๋๋ค
๊ทธ๋ฆฌ๊ณ enumerated๋ก ๊ฐ ์์ฒญ์ ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํด
๋ณ๋ ฌ ํธ์ถ์ ๋ํ response๊ฐ์ ์์๋ฅผ ์ฌ์ ๋ ฌํด์ฃผ์์ต๋๋ค
๋ง๋ฌด๋ฆฌ
ํ์ด์ง๋ ์ฐจ๋ก๋๋ก, ํ์ด์ง ์์ ๋์์, ์ ๋ ฌ์ ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํ์ฌ
๋น๋๊ธฐ ๋ฆฌ์คํธ ํ์ด์ง ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ์์ต๋๋ค
- Total
- Today
- Yesterday
- ๋ ๋์ธ์ด ์ดํ
- filemanager excel read
- rag ๊ธฐ๋ฐ llm
- rag ์์ฑํ ai
- llm csv
- swift git ignore
- swift filemanager excel
- rag ์์
- llm rag
- swift ์๊ฐ
- swift ์์ ์ฝ๊ธฐ
- concurrency pagination
- swift filemanager get excel
- swift ์์ ๊ฐ์ ธ์ค๊ธฐ
- swift excel read
- ๋ ๋์ธ์ด
- ios gitignore
- readysay
- rag llm pdf
- ๋น๋๊ธฐ ๋ฆฌ์คํธ swift
- chatgpt rag llm
- swift get excel
- rag๊ธฐ๋ฐ ai
- rag ์ฑ๋ด
- rag๊ธฐ๋ฐ ์ฑ๋ด
- ์๋์ํํธ ๋ ์ด์ธ์ด
- ๊ณต๋ถ ํ์ด๋จธ ์ดํ
- rag ai
- ๋น๋๊ธฐ ํ์ด์ง swift
- llm pdf rag
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |