[This Document will be continueously updated]

이제부터 모든 문서는 구글 드라이브로 이전...

https://docs.google.com/document/d/1JiIC0ByhhoWNN5J3YnnoIeIKB3MEMWd9BMZ48337uXQ/edit?usp=sharing

 

hjh_MSArchitecture

 

docs.google.com

 

 

==== 사족 ====

runBlocking, async, Combine, Task

Android - 

runBlocking과 async는 Kotlin의 코루틴을 사용하는 두 가지 다른 구문입니다. 각각의 목적과 사용 방법에 대해 알아보겠습니다.

  1. runBlocking:
    • 목적: runBlocking은 주로 비동기 코드를 동기적으로 실행하는 데 사용됩니다. 일반적으로 최상위 레벨에서 사용되는 것이 아니라, 테스트 코드나 메인 함수와 같이 코루틴이 루트 수준에서 시작되는 곳에서 사용됩니다.
    • 동작: runBlocking 블록 안에서의 모든 코루틴이 완료될 때까지 현재 스레드를 차단합니다. 따라서 일반적으로 메인 스레드에서 사용하는 것은 피해야 합니다.
    • 예시:
    •   
    • runBlocking { // 코루틴 코드 }
    • kotlinCopy code
  2. async:
    • 목적: async는 비동기적으로 작업을 수행하고 그 결과를 반환하는 데 사용됩니다. 여러 async 작업을 시작하면서 각 작업의 결과를 기다리는 데 유용합니다.
    • 동작: async는 비동기적으로 실행되며, await 함수를 통해 해당 작업이 완료될 때까지 대기할 수 있습니다.
    • 예시:
    • kotlinCopy code
      runBlocking { val result1 = async { // 비동기 작업 1 } val result2 = async { // 비동기 작업 2 } // result1.await()와 result2.await()를 사용하여 각 작업의 결과를 기다릴 수 있음 }
    • async는 주로 여러 작업을 동시에 시작하고 결과를 모아야 하는 경우에 사용됩니다. 비동기적으로 실행되기 때문에 여러 작업을 동시에 수행할 수 있습니다.

주의할 점은 runBlocking은 주로 테스트나 메인 함수와 같은 특정 상황에서만 사용되어야 하며, 메인 스레드에서의 사용은 피해야 합니다. 반면에 async는 비동기적인 작업을 수행하고 결과를 모을 때 주로 사용됩니다.

Swift에서 runBlocking 함수는 Kotlin의 runBlocking과는 다르게 내장된 함수로 제공되지 않습니다. 그러나 비슷한 기능을 구현하려면 Swift에서는 DispatchGroup을 사용하거나 async/await 패턴을 활용할 수 있습니다.

  1. DispatchGroup 사용:
    swiftCopy code
    import Foundation let dispatchGroup = DispatchGroup() dispatchGroup.enter() someAsyncFunction { // 비동기 작업 완료 시 호출 dispatchGroup.leave() } dispatchGroup.enter() anotherAsyncFunction { // 다른 비동기 작업 완료 시 호출 dispatchGroup.leave() } // 모든 비동기 작업이 완료될 때까지 기다림 dispatchGroup.wait() // 여기로 오면 모든 비동기 작업이 완료된 후
  2. DispatchGroup은 여러 비동기 작업이 완료될 때까지 기다리는 데 사용됩니다. 아래는 DispatchGroup을 사용하여 비동기 작업이 모두 완료될 때까지 기다리는 예제입니다.
  3. async/await 사용:
    swiftCopy code
    func someAsyncFunction() async { // 비동기 작업 수행 } func anotherAsyncFunction() async { // 다른 비동기 작업 수행 } // 비동기 작업이 모두 완료될 때까지 기다림 await Task.whenAll { await someAsyncFunction() await anotherAsyncFunction() } // 여기로 오면 모든 비동기 작업이 완료된 후
    이것은 async/await를 사용하여 비동기 작업이 완료될 때까지 기다리는 더 간결한 방법입니다.
  4. Swift 5.5부터는 async/await 패턴이 도입되었습니다. 이를 사용하면 비동기 코드를 더 간결하게 작성할 수 있습니다.

이러한 패턴은 Swift에서 runBlocking과 유사한 기능을 제공하며, 비동기 코드를 처리하는 데 사용됩니다. 선택적으로 Task를 사용하여 새로운 비동기 작업을 만들 수 있습니다.

SwiftUI에서는 비동기 작업 및 다중 스레딩과 관련된 개념이 있습니다. 비동기적인 코드를 작성하거나 다중 스레딩 환경에서 작업을 처리해야 하는 경우, SwiftUI 앱에서 사용할 수 있는 몇 가지 개념과 구성 요소가 있습니다.

  1. Swift의 비동기 프로그래밍:
    • SwiftUI는 Swift 언어를 기반으로 하기 때문에, Swift의 비동기 프로그래밍 기능을 활용할 수 있습니다. Swift 5.5부터는 async/await와 같은 비동기적인 기능들이 도입되었습니다. 이를 통해 비동기 코드를 더 쉽게 작성하고 관리할 수 있습니다.
  2. Combine 프레임워크:
    • Combine은 SwiftUI와 함께 사용되는 반응형 프로그래밍을 위한 Apple의 프레임워크입니다. 비동기적인 이벤트 스트림을 처리하고 결합하는 데 사용됩니다. Publisher 및 Subscriber와 같은 개념을 제공하여 데이터의 비동기적인 흐름을 효율적으로 다룰 수 있습니다.
    swiftCopy code
    import Combine var cancellables: Set<AnyCancellable> = [] URLSession.shared.dataTaskPublisher(for: url) .map(\.data) .decode(type: YourDecodableType.self, decoder: JSONDecoder()) .sink(receiveCompletion: { completion in // Handle completion }, receiveValue: { decodedData in // Handle decoded data }) .store(in: &cancellables)
  3. 비동기적 SwiftUI 뷰 업데이트:
    • SwiftUI에서는 @State 및 @Binding 속성을 사용하여 뷰의 상태를 관리합니다. 이러한 속성은 특정 값이 변경될 때 해당 뷰를 다시 그리도록 트리거됩니다. 비동기 작업이 완료된 후 뷰를 업데이트하려면 DispatchQueue.main.async 또는 Task를 사용할 수 있습니다.
    swiftCopy code
    Task { let result = await fetchData() DispatchQueue.main.async { self.data = result } }

위의 코드는 비동기 작업을 수행하고, 작업이 완료된 후에 메인 스레드에서 SwiftUI 뷰의 상태를 업데이트하는 예시입니다. 여기서 Task는 Swift의 새로운 비동기 작업을 나타내는 개념입니다.

SwiftUI 및 Swift의 최신 버전에서는 비동기 및 다중 스레딩을 다루기 위한 다양한 기능과 패턴이 계속해서 발전하고 있으므로, 현재의 문법과 패턴에 대한 최신 정보를 확인하는 것이 좋습니다.

 

 

'Swift & Python 실무 > {APP} SOCANNER APP' 카테고리의 다른 글

[공지] Swift 에서 SOCANNER로 카테고리를 바꿉니다.  (0) 2024.04.02
Apple developer program has been updated.  (0) 2021.06.08
game center icon  (0) 2021.06.04
Game Center transcript  (0) 2021.06.04
agreements  (0) 2021.05.29

+ Recent posts