-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create 240820 MainActor,_Concurrency.md
- Loading branch information
Showing
2 changed files
with
78 additions
and
1 deletion.
There are no files selected for viewing
75 changes: 75 additions & 0 deletions
75
Sources/AriNote/TIL.docc/Swift/240820_MainActor,_Concurrency.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
# 240820 MainActor, Concurrency | ||
|
||
MainActor.runμ @MainActorμ μ°¨μ΄κ° κΆκΈν΄! | ||
|
||
8μ 20μΌ (ν) | ||
|
||
# νμ΅λ΄μ© | ||
|
||
Swiftμ Concurrency νκ²½μμ λΉλκΈ°λ‘ λ°μ΄ν°λ₯Ό μ²λ¦¬ν ν UIλ₯Ό μ λ°μ΄νΈ ν λ λ©μΈμ€λ λμμ μ²λ¦¬νλλ‘ νκΈ° μν΄μ λ°©λ²μ μ°Ύμ보μλ€. μ¬λ¬ λ°©λ²μ΄ μμ΄μ μ°¨μ΄κ° λμ§ κΆκΈν΄μ μμ보μλ€. | ||
|
||
## MainActor.runμ @MainActorμ μ°¨μ΄ | ||
|
||
`MainActor.run`μ λ©μΈ μ€λ λμμ νΉμ ν΄λ‘μ λ₯Ό μ€ννκΈ° μν΄ μ¬μ©λλ€. | ||
λ©μΈ μ€λ λμμ μ€νλκΈΈ μνλ μ½λκ° μμ λ νΈμΆν μ μλ λͺ λ Ήν(Imperative) λ°©μμ΄λ€. | ||
|
||
```swift | ||
MainActor.run { | ||
// λ©μΈ μ€λ λμμ μ€νλ μ½λ | ||
} | ||
``` | ||
|
||
`@MainActor`λ νΉμ ν¨μ, λ©μλ, ν΄λμ€ λλ κ΅¬μ‘°μ²΄κ° λ©μΈ μ€λ λμμ μ€νλλλ‘ μ§μ νλ λ°©λ²μ΄λ€. ν΄λΉ μ΄λ Έν μ΄μ μ μ¬μ©νλ©΄ μλμΌλ‘ μ½λκ° λ©μΈ μ€λ λμμ μ€νλλλ‘ κ΄λ¦¬νλ€. | ||
|
||
```swift | ||
@MainActor | ||
func updateUI() { | ||
// UI μ λ°μ΄νΈ μ½λ | ||
} | ||
``` | ||
|
||
## μ±λ₯μ μΈ μ°¨μ΄ | ||
|
||
|
||
### MainActor.run | ||
`MainActor.run`μ λ©μΈ μ€λ λμμ μ€νλμ΄μΌ ν μ½λ λΆλΆμ λͺ μμ μΌλ‘ λ©μΈ μ€λ λμμ μ€ννλλ‘ μ§μ νλ€. | ||
κ·Έλ¬λ `MainActor.run`λ λ©μΈ μ€λ λλ‘μ μ νμ λμ μΌλ‘ μ²λ¦¬νλ€. μ΄ κ³Όμ μμ μ»΄νμΌλ¬λ μ€λ λ μ νμ μν μΆκ°μ μΈ λ°νμ μ½λλ₯Ό μμ±νλ©°, μ΄λ SIL μ½λμ μμ μ¦κ°μν¨λ€. λ§€λ² `MainActor.run`μ νΈμΆν λλ§λ€ λ©μΈ μ€λ λλ‘μ μ νμ μ²λ¦¬νκΈ° μν μ½λκ° μμ±λκ³ μ΄λ¬ν μΆκ°μ μΈ μ»¨ν μ€νΈ μ€μμΉμ μ±λ₯ μ νμ μμΈμ΄ λ μ μλ€. | ||
|
||
> MainActor.runμ μ¬μ©νλ©΄ μ»΄νμΌλ¬κ° λ©μΈ μ€λ λλ‘μ μ νμ μν΄ μΆκ°μ μΈ Swift Intermediate Language(SIL) μ½λλ₯Ό μμ±νκ² λλ©°, μ΄ κ³Όμ μμ Context Switching λ° λΉλκΈ° μ½λ κ΄λ¦¬μ κ΄λ ¨λ μ½λκ° μΆκ°λλ€. | ||
> Swift μ»΄νμΌλ¬λ μμ€ μ½λλ₯Ό μ΅μ ννκΈ° μν΄ μ¬λ¬ λ¨κ³μ μ€κ° ννμ μμ±νλλ°, κ·Έμ€ νλκ° `SIL (Swift Intermediate Language)`λ€. SILμ μ΅μ νλ₯Ό μν΄ μ€κ³λ μ€κ° ννμΌλ‘, μ½λμ μ€ν κ²½λ‘λ₯Ό μ΅μ ννκ±°λ, λΆνμν μμ μ μ κ±°νλ λ±μ μμ μ νλ€. | ||
λν λΉλκΈ° μμ λ΄μμ `MainActor.run`λ₯Ό μμ£Ό μ¬μ©νλ©΄ λΉλκΈ° μμ μ νλ¦μ λκ³ λ©μΈ μ€λ λλ‘ μ ννλ κ³Όμ μμ μ§μ°μ΄ λ°μν μλ μλ€. | ||
λ§μ½ λ©μΈμ€λ λκ° μ΄λ―Έ λ°μ μνλΌλ©΄ `MainActor.run`μμ λ©μΈ μ€λ λλ‘μ μ νμ΄ λκΈ° μνμ λμΌ μλ μλ€. | ||
μ¦, λ©μΈ μ€λ λμ λ³λͺ© νμμ μ λ°ν μ μμΌλ©° κ²°κ³Όμ μΌλ‘ UI λ λλ§ μ§μ°μ΄λ λ€λ₯Έ μ€μν μμ μ μ§μ°μΌλ‘ μ΄μ΄μ§ μλ μλ€. | ||
λν λΉλκΈ° μμ λ΄μμ λΉλ²νκ² μ¬μ©νκ² λλ€λ©΄ μ»΄νμΌλ¬ μ΅μ νλ₯Ό μ΄λ ΅κ² λ§λ€κ³ λΆνμν μ€λ²ν€λλ₯Ό λ°μμν¬ μ μλ€. | ||
|
||
### @MainActor | ||
|
||
`@MainActor`λ ν΄λ‘μ , ν¨μ, νμ μμ€μμ λ©μΈ μ€λ λμμ μ€νλμ΄μΌ ν¨μ μ μΈμ μΌλ‘ μ§μ νλ€. μ»΄νμΌλ¬λ ν΄λΉ μ½λκ° λ©μΈ μ€λ λμμ μ€νλλ€λ μ¬μ€μ μ»΄νμΌ νμμ μΈμ§νκ³ μ΄μ λ°λΌ μ΅μ νλ₯Ό μννλ€. | ||
|
||
`@MainActor`λ₯Ό μ¬μ©νλ©΄ μ»΄νμΌλ¬λ μ½λμ μ€ν κ²½λ‘λ₯Ό μμΈ‘νκ³ μ΅μ νν μ μλ€. λ©μΈ μ€λ λμμ μ€νλ μ½λκ° μ 체μ μΌλ‘ μ μ μλμ΄ μμΌλ―λ‘ λΆνμν μ€λ λ μ νμ΄λ 컨ν μ€νΈ μ€μμΉ(Context Switching)μ μ΅μνν μ μλ€. | ||
|
||
λν `@MainActor`λ λ©μΈ μ€λ λ μ€νμ΄ λ³΄μ₯λκΈ° λλ¬Έμ SIL λ¨κ³μμμ μ½λ μμ±λ κ°κ²°ν΄μ§λ€. μ»΄νμΌλ¬λ λ©μΈ μ€λ λμμμ μ€νμ μΌλμ λκ³ μ΅μ νλ SIL μ½λλ₯Ό μμ±νλ©°, μ΄λ‘ μΈν΄ μ±λ₯ μ€λ²ν€λκ° μ μ νΈμ΄λ€. | ||
|
||
## κ·Έλμ λ μ¨μΌν΄? | ||
|
||
λ©μΈ μ€λ λμμ μ€νλμ΄μΌ νλ μ½λκ° λ§κ±°λ μΌκ΄λ μ€ν νκ²½μ΄ νμν λλ `@MainActor`λ₯Ό μ΅λν νμ©νλλ‘ μ¬μ©νμ. | ||
|
||
νΉμ μ½λ λ΄μμ μΌλΆλΆμ λ©μΈ μ€λ λλ‘ μ€νν΄μΌν λλ `MainActor.run`μ μ¬μ©νμ. λ€λ§ λΉλ²ν μ¬μ©μ λ°νμ μ€λ²ν€λλ₯Ό λ°μμμΌ μ±λ₯ μ νλ₯Ό μ΄λν μ μμΌλ μ μ€νκ² μ¬μ©νλ κ²μ΄ μ’κ² λ€. | ||
|
||
## 5μ€ μμ½ | ||
|
||
1. `@MainActor`λ ν¨μλ ν΄λμ€ λ¨μμμ λ©μΈ μ€λ λμμμ μ€νμ μ»΄νμΌ νμμ μ΅μ ννμ¬, λΆνμν μ€λ λ μ νμ μ€μ΄κ³ μ±λ₯μ ν₯μμν¨λ€. | ||
2. `MainActor.run`μ νΉμ ν΄λ‘μ λ₯Ό λ©μΈ μ€λ λμμ μ€ννκΈ° μν΄ λ°νμ μ μ€λ λ μ νκ³Ό μΆκ°μ μΈ SIL μ½λ μμ±μ μ λ°νμ¬ μ±λ₯ μ€λ²ν€λλ₯Ό μ¦κ°μν¬ μ μλ€. | ||
3. `@MainActor`λ μ 체μ μΈ λ©μΈ μ€λ λ μ€νμ΄ νμν κ²½μ° μ ν©νλ©°, μ»΄νμΌλ¬κ° μΌκ΄λ μ€ν κ²½λ‘λ₯Ό μ΅μ νν μ μλ€. | ||
4. `MainActor.run`μ νΉμ μν©μμλ§ λ©μΈ μ€λ λ μ νμ΄ νμν λ μ¬μ©νμ§λ§, λΉλ²ν μ¬μ©μ μ±λ₯ μ νλ‘ μ΄μ΄μ§ μ μλ€. | ||
5. μ±λ₯ μ΅μ νλ₯Ό μν΄ `@MainActor`λ₯Ό μ νΈνκ³ , `MainActor.run`μ μ μ€νκ² μ¬μ©νλ κ²μ΄ λ°λμ§νλ€. | ||
|
||
--- | ||
|
||
# μ°Έκ³ λ§ν¬ | ||
|
||
- [https://developer.apple.com/documentation/swift/concurrency](https://developer.apple.com/documentation/swift/concurrency) | ||
- [https://developer.apple.com/documentation/swift/mainactor](https://developer.apple.com/documentation/swift/mainactor) | ||
- [https://mechanicdong.tistory.com/54](https://mechanicdong.tistory.com/54) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters