자바스크립트와는 다르게 멀티스레드가 지원이 된다.
serial, concurrent, sync, async라는 개념이 있는데
이에 대해 알아보자.
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")
}
//동시 진행
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 {
}
}
DispatchQueue.global().sync {
Thread.sleep(forTimeInterval: 1.5)
print("finish1)
}
DispatchQueue.global().sync {
Thread.sleep(forTimeInterval: 3)
print("finish2)
}
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()