You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
*본 글은 WWDC 를 보고, 번역 및 요약 그리고 실행해보는 스터디 프로젝트의 일환입니다.
들어가며
비동기 프로그래밍은 많은 사람들에게 Regular한(일상적인) 활동입니다. 이런 상황에서 장황 · 복잡 · 부정확한 비동기 코드를 작성하는 것은 너무 쉽습니다. Swift의 async/await을 이용하면 일반적인 코드를 작성하는 것처럼 쉽게 비동기 코드를 작성할 수 있습니다.
실험) preparingThumbnail 함수를 이용했을 때, 메모리 오버헤드를 얼마나 줄일 수 있을까요? 매우 큰 이미지를 전체 크기로 디코딩 했을 때 발생하는 오버헤드를 줄여봅시다.
iOS 15부터 생긴 메서드를 이용해보기 위해서 프로젝트를 하나 만들었습니다. 그리고 간단한 테스트를 위해서 Image를 하나 넣어줬어요.
Image 사이즈는 보시다시피 매우 큽니다.
휴대폰 사이즈와는 비교도 안 되는 픽셀 사이즈를 가지고 있죠. 그래서 분명 사이즈 조정이 필요할 것입니다. 간단하게는 ImageView의 ContentMode를 조정하여 View의 크기에 맞춰버리는 방식이 있을텐데요. 그것은 나의 휴대폰에게 너무나 미안한 일입니다. 메모리 어떡해 🥲
근데 너무나 고맙게 위에서 소개한 메서드를 이용하면 메모리 오버헤드를 줄일 수 있다고 합니다. View의 bounds를 넘어가는 엄청난 크기의 원본 이미지가 있다면 thumbnail 메서드를 이용해서 특정 사이즈로 줄일 수 있다고 하네요. 바로 코드를 작성해보았습니다.
간단하게 UIImageView를 올렸구요. 코드도 이어서 보여드리겠습니다. 간단한 테스트를 위해서 그냥 원본 이미지를 디코딩 해줬을 때랑, Thumbnail 함수로 사이즈를 줄인 이미지를 디코딩 해주었습니다.
Thumbnail(축소판)이미지를 넣었을 때 입니다. 이미지 1개인데 메모리 사용량 3배 차이 실화입니까..? 아찔하네요. 정말 풀 사이즈의 이미지를 디코딩하는 오버헤드를 많이 줄일 수 있네요. 실험 성공!
Functions: synchronous and asynchronous
함수를 동기적으로 호출하면, 스레드가 Blocked(차단)되어 해당 함수가 완료되기를 기다립니다. 예를 들어 우리가 만든 fetchThumbnail 함수가 UIKit이 제공하는 prepareThumbnail이라는 동기 함수를 호출하면 이 작업이 완료될 때까지 스레드는 다른 작업을 수행할 수 없게 되는 거죠.
반대로, prepareThumbnail의 비동기 버전도 있는데요. 작업이 진행되는 동안 스레드는 자유롭게 다른 작업을 수행할 수 있습니다. 완료되면 Completion Handler를 호출하여 알려줍니다.
SDK는 많은 비동기 기능을 제공합니다. 일부는 Completion handler를 사용하거나, 다른 것들은 Delegate Callback에 의지합니다. 그리고 많은 것들이 비동기로 표시되고 값만 반환합니다.
이러한 비동기 함수의 공통점은 함수를 호출하면 스레드가 빠르게 unblock(차단 해제)되어 작업이 시작됩니다. 그렇게 하면 장기간 실행되는 작업(예를 들어 네트워크 통신, 다운로드 등의 작업)이 완료되는 동안 다른 작업을 수행할 수 있습니다.
Use Async/Await
Safer, Simpler, Reflect your intent
다음 3가지 키워드로 장점을 이야기하고 있습니다.
문법정리
throws ↔️ async : 함수가 에러를 던질 수 있다는 의미 ↔️ 함수가 비동기적으로 실행, 일시 중단 될 수 있음을 의미
try ↔️ await : 에러를 던질 수 있는 위치를 가리킴 ↔️ 일시 중단 될 수 있는 위치를 가리킴
// Photo.swift
import Foundation
structPhoto:Decodable{letid:Stringletwidth:Intletheight:Intleturls:PhotoURLDescriptionletlikes:Int}structPhotoURLDescription:Decodable{letraw:Stringletfull:String}
The text was updated successfully, but these errors were encountered:
WWDC21) Meet async/await in Swift
Meet async/await in Swift
*본 글은 WWDC 를 보고, 번역 및 요약 그리고 실행해보는 스터디 프로젝트의 일환입니다.
들어가며
비동기 프로그래밍은 많은 사람들에게
Regular
한(일상적인) 활동입니다. 이런 상황에서 장황 · 복잡 · 부정확한 비동기 코드를 작성하는 것은 너무 쉽습니다. Swift의 async/await을 이용하면 일반적인 코드를 작성하는 것처럼 쉽게 비동기 코드를 작성할 수 있습니다.on top of that
- 덧붙이자면thumbnail
- 축소판 (사진의 축소판을 의미)UIKit - UIImage
iOS 15.0
이상부터 UIImage의 축소판(Thumbnail)을 리턴해주는 인스턴스 메서드를 제공합니다.실험) preparingThumbnail 함수를 이용했을 때, 메모리 오버헤드를 얼마나 줄일 수 있을까요? 매우 큰 이미지를 전체 크기로 디코딩 했을 때 발생하는 오버헤드를 줄여봅시다.
휴대폰 사이즈와는 비교도 안 되는 픽셀 사이즈를 가지고 있죠. 그래서 분명 사이즈 조정이 필요할 것입니다. 간단하게는 ImageView의 ContentMode를 조정하여 View의 크기에 맞춰버리는 방식이 있을텐데요. 그것은 나의 휴대폰에게 너무나 미안한 일입니다. 메모리 어떡해 🥲
근데 너무나 고맙게 위에서 소개한 메서드를 이용하면 메모리 오버헤드를 줄일 수 있다고 합니다. View의 bounds를 넘어가는 엄청난 크기의 원본 이미지가 있다면 thumbnail 메서드를 이용해서 특정 사이즈로 줄일 수 있다고 하네요. 바로 코드를 작성해보았습니다.
간단하게 UIImageView를 올렸구요. 코드도 이어서 보여드리겠습니다. 간단한 테스트를 위해서 그냥 원본 이미지를 디코딩 해줬을 때랑, Thumbnail 함수로 사이즈를 줄인 이미지를 디코딩 해주었습니다.
원본이미지를 넣었을 때입니다.
Thumbnail(축소판)이미지를 넣었을 때 입니다. 이미지 1개인데 메모리 사용량 3배 차이 실화입니까..? 아찔하네요. 정말 풀 사이즈의 이미지를 디코딩하는 오버헤드를 많이 줄일 수 있네요. 실험 성공!
Functions: synchronous and asynchronous
함수를 동기적으로 호출하면, 스레드가 Blocked(차단)되어 해당 함수가 완료되기를 기다립니다. 예를 들어 우리가 만든 fetchThumbnail 함수가 UIKit이 제공하는 prepareThumbnail이라는 동기 함수를 호출하면 이 작업이 완료될 때까지 스레드는 다른 작업을 수행할 수 없게 되는 거죠.
반대로, prepareThumbnail의 비동기 버전도 있는데요. 작업이 진행되는 동안 스레드는 자유롭게 다른 작업을 수행할 수 있습니다. 완료되면 Completion Handler를 호출하여 알려줍니다.
SDK는 많은 비동기 기능을 제공합니다. 일부는 Completion handler를 사용하거나, 다른 것들은 Delegate Callback에 의지합니다. 그리고 많은 것들이 비동기로 표시되고 값만 반환합니다.
이러한 비동기 함수의 공통점은 함수를 호출하면 스레드가 빠르게 unblock(차단 해제)되어 작업이 시작됩니다. 그렇게 하면 장기간 실행되는 작업(예를 들어 네트워크 통신, 다운로드 등의 작업)이 완료되는 동안 다른 작업을 수행할 수 있습니다.
Use Async/Await
문법정리
Async Properties
Async Sequence
동작 원리
1️⃣ 일반 함수의 동작 원리 : 비동기 기능은 일시 중단될 수 있다.
2️⃣ 비동기 함수의 동작 원리
Async/await facts
실습해보기
The text was updated successfully, but these errors were encountered: