https://developer.apple.com/documentation/Xcode/Xcode-Cloud
지속적인 통합과 배포 서비스
를 제공한다고 한다.
TestFlight가 앱을 빌드하고 배포하면
테스터가 App Store Connect를 통해 피드백을 보낼 수 있다.
Code Signing in the Cloud 앱 서명을 최신으로 만들어준다고 한다.
현재는 베타 버전이 나와있으며
가격과 일정은 가을에 정해진다고 한다
내년(2022)에 상용 버전이 나올 거라고 한다.
▼ 베타버전 신청하는 링크 ▼
https://developer.apple.com/xcode-cloud/beta/
스위프트 언어
함수가 호출되면 await키워드를 사용해 async 함수의 결과를 기다리는 동안 다른 작업을 할 수 있다
func loadImage(at url: URL) async -> Image
let image = await loadImage(at: url)
warm up - fetch stage scenery - set stage
func prepareForShow(completion: @escaping (Result<Scene, Error>) -> Void) {
danceCompany.warmUp(duration: .minutes(45)) { result in
switch result {
case .success(let dancers):
self.crew.fetchStageScenery { scenery in
self.setStage(with: scenery) { openingScene in
dancers.moveToPosition(in: openingScene) { result in
completion(result)
}
}
}
case .failure(let error):
completion(.failure(error))
}
}
}
func prepareForShow() async throws -> Scene {
let dancers = try await danceCompany.warmUp(duration: .minutes(45))
let scenery = await crew.fetchStageScenery()
let openingScene = setStage(with: scenery)
return try await dancers.moveToPosition(in: openingScene)
}
//조건 추가
func prepareForShow() async throws -> Scene {
let dancers = try await danceCompany.warmUp(duration: .minutes(45))
let scenery = isStudioRehearsal? await crew.fetchPracticeScenery() : await crew.fetchStageScenery()
let openingScene = setStage(with: scenery)
return try await dancers.moveToPosition(in: openingScene)
}
동시성 코드의 추론이 쉬워진다
async let/ await
부모 작업과 동시적으로 실행되는 자식 작업을 생성
func prepareForShow() async throws -> Scene {
async let dancers = danceCompany.warmUp(duration: .minutes(45))
async let scenery = crew.fetchStageScenery()
let openingScene = setStage(with: await scenery)
return try await dancers.moveToPosition(in: openingScene)
}
안전한 동시성 프로그래밍 모델
상호 배타적 접근만을 제공해서 고유의 상태를 보호하는 오브젝트
동시성 프로그램에서 공유 상태를 안전하게 모델링해준다
class StageManager {
var stage: Stage
let queue = DispatchQueue(label: "stage") // 수동으로 인스턴스 생성
func setStage(with scenery: Scenery, completion: @escaping (Scene) -> Void) {
queue.async { // 수동으로 인스턴스 생성
self.stage.backdrop = scenery.backdrop
for prop in scenery.props {
self.stage.addProp(prop)
}
completion(self.stage.currentScene)
}
}
}
actor StageManager {
var stage: Stage
func setStage(with scenery: Scenery) -> Scene {
stage.backdrop = scenery.backdrop
for prop in scenery.props {
stage.addProp(prop)
}
return stage.currentScene
}
}
let scene = await stageManager.setStage(with: scenery)
현재 메인 스레드 비동기를 위해 수동으로 코드 작성했지만
DispatchQueue.main.async
앞으로는 @MainActor
어노테이션만 붙이면 된다
@MainActor
func display(scene: Scene)
await display(scene: scene) //함수 호출
save라는 API처럼 이미 비동기로 작성된 많은 API가 SDK를 점검해 비동기 API가 async/await를 사용 가능하게 된다
func save(_ object: HKObject, withCompletion competion: @escaping (Bool, Error?) -> Void)
▼
func save(_ ojbect: HKObject) async throws
URL 작업이나 비동기 I/O 작업에 사용할 수 있고
파일 전체의 라인별 비동기적 반복 처리를 지원한다
for try await line in url.lines {
// process each line
}
프레임워크
swiftUI로 앱을 만들면 처음에 이렇게 나오는데 이게 그 뜻이구나
액세스 포인트인 메인 함수가 내 앱에 접근하면 윈도우에 Hello, world!를 보여준다는 뜻이었구나
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
Text("Hello, world!")
}
}
}
이 Mac에 관하여 -> 시스템 리포트 -> 소프트웨어 -> 개발자
Xcode를 설치하면 여러가지 sdk가 다운받아지는데
나는 주로 iOS의 SDK를 사용한다.
프레임워크와 내장된 API, 디버거 등을 포함한 소프트웨어 개발 툴을 활용해 개발을 한다고 생각하면 된다.
RealityKit
Object Capture로 3D모델 생성하기
52분~