-
Notifications
You must be signed in to change notification settings - Fork 1
๐โโ๏ธactor
class Counter {
var count = 0
func increase() {
count += 1
}
}
๊ฐ๊ธฐ ๋ค๋ฅธ ๊ณณ์์ ๋์ผํ Counter ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์ ๊ทผํ๋ค๊ณ ์๊ฐํด๋ณด์.
increase()
๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ๋ฌ ๊ณณ์์ ๋์ํ๋ค๊ณ ํ๋ค๋ฉด,
๋ด๋ถ์ count ํ๋กํผํฐ๋ dataRace
๊ฐ ๋ฐ์ํ๋ค. ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๊ณ , ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ์ํ(shared mutable state)
์ด๊ธฐ ๋๋ฌธ.
struct Counter {
var count = 0
mutating func increase() {
count += 1
}
}
๊ทธ๋๋ DispatchQueue.global
์ ์ด์ฉํด์ ๋น๋๊ธฐ์ ์ผ๋ก ํธ์ถํ๋ฉด dataRace
๋ฐ์.
๊ฒฐ๊ตญ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด let
์ผ๋ก, ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋์ด์ผ ํ๋ค.
๋ค๋ง ๊ทธ๊ฑด ์ซ์.
- class์ ์ ์ฌํ ์๋ก์ด ํ์
- ํ๋กํผํฐ, ๋ฉ์๋, ์ด๋์ ๋ผ์ด์ ๋ฑ๋ฑ์ ๋ชจ๋ ๊ฐ์ง ์ ์์.
- ํ๋กํ ์ฝ, extension๋ ๊ฐ๋ฅ
- ์ฐธ์กฐํ์
- ์์ ์ง์ x
actor Counter {
var count: Int = 0
func increase() {
count += 1
}
}
//์ธ๋ถ
let counter = Counter()
await counter.increase()
์ด๋ฐ ์์ผ๋ก actor ๋ด๋ถ์ ๋ฉ์๋๊ฐ ๋ด๋ถ์ ๊ฐ์ ๋ณ๊ฒฝ์ํฌ ๋,
์ธ๋ถ์์ ํธ์ถ ์, ์ ์๋์ ํธ์ถ์ฝ๋๋ฅผ โ๊ธฐ๋ค๋ฆฌ๊ฒโ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ actor๋ ๋ฐ์ดํฐ๋ ์ด์ค๊ฐ ๋ฐ์ํ์ง ์์ ์์ ์ ์์์ ํธ์ถ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ค.
actor Counter {
var count: Int = 0
func increase(diffCounter: Counter) {
self.count += 1
diffCounter.count += 1 ๐จ ์๋ฌ ๋ฐ์!
}
}
actor ๋ด๋ถ์ ์ ์๋ ํ๋กํผํฐ, instance ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก, actor-isolated
์ํ.
actor-isolated
์ธ ์ ๋ค์ ๋ฌด์กฐ๊ฑด self
๋ก ์ ๊ทผ๋์ด์ผ ํ๋ค.
actor Counter {
var count: Int = 0
let name: String = "hello"
func increase(diffCounter: Counter) {
self.count += 1
print(diffCounter.name)
}
}
๋ค๋ง ํ๋กํผํฐ๊ฐ ๋ถ๋ณ ์ํ
์ผ ๊ฒฝ์ฐ์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. (cross-actor reference
)
๋จ, ๋ค๋ฅธ ๋ชจ๋์์๋ ๋ถ๊ฐํ๋ค.
๋ค๋ฅธ ๋ชจ๋์์ ์ ๊ทผํ๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ์๊น๋ณด์๋ await
์ ์ด์ฉํ ๋น๋๊ธฐ๋ก ํธ์ถ๋์ด์ผ ํ๋ค.
์ด์ ๋ Counter๋ฅผ ์ ์ํ ๋ชจ๋์์ ๋ชจ์ข
์ ์ด์ ๋ก name
์ด var
๋ก ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ๊ธฐ ์ํจ์ด๋ค.
actor Counter {
var count: Int = 0
let name: String = "hello"
func increase(diffCounter: Counter) {
self.count += 1
await diffCounter.decrease()
}
}
extension Counter {
func decrease() {
self.count -= 1
}
}
์ด๋ฐ ์์ผ๋ก ์์ ์ ํ๋กํผํฐ๋ฅผ ์กฐ์ํ๋ ๋ฉ์๋๋ ๋๊ธฐ์
์ผ๋ก ๋์ํ๋, ์ธ๋ถ์์ ์ด๋ฅผ ํธ์ถ ์, await
์ ์ด์ฉํด ๋น๋๊ธฐ์
์ผ๋ก ์ ๊ทผํ๊ฒ ๋ง๋ค์ด์ค๋ค.
์ด๋, ๋ฉ์๋์ ๋ฐ๋ก async
ํค์๋๋ฅผ ๋ฌ์์ฃผ์ง ์๋๋ผ๋, ์์์ ์ํด์ค๋ค.
๋ง์ฝ Counter๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ํจ์๊ฐ ์๋ค๊ณ ์น์.
func double(counter: Counter) {
counter.count *= 2
}
๋น์ฐํ ์ด ์ฝ๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. counter์ count๋ actor-isolated
ํ๋กํผํฐ๋ผ ์ธ๋ถ์์ ์ฐธ์กฐ ๋ ์ ์๋ค.
์ด๊ฑธ ํด๊ฒฐ ํ๋ ค๋ฉด double ํจ์๊ฐ actor-isolated
ํจ์๊ฐ ๋์ด์ฃผ๋ฉด ๋๋ค.
๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
func double(isolated counter: Counter) {
counter.count *= 2
}
์ด๋ฐ ์์ผ๋ก ๊ฐ๋จํ๊ฒ isolated
ํค์๋๋ฅผ ๋ฃ์ด์ค์ผ๋ก์จ double ํจ์๋ isolated Context๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
๊ธฐ์กด actor ๋ด๋ถ์ ๊ฐ์ ์ ๊ทผํ๋ ค๋ฉด await
ํค์๋๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ๋ ์ด์ค๊ฐ ๋ฐ์ํ์ง ์์ ์์ ์ ์ ๊ทผ ํ ์ ์๊ฒ ํด์ฃผ์๋ค.(๋น๋๊ธฐ)
ํ์ง๋ง ์ด๊ฑธ ๋๊ธฐ์ ์ผ๋ก ์ฐธ์กฐํ ํ์๊ฐ ์๋ค๋ฉด, nonisolated
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
actor Counter {
var count: Int = 0
nonisolated let name: String = "hello"
func increase(diffCounter: Counter) {
self.count += 1
await diffCounter.decrease()
}
}
extension Counter {
func decrease() {
self.count -= 1
}
}
//๊ธฐ์กด
let name = await Counter.name
//nonisolated ์ ์ฉ ์
let name = Counter.name
print(name)
์ด๋ฐ ์์ผ๋ก await์ ์ฌ์ฉํ์ง ์๊ณ , ๋๊ธฐ์ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
๋ค๋ง var
์ ์ ์ฉ ์์๋ ๋ถ๊ฐํ๋ค. ๋น์ฐํ๋ค. data race
๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
let์ ๊ฒฝ์ฐ ์ฝ์ผ๋ฉด ๊ทธ๋ง์ด์ง๋ง var์ ๊ฒฝ์ฐ ์์ ๋ ๊ฐ๋ฅํด์ ธ ๋ฒ๋ ค data race
๋ฅผ ๋ง์ ์ ์๊ฒ ๋๋ค.
- ๐ ๊ธฐํ์ ๊ณผ์ ๊ณผ ์๋
- ๐ swift6 ๋์ ๊ธฐ โ @unchecked Sendable์ ์ฌ์ฉํด์ผ๋ง ํ๋ ์ด์
- ๐ WaveForm(ํํ) ์ ์๊ธฐ
- ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ์ ์ด์
- ๐ ํ๋ฉด ์ ํ(Game NavigationController)
- ๐ DIContainer๋ฅผ ์ฌ์ฉํ ๊ณ๊ธฐ
- ๐ AudioHelper ์ ์๊ธฐ
- ๐ ์์ ํ๋ ์ด์ด์ compact ๋ฒ์ ์ ์๊ธฐ
- ๐ Combine์ ์ด์ฉํ ๋ฐ์ดํฐ ์ ๋ฌ
- ๐ ํ์ด์ด๋ฒ ์ด์ค๋ฅผ ์ฐ๋ฉฐ ์์๋ ์ผ
- ๐ ์บ์ฑ ๋ชจ๋ ๊ตฌํ๊ณผ ๋ฌธ์ ์
- ๐ ๋ก๊ทธ ์์คํ ์ ์๊ธฐ
- โ Data ๋ผ๋ฆฌ์ ๋น๊ต
- โ ํ๋ ์์ํฌ Reference ์์กํ๋ ๋ฌธ์
- โ actor ์์์ timer๊ฐ ์คํ๋์ง ์๋ ๋ฌธ์
- โ NSLayoutConstraint ์ต์ ๋ ๋ฌธ์
- โ ํ ์ด๋ธ ๋ทฐ๊ฐ ๋ณด๊ณ ์๋ ๋ฐฐ์ด๊ณผ bindํ๊ณ ์๋ ๋ฐฐ์ด ๊ฐ์ race condition ๋ฌธ์
- โ ํ ์คํธ๋ผ๋ฆฌ์ ๋ ๋ฆฝ์ฑ
- โ ๋คํธ์ํฌ ํ ์คํ ์ Error ํธ๋ค๋ง
- โ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋์ ์์ฒญ์, ๋ฐ์ดํฐ๊ฐ ๋ฐ์์ด ์๋๋ ์ด์ ํด๊ฒฐ
- โ ์์กด์ฑ framework ์ถ๊ฐ์ ๋ถ๋ฌ์ค์ง ๋ชปํ๋ ๋ฌธ์
- โ Timer๋ฅผ 6์ด ์ค์ ํด๋ ๋ ์คํ๋๋ ๋ฌธ์
- โ Music Kit Data Request ์๋ฌ
- โ DI Container ์์ ์์ฑํ ์ธ์คํด์ค๊ฐ ๋์์ ์กด์ฌ ํ๋ ์ด์