iOS 55

Vision Framework로 얼굴인식하기

Notion 블로그에 작성되어 있던 포스트 입니다. Notion의 접속 속도가 느려 medium 블로그에 다시 정리하게 되었습니다. 기존의 노션링크로도 읽어보실 수 있습니다. 되새김 프로젝트 중 사용자가 다이어리에 등록한 이미지로 얼굴인식을 하고 모자이크 처리하는 부분을 담당하게 되었습니다. 얼굴을 인식하기 위해서 애플에서 기존에 제공하는 기능이 있습니다. 그중에서 이번에는 Vision Framework를 사용하게 되었습니다. Vision Framework 에서는 얼굴인식 뿐만이 아니라 사각형, 바코드, 텍스트 등등 여러가지 기능을 기본적으로 제공하고 있었습니다. 개인적으로 경험해본 이후로의 생각은 프레임워크를 이용해서 인식시키는 작업은 그다지 어렵지 않았지만 결과로 나온 데이터를 사용자에게 어떻게 표현..

iOS 2023.05.05

이미지 다운샘플링 해보기

이전 포스팅인 WWDC18 — Image and Graphics Best Practice 에서 이미지 메모리의 사용량을 줄이기 위해서는 UIGraphicsImageRenderer나 Image I/O를 사용하는 방법을 소개 받았습니다. 이번에는 저의 실제 사례에 적용시켜보는 시간을 가져보도록 하겠습니다. 먼저 아래와 같은 3.6MB의 파일 사이즈를 가지는 이미지를 사용하였습니다. 위와 같은 이미지를 UIImage로 불러오고 UIImageView로 바로 렌더링 하니 메모리 사용량은 다음과 같았습니다. 위와 같은 3MB 크기의 이미지를 화면에 띄웠더니 다음과 같이 메모리의 사용량이 24.9MB 에서 108MB가 된것을 볼 수 있습니다. 고작 3MB 짜리 이미지를 화면에 띄웠을 뿐인데 왜 이렇게 메모리를 많이 ..

iOS 2023.05.05

Swift와 경쟁상황(Race Condition)

Race Condition이란 두개이상의 스레드가 같은 자원에 접근하는 것을 말한다. 그렇다면 Swift에서 Race Condition이 없는 Thread Safe한 코드는 어떻게 작성할 수 있을까? Thread Safe한 코드를 구현한다고 생각하면, OS 수업시간에 배웠던 Lock, Semaphore가 먼저 생각난다. 하지만 Lock으로 올바르게 구현하기 어렵고, 교착상황(Deadlock)이 생길 가능성이 높은, 낮은 수준의 해결책이라고 한다. Concurrency in Swift: Reader Writer Lock Concurrency & Thread Safety in Swift 먼저 Race Condition이 발생했는지 어떻게 알 수 있는지부터 살펴보고, Race Condition이 발생했을 때 ..

iOS 2023.05.05

MapKit 맵뷰 메모리 절약하기

몇달 전 네이버 부스트캠프 되새김 애플리케이션을 개발하면서 사용자가 작성한 다이어리를 위치정보와 함께 저장해 맵뷰의 어노테이션(Annotation)으로 보여주도록 하는 기능을 개발하였습니다. 위의 GIF는 당시 상황을 설명하기 위해서 찍어둔 예시입니다. 맵뷰는 안그래도 메모리를 많이 사용하게 되는데, 탭바에서 다른 탭으로 이동하였음에도 맵뷰가 해제되지 않고 메모리에 그대로 남아있는 것을 볼 수 있습니다. 이 맵뷰의 메모리를 줄이기 위해서 두가지 방법을 찾았습니다. 맵뷰의 타입을 바꾼다. 탭바에서 다른 탭을 선택하게 될때마다 기존에 존재하던 맵뷰를 메모리에서 해제해준다. 맵의 타입을 바꾸기 첫번째 방법은 mapType 프로퍼티를 조작해 맵이 보여지는 방법을 조작하는 방법입니다. 예를들어 mapType을 다..

iOS 2023.05.05

Core Image 이용하여 이미지에 필터를 적용해보기

이미지에 필터를 적용하는 작업은 이미 여러번 프로젝트를 거치면서 경험해보았다. 특히 네이버 부스트캠프 프로젝트를 진행하면서 사람의 얼굴에 모자이크 처리를 해주는 기능을 넣었기 때문에 이미 Core Image, CIFilter를 통해서 이미지 필터를 처리하는 과정을 경험했다. 하지만 Core Image가 뭐죠? 처리된 이미지란 무엇일까요? 필터를 이용해서 이미지를 처리하는 과정에 대해서 말해주세요 같은 질문들을 받는 다고 생각하니 정제되지 못한 답변을 말하게 되는 것 같아서 Xcode Playground를 이용해 간단하게 필터처리를 해보고 그 내용을 정리해보려 한다. 먼저 이미지를 처리한다는 것을 무엇을 의미할까? 이미지를 처리한다는 것은 이미지에 필터를 적용하는 것을 말한다. input 이미지를 픽셀단위..

iOS 2023.05.05

WWDC18 — Image and Graphics Best Practice

WWDC18 Image and Graphics Best Practice 에서는 주로 기기를 사용할 때 부족해지는 리소스는 메모리와 CPU의 사용에 초점을 맞춥니다. 애플리케이션이 많은 CPU를 사용하게 되면 배터리의 수명과 애플리케이션의 응답성에 부정적인 영향을 미치는 것은 다들 알고 있습니다. 하지만 애플리케이션과 시스템이 메모리를 많이 사용하게 되면 CPU 사용률도 증가하게 되고 이는 배터리 수명과 성능에 나쁜 영향을 미치게 된다는 것은 잘 모르는 경향이 많습니다. 이런 리소스를 어떻게 아낄 수 있는지 개선하는 방법에 중점을 두고 설명하고 있습니다. 그리고 사진 앱처럼 사진 콘텐츠와 함께 동작하는 애플리케이션이 이러한 문제를 설명할 때 가장좋은 예시라고 하면서 사진을 편집하는 과정에 대해서 보여주었습..

iOS 2023.05.05

디스패치 큐(GCD) 사용시 주의해야 할 점

디스패치 큐를 그럼 마음대로만 쓰고싶은대로 사용하면 되는 것일까?🤔 분명 그런 것은 아닐 것이다. 어떤 경우에는 이건 쓰면 안되고...저걸써야하고...이런것은 하면안되고 이러한 규칙이 반드시 있을 것이다. 이번에는 디스패치 큐를 사용해야 할 때 주의해야할 점에 대해서 알아보자 📝 UI관련 작업은 반드시 메인 큐에서 처리한다 UI관련작업은 반드시 메인큐(DispatchQueue.main)에서 처리해야한다. 1번쓰레드는 계산등 다른 작업도 하지만 주로 화면 출력을 담당하고 있다. 모든 OS가 거의 그렇지만 화면을 표시하는 작업은 하나의 쓰레드에서 이루어진다. 만약 화면을 표시하는 작업이 여러쓰레드에 분산되어 이루어진다면 화면간에 간섭이 일어나거나 깜빡이는 현상이 발생할 수 있으니 주의하자 또한 작업 전체가 ..

디스패치 큐(Dispatch Queue)의 종류와 특성

이번에는 GCD 디스패치 큐의 종류에 대해서 알아보자!! 디스패치 큐의 종류에는 다음 세가지가 있다. (글로벌)메인 큐 글로벌 큐 프라이빗(커스텀) 큐 이렇게 대기열(큐) 의 종류가 많은데 이 세가지에 대해서 차근차근 알아보자~~ 📝 main Queue 메인 큐는 유일하게 메인쓰레드 하나로 동작한다. 작업을 main 쓰레드로 비동기적으로 보낸다는 표현은 다음과 같다. DispatchQueue.main.async { //작업 } 예를 들어서, Swift의 print()문은 무조건 1번쓰레드에서 수행되기 때문에 아래와 같은 의미가 숨겨져 있다. DispatchQueue.main.sync { print("프린트 합니다 ~.~"); } print()문은 main 쓰레드에서 실행되기 때문이다 하지만!! 실제로 저..

직렬(Serial) vs 동시(Concurrent)

이 포스트는 인프런 Allen님의 iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해 강의를 정리한 것입니다. iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션 동시성(Concurrency)프로그래밍 - iOS프로그래밍에서 필요한 동기, 비동기의 개념 및 그를 확장한 GCD 및 Operation에 관한 모든 내용을 다룹니다., - 강의 소개 | 인프런... 직렬(Serial)과 동시(Concurrent)는 큐의 특성에 관한 이야기이다. 아래와 같은 그림처럼 작업이 큐에 담겨져 있다고 할때 Serail이란 단 하나의 다른 스레드로만 보내는 특성을 ..