Skip to content

Instantly share code, notes, and snippets.

@TuenTuenna
Created March 11, 2022 16:33
Show Gist options
  • Save TuenTuenna/15ca2594c17c930b7f4b1e3fca771da9 to your computer and use it in GitHub Desktop.
Save TuenTuenna/15ca2594c17c930b7f4b1e3fca771da9 to your computer and use it in GitHub Desktop.
AsyncAwaitTutorialTest file
import UIKit


// 끝에 async 를 붙인다.
func performHeavyTask() async {
    // Run some heavy tasks here...
    print("하하하하하")
    await Task.sleep(2_000_000_000)
    print("기다림")
}

func performThrowingHeavyTask() async throws -> String {
    
    // Run some heavy tasks here...
    
    return ""
}

func waitTwoSeconds() async -> String {
    
    // Run some heavy tasks here...
    
    await Task.sleep(2_000_000_000)
    
    return "222"
}

func waitThreeSeconds() async -> String {
    
    // Run some heavy tasks here...
    
    await Task.sleep(3_000_000_000)
    
    return "333"
}

//// Task는 단일 비동기 처리 블럭
//Task {
//    await performHeavyTask()
//    let saying1 = await waitTwoSeconds()
//    let saying2 = await waitThreeSeconds()
//}


func performTaskA() async -> Int {

    // Wait for 2 seconds
    await Task.sleep(2 * 1_000_000_000)
    return 2
}

func performTaskB() async -> Int {
    
    // Wait for 3 seconds
    await Task.sleep(3 * 1_000_000_000)
    return 3
}

func performTaskC() async -> Int {
    
    // Wait for 3 seconds
    await Task.sleep(4 * 1_000_000_000)
    return 4
}

// 순서대로
func doSomethingSequence() {

    // 순서대로 진행됨
    Task {
        // 1번 끝나고
        let a = await performTaskA()
        // 2번 끝나고
        let b = await performTaskB()
        let sum = a + b
        print(sum) // Output: 5
    }
}

// 동시 진행
func doSomethingParalle() {
    
    // 동시 진행
    Task {
        // async let 을 하면 안기다림
        async let a = performTaskA()
        // async let 을 하면 안기다림
        async let b = performTaskB()
        
        async let c = performTaskC()
        
        // await 로 async let 두놈이 끝날때 까지 기다림
//        let sum = await(a + b)
        
        let results : [Int] = await [ a, b, c ]
        
//        print(sum) // Output: 5
    }
}

//doSomethingSequence()

//doSomethingParalle()

// 동시 진행
Task {
    // async let 을 하면 안기다림
    async let a = performTaskA()
    // async let 을 하면 안기다림
    async let b = performTaskB()
    
    async let c = performTaskC()
    
    // await 로 async let 두놈이 끝날때 까지 기다림
//        let sum = await(a + b)
    
    let results : [Int] = await [ a, b, c ]
    
//        print(sum) // Output: 5
}


//doSomething()

// actor는 클래스와 비슷
// 하나의 태스크는 하나의 액터 상태?
// 액터의 메소드는 async가 자동으로 묻는다?
actor Counter {
    
    private let name: String
    private var count = 0
    
    init(name: String) {
        self.name = name
    }
    
    func addCount() {
        count += 1
    }
    
    func getName() -> String {
        return name
    }
}

let counter = Counter(name: "My Counter")

Task{
    await counter.addCount()
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment