Swift - 기초 2

김영훈·2023년 1월 21일
1

Swift

목록 보기
2/2

DispatchQueue (async, sync, serial, concurrent)


자바스크립트와는 다르게 멀티스레드가 지원이 된다.

serial, concurrent, sync, async라는 개념이 있는데
이에 대해 알아보자.

Serial

  • 일반적인 코드 default 동작
  • 하나의 작업이 완료된 후 다음작업을 진행한다.
  • 스레드가 작업이 완료될떄까지 thread내의 다른작업은 멈춘 것처럼 보인다.
  • 메인스레드가 serial로 동작 (UI, 일반적으로 작성된 코드)

Concurrent

  • 여러개 작업을 동시에 실행한다.(하나의 작업자 기준)
let queue = DispatchQueue(label: "queuename", attributes: .concurrent)
// queue를 싱크로 사용하면 main 스레드 일시 정지

	queue.async {
    	Thread.sleep(forTimeInterval: 2)
        print("finish1")
	}
    queue.async {
        Thread.sleep(forTimeInterval: 2)
        print("finish2")
	}
    queue.async {
        Thread.sleep(forTimeInterval: 2)
        print("finish3")
	}

async

  • 여러 작업자가 동시에 작업 실행.
  • UI 관련된 작업은 Main thread에서 담당하기 떄문에 변경 불가
//동시 진행
DispatchQueue.global().async {
	Thread.sleep(forTimeInterval: 1.5)
    print("finish1)
}

DispatchQueue.global().async {
	Thread.sleep(forTimeInterval: 3)
    print("finish2)
}

//메인스레드 async는 serial로 진행
DispatchQueue.main.async {
	Thread.sleep(forTimeInterval: 1.5)
    print("finish1)
}

DispatchQueue.main.async {
	Thread.sleep(forTimeInterval: 1.5)
    print("finish1)
}

//이건 불가능
        
DispatchQueue.main.sync {
        
}
        
//이건 가능
DispatchQueue.global().async {
	DispatchQueue.main.sync {
            
	}
}

sync

  • 여러 작업자가 하나의 작업씩 순차적으로 실행

DispatchQueue.global().sync {
	Thread.sleep(forTimeInterval: 1.5)
    print("finish1)
}

DispatchQueue.global().sync {
	Thread.sleep(forTimeInterval: 3)
    print("finish2)
}

async & await


swift는 비동기 프로그래밍을 많이 사용하고 이는 너무 장황하고(verbose), 복잡하고(complex), 부정확한(incorrect) 비동기 코드를 작성하기 쉽다.

따라서 swift에서 비동기 코드를 좀 더 동기적으로 작성하길 원한다면 사용하자

func someWork(sec: UInt64) async -> UInt64{
    try? await Task.sleep(nanoseconds: 1000 * 1000 * 1000 * sec)
    
 print(sec)
 return 1
}


func simpleWork(){
    "simple" + "work" + "done"
}

var myTask: Task<Int, Never>?

func start(){
    simpleWork()

    myTask = Task{
       // async let name = FN = 기본 규격
       async let s1 = someWork(sec: 1)
       async let s2 = someWork(sec: 3)
       async let s3 = someWork(sec: 4)

		// 비동기 취소되었는지 boolean 확인
       let isCancelled =  myTask?.isCancelled  
        
       if(isCancelled){
       	return "canceled!"
       }
		// 비동기 실행
       let secArr = await [s1,s2,s3]
       
       let sum  = await s1 + s2 + s3 
       
        
    }
    
}

func pressCancelBtn () {
    myTask?.cancel() //비동기 취소
}



start()
profile
개인적인 기록.

0개의 댓글