[TIL / 25.03.19] playground, command line tool에서의 비동기 함수 (feat. escaping closure)

2025. 3. 19. 21:49·iOS/Swift

1. 오늘 무엇을 했으며 문제가 무엇인가,,,,,,

오전부터 낮까지 알고리즘 문제 하나 붙잡고 있었다가 남는 시간에 무언가 몰두해서 하기 힘들어서 밀린 강의를 좀 들어두도록 했다.

문제가 생긴 부분은 심화 단계에서의 클로저 실습. escaping closure(탈출 클로저)에 대한 실습인데 실행에 자꾸 문제가 있었다.

 

우선 탈출 클로저란 무엇인가?

"탈출 클로저(@escaping)는 함수가 반환된 후에도 실행될 수 있는 클로저입니다. 즉, 클로저가 함수의 실행 범위(scope)를 '탈출'하여 함수 외부에서도 호출될 수 있습니다. 반면, 일반 클로저(비탈출 클로저)는 함수 내부에서만 실행되며 함수가 반환되기 전에 실행을 완료해야 합니다."

 

원래 클로저를 쓸 때 선언 시 함수 블럭 내에 쓰는데 만약 이 클로저가 비동기일 경우, 따로 작업하는 동안 원래 속해있던 코드블럭내 처리가 모두 끝나버리면 비동기로 작업하던 코드는 처리할 수 없다. api 작업 같은 부분을 비동기로 하게 될텐데 그럼 서버에서 받아온 데이터를 처리할 수 없게 되는것이기에 이 때 탈출 클로저를 쓰게 된다. 

 

탈출 클로저는 스코프에 있는 부분에서의 반환이 끝나고나서도 실행될 수 있게 만들기에 콜백(callBack)이 가능해진다. 그 외에도 변수에 따로 담아뒀다가 다른 시점에도 처리할 수 있다.

 

 

2. 문제 상황

import Foundation

func performAfterDelay(seconds: Double, completion: @escaping () -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
        completion()
    }
}

print("시작 후 2초 대기..")

performAfterDelay(seconds: 2.0) {
    print("무야호")
}

print("종료")
 

이걸 command line tool로 테스트하고 있었는데

 

이렇게 무야호가 출력되지 않는 현상이 일어난다. 

분명 강의에서도 비슷한 코드로 실행이 다 되던데 왜 나만 안되지하고 팀원분들께 상황을 공유했는데 playground로 하면 될 것이다 말씀하셔서 하니깐 

 

되더라 !!

 

왜 되는지 클로드한테 물어보았는데, 


커맨드 라인 툴

커맨드 라인 툴은 일반적인 프로그램 실행 방식을 따릅니다:

  1. main 함수(또는 최상위 레벨 코드)가 시작
  2. 코드가 순차적으로 실행
  3. 마지막 코드가 실행되면 프로그램이 종료

비동기 코드의 경우, 작업이 GCD(Grand Central Dispatch)의 큐에 등록되지만 메인 스레드의 코드가 모두 실행되면 프로세스 자체가 종료됩니다. 따라서 등록된 비동기 작업이 실행되기 전에 프로그램이 종료되는 것입니다.

Playground

Playground는 다르게 동작합니다:

  1. 기본적으로 비동기 작업의 결과를 보여주기 위해 설계됨
  2. 코드 실행 후에도 곧바로 종료되지 않고 일정 시간 대기
  3. "Enable Results" 옵션이 활성화되어 있으면 비동기 작업의 결과까지 기다림

이런 차이 때문에 같은 코드라도 커맨드 라인 툴에서는 비동기 작업이 실행되기 전에 종료되고, Playground에서는 비동기 작업까지 기다리게 됩니다.


 

이렇다고 합니다.. 다들 그래서 플레이그라운드를 쓰는 것 같은데, 플레이그라운드에서 느꼈던 문제인 readLine()함수를 원활하게 쓰려면 command line tool로 쓰고 이런 부분에서는 플레이그라운드가 나으니 상황에 맞춰 쓰는게 확실히 좋을 듯


알고리즘으로도 글을 쓰고 싶은데 내게 고난이도인 문제들을 분석하는데에 시간을 많이 쓰고 이를 글로 쓰려니 뭔가 날로 먹는 느낌이라 차근차근 들어가는 이론들부터 따로 시간 들여서 공부해 넣어볼까한다..

 

탈출 클로저의 개념을 다시 한 번 잡을 수 있는 좋은 기회였다.

'iOS > Swift' 카테고리의 다른 글

[TIL / 25.03.24] UIKit No Storyboard 초기 세팅  (0) 2025.03.24
[TIL / 25.03.20] 최적화(OptimizationTips) 2  (0) 2025.03.20
[TIL / 25.03.18] 최적화(OptimizationTips) 1  (5) 2025.03.18
[TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)  (0) 2025.03.17
[TIL / 25.03.13] 의존성 주입 (Dependency Injection)  (0) 2025.03.13
'iOS/Swift' 카테고리의 다른 글
  • [TIL / 25.03.24] UIKit No Storyboard 초기 세팅
  • [TIL / 25.03.20] 최적화(OptimizationTips) 2
  • [TIL / 25.03.18] 최적화(OptimizationTips) 1
  • [TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)
subkyu-ios
subkyu-ios
subkyu-ios 님의 블로그 입니다.
  • subkyu-ios
    subkyu-ios 님의 블로그
    subkyu-ios
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • iOS (38)
        • Swift (38)
      • 내일배움캠프 (7)
      • Git, Github (3)
      • Algorithm (6)
      • 회고 (1)
      • 면접 질문 정리 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    사전캠프
    알고리즘
    tabman
    프로그래머스
    TableView
    til
    ios
    KPT
    github
    회고
    Wil
    UIKit
    stackview
    트러블슈팅
    본캠프
    Swift
    RxSwift
    내일배움캠프
    의존성 주입
    algorithm
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
subkyu-ios
[TIL / 25.03.19] playground, command line tool에서의 비동기 함수 (feat. escaping closure)
상단으로

티스토리툴바