TECH RAFA
/
UIKit (10)
Search
Share
UIKit (10)
Gallery
List
Search
All Posts
앱의 생명 주기는 앱이 실행되면서 겪는 상태 변화를 의미합니다. 이 생명 주기는 iOS 시스템에 의해 관리되며 앱이 사용되거나 백그라운드로 이동할 때마다 특정 이벤트가 발생합니다. 이를 통해 앱이 적절한 시점에 필요한 작업을 수행할 수 있도록 도와줍니다.
목차
1.
앱의 생명 주기 상태
2.
앱의 생명 주기 상태 변화를 알리는 메서드
3.
앱의 생명 주기와 성능 최적화
앱의 생명 주기 상태
앱은 크게 다섯 가지 상태로 다음과 같이 나눌 수 있습니다.
•
Not Running
•
Inactive
•
Active
앱의 생명주기
TIL
UIKit
Lifecycle
목차
1.
init
2.
loadView
3.
viewDidLoad
4.
viewWillAppear
5.
viewDidAppear
6.
viewWillDisappear
7.
viewDidDisappear
8.
deinit
9.
실습
뷰 컨트롤러의 생명주기
TIL
UIKit
Lifecycle
기본 설정 및 UISearchController 구성
•
searchResultsUpdater 프로퍼티를 현재 클래스(self)로 설정하여 사용자가 검색 바에 입력할 때마다 결과 업데이트
•
검색 중에 배경을 흐리게 하지 않음
•
내비게이션 바를 숨기지 않음
•
자동 대문자 비활성화
•
자동 수정 비활성화
•
맞춤법 검사 비활성화
검색 모드
이 계산 속성은 사용자가 검색 중인지 아닌지를 파악하여 해당 상태에 따라 테이블 뷰에 표시될 데이터를 결정한다.
inSearchMode가 true일 때 사용자는 검색을 활성화하고 검색어를 한 글자 이상 입력한 상태이다. 이 경우, SearchController는 filteredUsers 배열을 사용하여 테이블 뷰를 채운다. 이 배열에는 사용자의 검색 조건에 부합하는 사용자 데이터만 포함되어 있다.
사용 이유
이 속성을 사용하는 이유는 사용자가 어떻게 데이터를 보고 싶어하는지, 즉 전체 목록을 보고 싶은지 아니면 특정 조건을 만족하는 항목만 보고 싶은지를 파악하기 위함이다. 이를 통해 앱은 사용자 경험을 개선하고 필요한 정보만을 효율적으로 제공할 수 있다.
isSearchMode를 활용한 동적 테이블 뷰 데이터 처리
검색 및 필터링 기능 구현하기
TIL
UISearchController
filtering
UIKit
Firestore를 통한 비동기적 사용자 데이터 로딩
Firestore 데이터베이스에서 사용자 데이터를 비동기적으로 가져오는 역할을 한다. 이 메서드는 완료 핸들러를 파라미터로 받아 데이터베이스에서 데이터를 성공적으로 로드한 후 필요한 동작을 실행할 수 있게 해준다.
•
타입 메서드(static)로 정의함으로써 UserService의 인스턴스를 생성하지 않고도 호출할 수 있다.
•
COLLECTION_USERS.getDocuments
는 Firestore에서 ‘users’ 컬렉션의 모든 문서를 가져오는 비동기적으로 가져온다.
•
guard let
구문을 사용하여 snapshot 객체가
nil
인 경우 함수를 더 이상 진행하지 않고 종료한다. 이는 데이터가 없거나 조회에 실패했을 때의 안전한 처리를 위함이다.
•
snapshot.documents.map
을 사용하여 각 문서를 User 모델 객체로 변환한다. 여기서
User(dictionary: $0.data())
는 Firestore 문서의 데이터를 이용하여
User
객체를 초기화한다.
•
completion(users)
는 변환된 사용자 배열을 완료 핸들러를 통해 반환한다. 이를 통해 함수를 호출한 곳에서 사용자 데이터를 사용할 수 있게 된다.
다음 코드는 UserService를 통해 사용자 데이터를 가져오고 UI를 업데이트한다.
fetchUsers 메서드는 UserService를 통해 사용자 데이터를 비동기적으로 가져온다. 이 과정에서 몇 가지 주요 단계를 거친다.
•
데이터 로딩 시작: fetchUsers는 네트워크를 통해 사용자 데이터를 요청한다. 이때 users 배열은 초기 상태에서 빈 배열로 시작된다.
•
데이터 로딩 완료: 비동기적으로 데이터가 로딩 완료되면 이 데이터는 users 배열에 저장된다. 배열은 비어 있던 상태에서 새로운 사용자 정보로 채워진다.
•
UI 업데이트: 데이터가 users 배열에 성공적으로 저장되면 reloadData를 통해 UI를 최신 상태로 갱신해야 한다.
사용자 데이터 처리 및 표시 방법
TIL
@escaping
UIKit
헌혈 앱(기간: 1일)
Project
UIKit
CocoaPods
MVC
SnapKit
Then
GitHub - UMC-HowsTheWear/HowsTheWear-iOS at develop
Contribute to UMC-HowsTheWear/HowsTheWear-iOS development by creating an account on GitHub.
온도에 맞춰서 추천 아이템 실시간으로 변경
About
•
사용자 위치의 날씨 데이터에 따른 실시간 옷 추천 + 다양한 패션 정보 제공
•
CoreLocation과 WeatherKit 사용
사용된 오픈소스라이브러리
•
SnapKit
•
Then
사용된 프레임워크
•
CoreLocation
•
WeatherKit
주요 코드
Hows The Wear(기간: 54일)
Project
UIKit
CocoaPods
MVC
CoreLocation
WeatherKit
SnapKit
Then
About
•
SwiftSoup를 이용해서 웹 사이트의 텍스트를 크롤링 해옴
•
SF Symbols의 이미지를 랜덤으로 표시하고 5개의 문항 중 정답 선택하면 다음 문제로 넘어가고 오답이면 진동 + 화면 흔들리는 애니메이션 + 빨간색 배경색이 등장 후 사라짐
사용된 오픈소스라이브러리
•
SwiftSoup
•
SnapKit
•
Then
주요 코드
[ JSON 인코딩을 활용한 데이터의 로컬 저장 처리 ]
•
[Symbol] 배열을 받아서 JSON 형태로 인코딩하고 로컬 디바이스의 ‘Documents’ 디렉토리에 저장한다.
•
JSONEncoder.encode(symbols)
를 통해 ‘Symbols’ 배열을 JSON 데이터로 변환하고 이 데이터를 ‘filePath’ 위치에 ‘automic’ 옵션으로 쓴다.
•
‘catch’문을 통해 오류가 발생하면 그 오류를 콘솔에 출력한다.
Codable이란? Swift에서 데이터 모델을 JSON이나 다른 외부 표현 형식으로 쉽게 변환할 수 있도록 하는 프로토콜이다. 실제로는 ‘Encodable’과 ‘Decodable’ 두 프로토콜의 조합인 타입 별칭이다. ‘Encodable’은 Swift 타입을 외부 표현(ex. JSON)으로 변환할 수 있게 해주고 ‘Decodable’은 외부 표현에서 Swift 타입으로 변환할 수 있게 해준다. 따라서 서버에서 JSON 형태의 데이터를 받아와 Swift의 구조체나 클래스로 변환할 때 매우 유용하다.
SF Symbols 퀴즈 앱(기간: 7일)
Project
UIKit
CocoaPods
MVC
SwiftSoup
SnapKit
Then
About
•
AVFoundation을 이용해서 버튼에 햅틱 효과를 추가함
•
문자열에 Timer를 이용해서 각 문자에 타이핑 효과를 넣음
사용된 오픈소스라이브러리
•
ViewAnimator
사용된 프레임워크
•
AVFoundation
주요 코드
[ 타이핑 효과 및 특정 문자 커스텀 ]
•
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
를 사용하여 메인 스레드에서 0.5초의 지연 후에 블럭 내의 코드를 실행한다. → 애니메이션 시작 전에 짧은 지연을 제공하여 뷰가 자연스럽게 이어지도록 함
•
var charIndex = 0.0
은 문자의 인덱스를 추적하기 위한 변수이다. 이 인덱스는 각 문자에 대한 타이머의 시작 시간을 결정하는데 사용된다.
•
for letter in text
를 사용하여 ‘text’ 변수에 있는 각 문자를 반복 실행한다.
•
Timer.scheduledTimer(withTimeInterval: 0.1 * charIndex, repeats: false) { timer in
은 0.1초 x 문자의 인덱스만큼 지연된 타이머를 생성한다. → 각 문자가 하나식 차례대로 나타내기 위해서
인용구 앱(기간: 7일)
Project
UIKit
SPM
AVFoundation
ViewAnimator
About
•
Kingfisher를 이용해서 원격 저장소에서 이미지 다운로드 후 캐싱하여 앱의 반응 속도와 데이터 관리 효율성을 증가시킴
•
ViewAnimator를 이용해서 사용자에게 보다 매력적인 인터페이스를 경험할 수 있도록 함
사용된 오픈소스라이브러리
•
Kingfisher
•
ViewAnimator
주요 코드
[ 이미지 다운로드 및 캐싱 ]
•
DownsamplingImageProcessor
를 사용하여 ‘backgroundImageView ‘의 크기에 맞게 다운샘플링하였고 이를 통해 메모리 사용을 줄이고 앱의 성능이 향상된다. → 특히, 대용량 이미지를 다룰 때 유용함
•
.scaleFactor(UIScreen.main.scale)
은 이미지를 현재 디바이스 스크린 스케일에 맞게 조정한다. 이를 통해 다양한 해상도를 가진 디바이스에서 이미지가 깨지지 않고 선명하게 보일 수 있도록 도와준다.
•
.transition(.fade(0.2))
를 사용하여 이미지가 로드될 때 사용자에게 부드러운 시각적 경험을 제공하였다.
•
.cacheOriginalImage
는 ‘Kingfisher’기 이미지를 다운로드한 후 원본 이미지를 캐시에 저장하게 한다. 나중에 같은 이미지를 다시 요청할 때 캐시에서 빠르게 로드할 수 있어서 네트워크 사용을 줄이고 더 빠른 이미지 로딩을 가능하게 한다.
두뇌 게임(기간: 7일)
Project
UIKit
SPM
Kingfisher
ViewAnimator
About
•
닉네임, 한 줄 프로필과 자기소개 입력 및 유효성 검사
•
이전 뷰 컨트롤러에 데이터 전달 및 저장 → UserDefaults
사용된 오픈소스라이브러리
•
PanModal
사용된 프레임워크
•
SafariServices
새로 배운 것들
•
SFSafariViewController
•
UserDefaults
SFSafariViewController
•
웹 뷰를 띄우는 방법 세 가지
1.
UIWebView
2.
WKWebView
프로필 설정(기간: 7일)
Project
UIKit
SPM
SafariServices
PanModal