letswiftconf / newsletter

레츠스위프트 뉴스레터 아카이브
MIT License
447 stars 10 forks source link

제19호(2020년 11월 08일 발행) #22

Closed godrm closed 3 years ago

godrm commented 3 years ago

스위프트 로드맵에 대하여 https://medium.com/@jungkim/스위프트-동시성-로드맵에-대하여-about-swift-concurrency-roadmap-ccf651c09c4c

스위프트 동시성 로드맵에 대하여 About Swift Concurrency Roadmap

지난 2주동안 스위프트 포럼에서 가장 뜨거운 것은 바로 스위프트 동시성 로드맵이었습니다. https://forums.swift.org/t/swift-concurrency-roadmap/41611

자연스럽게 애플 코어팀에서 주도하고 있으며, 크리스 레트너가 거의 3년전에 작성한 선언문(manifesto)보다 작은 범위에 집중하고 있습니다. 코어 내부에서 꽤 구체적으로 구현 방향을 잡고 시작했다는 의미입니다. 당장은 방향성에 대한 문서와 테스트 코드부터 PR이 올라왔을 뿐입니다. 컨트리뷰터들이 댓글로 다양한 관점에서 꽤 깊이있는 제안을 주고 받고 있습니다.

이번 로드맵의 목표는 다음과 같습니다.

위의 작업은 두 단계로 진행될꺼라고 합니다. 우선 1단계에서는 async 문법과 actor 타입을 지원하도록 구현해서 코드를 개선할 수 있도록 합니다. 그 이후 2단계에서 데이터 레이싱 문제를 해결하기 위해서 actor 분리(isolation) 등 효율성을 개선한다고 하네요. 로드맵 문서상에는 for 반복문에서 병렬 처리처럼 2단계에서 해야할 것은 구체적으로 설명하지 않고 열어놓았습니다. 그래서 댓글에서 논의를 계속하다가 크리스 레트너가 지난 주말에 Protocol-based Actor Isolation 에 대한 제안 글을 올렸습니다. https://docs.google.com/document/d/1OMHZKWq2dego5mXQtWt1fm-yMca2qeOdCl8YlBG1uwg/edit# 이 부분은 추가적으로 논의가 될 것으로 보입니다.

기본 문법 아이디어

비동기로 동작하는 다음과 같은 함수를 예제 코드로 살펴보죠.

class PlayerRefreshController {
    var players: [String] = []
    var gameSession: GameSession
    var refreshQueue = DispatchQueue(label: "PlayerRefresh")

    internal func refreshPlayers(completion: (() -> Void)? = nil) {
        refreshQueue.async {
            self.gameSession.allPlayers { players in
                self.players = players.map(\.nickname)
                completion?()
            }
        }
    }
}

예제 코드에 refreshQueue가 포함된 것처럼, 이번 논의에서 제안한 동시성의 상당 부분은 GCD(libDispatch 오픈소스)와 관련이 있습니다. 직간접적으로 동시성 코드가 DispatchQueue를 활용한다고 가정하고 있습니다. 여기서 refreshPlayers() 함수는 self.players에 값을 넣기 위한 refreshQueue에 async로 넘긴 비동기 함수이며, 끝난 시점을 알기 위해서 completion 핸들러를 호출합니다. 이런 비동기 함수를 앞으로는 이렇게 쓰고 싶다는 겁니다. 아래처럼 작성하면 위와 같은 코드로 동작하게 된다는 겁니다.

internal func refreshPlayers() async {
  players = await gameSession.allPlayers().map(\.nickname)
}

여기에 덧붙여서 class PlayerRefreshController가 private queue를 가지면서 내부 속성을 해당 큐에서만 접근하도록 하기 위해서 actor 클래스를 제안합니다.

actor class PlayerRefreshController {
  var players: [String] = []
  var gameSession: GameSession

  func refreshPlayers() async { ... }
}

DispatchQueue.main에서 UI를 처리해야 하는 경우는 actor 중에서 특별한 UIActor가 처리하도록 지정할 수도 있습니다.

@UIActor
class PlayerRefreshController {
  var players: [String] = []
  var gameSession: GameSession

  func refreshPlayers() async {  ...  }
}

이렇게 선언하면 컴파일러가 확인해서, 이 클래스를 참조해서 호출하는 경우는 글로벌 UI Actor로 메인 스레드에서 동작하게 됩니다.


보다 자세한 내용은 블로그에서 확인할 수 있습니다.

godrm commented 3 years ago

일반

앱 스토어에 처음 앱을 올리면서 배운 20가지 https://medium.com/swlh/20-lessons-learned-from-my-first-ios-app-in-the-app-store-6e646d760283

아이폰 12 화면 대응하기 https://hacknicity.medium.com/how-ios-apps-adapt-to-the-various-iphone-12-screen-sizes-e45c021e1b8b

iOS 개발자가 꼭 알아야 하는 것들 https://medium.com/swlh/things-you-should-definitely-know-as-an-ios-developer-part-1-dbfadc5fd5ed

스토리보드 수정하고 충돌 피하기 https://medium.com/swlh/avoid-merge-conflicts-storyboard-edition-2a02ceadaf6c

터미널에서 활용하는 스위프트 관련 10가지 팁 https://medium.com/better-programming/10-tips-to-run-swift-from-your-terminal-b5832cd9cd8c

언어 : Swift

유용한 파운데이션 타입들 https://medium.com/better-programming/useful-and-obscure-foundation-types-in-swift-4f2b2c42354e

스위프트에서 C++ 코드 연결하기 https://medium.com/@anuragajwani/how-to-consume-c-code-in-swift-b4d64a04e989

코틀린처럼 When-Then-Else 스타일로 흐름제어하기 https://medium.com/swlh/swift-control-flow-with-when-then-else-79e5c933e40c

lazy 키워드 설명 https://ayusinghi96.medium.com/lazy-keyword-swift-5-ios-eae3dde18a80

Objective-C와 스위프트 섞여있을 때 컴파일 시간 https://levelup.gitconnected.com/compilation-time-that-mixing-objective-c-with-swift-d5adab04c5d

스위프트에서 파이썬 임포트하기 https://towardsdatascience.com/from-swift-import-python-f2fc2a997d4

스위프트 String 자알~ 다루기 https://periclesterto.medium.com/swift-strings-organization-good-practices-37ba694c5e11

설계 구조 : 패턴

스토리보드를 이용해서 MVVM 의존성 주입하기 https://stevenpcurtis.medium.com/mvvm-dependency-injection-using-storyboards-b87c9dc69545

Redux 구조를 스위프트로 구현하기 https://medium.com/insertgif/porting-redux-architecture-to-swift-well-for-a-toy-macos-app-anyway-ed61bad0395c

뷰 프로그래밍 : SwiftUI

SwiftUI 필수 핵심 가이드 https://medium.com/better-programming/quick-guide-on-swiftui-essentials-8ba8fe007bcd

스위프트UI로 맥 메뉴바에 키보드 숏컷 구현하기 https://itnext.io/swiftui-keyboard-shortcuts-and-menu-bar-be22abbb3791

SwiftUI와 Combine으로 MVVM-Router 구조 구현하기 https://medium.com/better-programming/swiftui-combine-welcome-to-the-mvvm-router-f4f497a05e6d

SwiftUI 2 앱 라이프 사이클 완벽 가이드 https://medium.com/better-programming/the-ultimate-guide-to-the-swiftui-2-application-life-cycle-e4358e27a92a

레이싱 막대 그래프 만들기 https://medium.com/better-programming/a-bar-chart-race-using-swiftui-2-0-ef84dc68b678

레이아웃 맞춤(alignment) 가이드 https://medium.com/better-programming/layout-in-swiftui-with-alignment-guides-fef821e7e06e

상태 관리 기초 https://mykola-harmash.medium.com/swiftui-state-management-fundamentals-5b28d2522e4d

맞춤형 액티비티 인디케이터 구현하기 https://mojtabahs.medium.com/implement-custom-activity-indicator-in-the-swiftui-9e0f3d4155e4

카메라 앱 구현하기 https://medium.com/better-programming/effortless-swiftui-camera-d7a74abde37e

반복 애니메이션 구현하기 https://medium.com/better-programming/repeating-animation-in-swiftui-8597e56a6df9

멀티 새그먼트 피커 구현하기 https://medium.com/better-programming/how-to-multi-segment-picker-in-swiftui-9c5b909971f5

프레임워크

Diffable Data Source 활용하기 https://medium.com/better-programming/adopt-diffable-data-sources-with-ease-85fc128ca6bc

코어데이터에 Transformable로 UIColor와 배열 저장하기 https://levelup.gitconnected.com/saving-uicolor-and-array-in-coredata-using-transformable-4fb906d0a553

UIScrollView에 코드로 이미지 추가하기 https://medium.com/swlh/swift-5-how-to-programmatically-add-images-to-a-uiscrollview-ee5b97aa2e00

iOS14에서 UICollectionView로 List 만들기 https://levelup.gitconnected.com/creating-lists-with-uicollectionview-in-ios-14-89d5fdc880af

코어 데이터로 영구저장소 변경 이력 관리하기 https://medium.com/better-programming/persistent-history-tracking-in-core-data-f44ab39691ed

Combine 시작하기 https://medium.com/dev-genius/learn-combine-by-code-55e661a5256c

비전 프레임워크 활용하기 https://medium.com/academy-eldoradocps/vision-framework-for-ios-an-introduction-78d02c3e1ef

UIBezierPath로 선 그리기 https://medium.com/swlh/line-segments-with-uibezierpath-ac793982740b

reuseIdentifier 미스터리 풀기 https://medium.com/swlh/reuseidentifier-8d7ba8f822c2

Combine Publisher 연결하거나 합치기 https://www.swiftbysundell.com/articles/connecting-and-merging-combine-publishers-in-swift/

AVAudioEngine으로 녹음하고 압축하기 https://arvindhsukumar.medium.com/using-avaudioengine-to-record-compress-and-stream-audio-on-ios-48dfee09fde4

백그라운드에서 업로드/다운로드 구현하기 https://medium.com/swlh/demystifying-background-uploads-downloads-in-ios-53f5ba465f0b

개발환경

플레이그라운드에서 Swift Package 임포트하기 https://medium.com/better-programming/import-a-swift-package-into-a-playground-1bb650e196b0

XCFrameworks 소개 https://medium.com/dev-jam/xcframeworks-new-format-of-packaging-frameworks-in-ios-306cda40b24f

인터페이스 빌더에 대한 정리 https://medium.com/swlh/a-bit-about-interface-builder-ceffaf484580

테스트

비동기 코드 단위 테스트하기 https://www.vadimbulavin.com/unit-testing-async-code-in-swift

코어 데이터 테스트하기 https://stevenpcurtis.medium.com/core-data-basics-testing-39d127380680

네트워크 로직 테스트하기 https://www.swiftbysundell.com/articles/testing-networking-logic-in-swift/

오픈소스

RxSwift로 테스트가능하고, 반응형인 네트워크 RxRepository 구현하기 https://medium.com/@tiagojanela/rxrepository-building-a-testable-reactive-network-data-repository-using-rxswift-part-1-82b9ab130a1

godrm commented 3 years ago

19호 발행했습니다. https://stib.ee/9Xe2