👩🏻🏫 오늘의 학습목표 👨🏻🏫
- Snapkit 라이브러리에 대해 이해한다.
- Snapkit으로 코드로 레이아웃을 짜는 방법에 대해 이해한다.
- AVKit, AVPlayer에 대해 이해한다.
- 클로저에 대해 이해한다.
🔅KEYWORD🔅
1️⃣ AVPlayer
AVFoundation
- 시간에 따른 시청각 미디어를 재생, 생성할 수 있도록 해주는 프레임 워크
- Objective-c 인터페이스를 제공해주어 미디어에 대한 상세한 컨드롤 가능
- 미디어 파일검사, 생성, 편집, 재인코딩 가능
- 실시간 캡처가능
- 재생중 입력 stream을 가져와서 비디오 컨트롤 가능
AVFoundation의 아키텍처
- AVFoundation은 UIKit보다 Core쪽에 가깝게 맞닿아 있는 프레임워크
- AVFoundation에서는 특별히 Audio를 처리하는 클래스가 별도로 존재
- 단순 재생: AVAudioPlayer
- 오디오를 녹음: AVAudioRecorder
AVKit
- AVFoundation를 가지고 UI를 구현하려면, UIKIt 밑단에 있기 때문에 표준화된 UI를 제공하지 않으므로 AVFoundation과 low-level 수준의 깊은 지식이 필요
- AVKit은 AVFoundation위에 존재하고 미디어 플레이어 Interface를 쉽게 제공(화면에 자막을 띄우는 기능까지)
- 보통 재생 UI를 커스텀하지 않고 주어지는 UI를 그대로 사용하고 싶은 경우,
AVKit을 쓰고 커스텀을 하고 싶은 경우에는 AVPlayer, AVPlayerItem을 사용
AVPlayer
- AVPlayer: player 작업에 관한 인터페이스를 제공하는 객체
- 실시간 스트리밍 파일을 재생할때 사용 (mp3 url만 가지고, 다운로드 받지 않고 재생하는 경우)
로컬에서 다운받아서 재생하고 싶은 경우에는 AVAudioPlayer 사용
-AVPlayer 객체는 AVAsset의 전반적인 playback(녹음, 녹화, 재생)을 조절하는데 사용
- AVPlayer객체가 AVPlayerItem을 이용하고, AVPlayerItem이 AVAsset을 사용하는 구조
- AVAsset: url로 미디어를 객체화하는 역할
2️⃣ SnapKit
SnapKit은 iOS에서 오토 레이아웃을 스토리 보드 없이, 쉽고 간략하게 설정해줄 수 있는 기능을 가진 라이브러리
실습 체크리스트✅
💭생각해 볼까요?💭
❔ SnapKit 기반의 코딩, StoryBoard 기반의 코딩, Xib 기반의 코딩 3가지 중에서 어떤 것이 여러분들이 편한가요? 각각의 장단점을 생각해보세요!
🅰️ 아직은 Storyboard가 구현하기도 쉽고 시각적으로 즉각 보이기 때문에 이해하기가 쉽지만, 여러사람이 작업하는 앱개발에 특성상 유지보수나 커스텀이 편한 SnapKit 기반의 코딩이 필요하고 공부해야하지 않을까...
Storyboard의 장점
- 구현하기가 쉽고, 빠르게 프로토타입을 만들 수 있다.
- 네비게이션의 흐름을 쉽게 파악 할 수 있다.
- Static Cell을 이용 할 수 있다. (storyboard에서만 이용 가능한 기능이라네요!)
Storyboard의 단점
- 여러 사람이 작업 할 경우 merge 충돌이 일어날 수 있다.
- 재사용을 하고자 할 때 뷰 컨트롤러 자체를 함께 복사해야함으로 재사용성이 낮다.
xib의 장점
- storyboard에 비해 조금 더 구체적인 UI 구현이 가능하다.
- merge 충돌이 storyboard에 비해 적다.
- 여러 클래스에서 하나의 UI를 공유해서 사용 할 경우 좋다.
xib의 단점
- 성능이 느리다.
Code의 장점(snapkit)
- 코드로 한줄 한줄 있어서 어떤 기능인지 직관적이다.
- 읽기 쉽고 유지보수가 간편하다.
- 많은 제어와 이해를 통해 다양하게 구현이 가능하다.
- merge 충돌 해결을 하기 쉽다.
Code의 단점
- 다른 사람이 개발했던 코드일 경우 리팩토링이 복잡하다.
❔SnapKit과 자주 사용되는 라이브러리가 있습니다. “Then”에 대해 공부해보세요!
🅰️ - 주로 UIView 기반 인스턴스를 생성하고 속성 설정을 좀 더 편하게 위해 사용된다.
- 코드로 View 를 생성하는 기존 방법에 비해 반복되는 코드가 적어진다는 장점이 있다.
let label = UILabel()
label.textAlignment = .center
label.text = "Hello, World!"
let label: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.text = "Hello, World!"
return label
}()
let label = UILabel().then {
$0.textAlignment = .center
$0.text = "Hello, World!"
}
- then() : 클로저를 통해 인스턴스 생성과 함께 속성값 설정이 가능하도록 한다.
- with() : 클로저를 통해 value type 을 복사와 함께 속성값 설정이 가능하도록 한다.
- do() : 클로저를 통해 인스턴스의 메소드 동작이 수행 가능하도록 한다.
❔“Then”은 Closer 기반의 라이브러리입니다. Closer에 대해 공부해보고 실습을 진행해보세요! Hint. Alamofire upload
🅰️ 전역 함수(global functions)와 중첩 함수(nested function)은 실제 클로저의 특별한 경우입니다. 클로저는 다음 세 가지 형태 중 하나를 갖습니다.
- 전역 함수 : 이름이 있고 어떤 값도 캡쳐하지 않는 클로저
- 중첩 함수 : 이름이 있고 관련한 함수로 부터 값을 캡쳐 할 수 있는 클로저
- 클로저 표현 : 경량화 된 문법으로 쓰여지고 관련된 문맥(context)으로부터 값을 캡쳐할 수 있는 이름이 없는 클로저 -> 클로저에는 Named Closure, Unnamed Closure가 있다.
func doSomething() {
print("uni")
}
let closure = { print("uni") }
클로저 표현문법
- 인자로 넣을 parameters, 인자 값으로 처리할 내용을 기술하는 statements 그리고 return type입니다. 앞의 backward클로저를 이용해 배열을 정렬하는 코드는 클로저 표현을 이용해 다음과 같이 바꿀 수 있습니다.
{ (parameters) -> return type in
statements
}