7์ฃผ์ฐจ ๊ธฐ๋ก: URLSession, Access Control, ARC
๐ง ๋ฌด์์ ๋ฐฐ์ ๋?
- ์ฝ๋ ์ชผ๊ฐ๊ธฐ (Base ViewController, View, TableView, CollectionView)
- ์ญ์ผ๋ก ๊ฐ์ ๋ฌ
- Access Control ์ ๊ทผ ์ ์ด์
- WKWebView
- URLSession
- ARC
- Any vs AnyObject : Any (๋ชจ๋ ํ์
์ ๋ฐ์), AnyObject (ํด๋์ค์์๋ง ํ๋กํ ์ฝ์ ์ ์ํ ์ ์๋๋ก ์ ์ฝ)
(+) viewController Naming ํ๋ ๋ฒ: main, detail ๊ฐ์ ์ด๋ฆ ์ง๊ธฐ๋ ์ง์ํ๊ธฐ. ํ๋ ์
๋ฐ์ดํธ ๊ณผ์ ์์ ๊ทธ ์ญํ ์ด ๋ฐ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ด๋ฆ์ ์ง์ ๊ฒ์ ๊ณ ๋ คํด๋ณผ ๊ฒ.
๐จ ์์
- Photogram
- Media Project ์์ฉ + ๊ฐ์
๐ ๊ณผ์
- Photogram ์ญ์ผ๋ก ๊ฐ์ ๋ฌ, URLSession ์์ฉํด๋ณด๊ธฐ
- Media Project (multiple Cell๋ก ๊ฐ๊ธฐ ๋ค๋ฅธ API ํต์ + UI ์ ์ฉ)
๐ฆ ๋ณต๊ธฐ
โ๏ธ MultipleCell
from Media Project
๊ณ ๋ฏผ ํ๋ ๋ถ๋ถ:
- ๊ฐ๋จํ๊ฒ UI๋ฅผ ๊ตฌ์ฑํด๋ณด๋ ๊ฒ๋ ๊ณผ์ ์ ์ผ๋ถ์๋๋ฐ, ์ด๊ฒ๋ ์๊ทผ ์ด๋ ค์ ๋ค. ์ํ ๊ฒ์ ํ์ ๋ ์ด๋ป๊ฒ ํด์ผ ๋ณด๊ธฐ ์ข์์ง? ํ๋ ๊ฑธ ๊ณ ๋ฏผํ๋ค ๋ณด๋ UI๋ ํ ๋ ๋ฒ ์ ๋ ์์ ํ๋ ๊ฒ ๊ฐ๋ค.
- ๊ณผ์ ์ Base๋ก ๊ฐ ์ญํ ๋ณ๋ก ๋๋์ด์ ๊ตฌ์ฑํ๊ณ , section์ ํ์ฉํ๋ค. if๋ฌธ ์ข ๊ทธ๋ง ์ฐ๊ณ ์ถ์๋๋ฐ ์ด๋ฒ์๋ ์ด๊น์์ด if๋ฌธ ๊ตฌ๊ตฌ์ ์ ์ฝ๋๋ก ๊ตฌ์ฑํ๊ณ ๋ง์๋ค. ๊ทธ ๋๋ถ์ ์ฐ๋ค๊ฐ ๊ดํธ ์ฒดํฌ๋ง ํ ์ธ ๋ฒ์ ํ ๋ชจ์. ๋๋ ... ์งง๊ณ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์ฐ๊ณ ์ถ์๋ฐ ์ธ์ ์ฏค..!!
- section ๋๋๋ ๊ฑธ ์ด๋ป๊ฒ ํ ์ง ๊ณ ๋ฏผํ์๋ค. ๊ฒ์ํด๋ณด๋ ์
์ ๋ด์ฉ์ด ๊ฐ์ ๊ฒ๋ผ๋ฆฌ ๋ฌถ๋ ๊ฒ ์ข๋ค๊ณ ํด์, API ๋ด์ฉ ๊ทธ๋๋ก movie, people, TV ์ธ ๊ฐ๋ก ์น์
์ ๋๋์ด ์
์ ๊ตฌ์ฑํ๋ค.
- ์ด์ํ๊ฒ Out of range ์ค๋ฅ๋ฅผ ํ
์ด๋ธ๋ทฐ ๋ง๋ค๋๋ง๋ค ๋จ๋๋ฐ, count ํด์คฌ๋๋ฐ ๋ญ๊ฐ ๋ฌธ์ ์ผ! ์ธ์น๋ฉด์ indexPath.row < movieList.results.count ์ด๋ฐ ์์ผ๋ก ๊ณ ์ณ ์ผ๋ค. ๋๋ถ์ if ๋ฌธ ์ฐ๋ ๋์ ์ฝ๋๋ ์์ ์์ด ๊ธธ์ด์ง๊ณ .....
- ๊ทธ๋ฆฌ๊ณ ์น์
UI๋ ๊ณ ๋ฏผ์ ํ์๋๋ฐ, ์์
์์ header..... ๊ทธ ์ด๋ฆ ๊ธด ๊ฑธ๋ก xib ํ์ผ๋ก ๋ง๋ค์ด์ ์น์
๋ด ํฐํธ์ ๋์ด ์ง์ ์ ํ๋ ๊ธฐ์ต์ด ๋์ ๊ทธ๊ฑธ ์ฝ๋๋ฒ ์ด์ค๋ก ํด์ ์ฝ์
ํ๋ ค๋ ๋๋ฌด ๋ณต์กํ๊ฒ ๋๊ปด์ก์๋ค. ์๋๋ฉด ๋ ์ง๊ธ ํ
์ด๋ธ๋ทฐ์ ์ปฌ๋ ์
๋ทฐ๋ฅผ ๋ง๋ค๋ฉด ์ด๊ฒ ํ๋ฉด์ ์๋์ฌ๊น๋ด ๋น๋ ๋๋ฅผ ๋๋ง๋ค ๊ธด์ฅํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ... ์ด๊ฒ๋งํผ์.. ์ฝ๊ฒํ๊ณ ์ถ์๋ ๋ง์. => ์น์
์ ๋ํด ๊ฒ์ํ๋ค๊ฐ heightForHeaderInSection, titleForHeaderInSection ๋ ๊ฑธ ์ ๊ฒ ๋์ด์ ์ด ๋ ๊ฐ๋ฅผ ์จ์ ์ ๋ง ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค์๋ค. ๊ทผ๋ฐ ์ด๊ฑด ๋์ด ์ง์ ์ด๋ผ๋๊ฐ ํฐํธ ํฌ๊ธฐ ๋ฑ ์กฐ์ ์ด ์์
๋ ์น์
UI๋ก ๋ฐฐ์ ๋ ๊ฒ์ ๋นํด ์์ ๋กญ์ง๊ฐ ์์์ ๋ณ๋ก์๋ ๋ฏ. ๋ช ์ธ๊ตญ ๋ธ๋ก๊ทธ์ ๋์จ ๊ฑธ ์ฐ๋ ค๊ณ ํ๋ '์ด๊ฑฐ ๊ณง ๊ธฐ๋ฅ์์ ๋บ ์์ ์ด์ผ~' ํ๋ ๋ฌธ๊ตฌ๊ฐ ๋จ๋ ๊ฑธ ๋ณด์ ๊ทธ๋ฅ ์ฌ๋ฌ๋ชจ๋ก ์ ์ฐ๋ ๊ฒ ๋์ ๊ฒ ๊ฐ๋ค.
- URLSession์ ์ ์ฉํด๋ณด๋ ค๊ณ ํ๋ค๊ฐ, ์ด๋ฏธ์ง ํ์ผ ์ธ์ ๋์ ํ ๋ชป ๋๊ธฐ๊ฒ ์ด์ + ์์ง URLSession์ ๊ฐ๋
์ธ ์์ฉ์ ์์
์ฝ๋๋ณด๊ณ ๋ฐ๋ผ์น๊ธฐ... ์ ๋ ๋ฐ์ ์๋์ ์ผ๋จ ๋ณด๋ฅํ๋ค. 2์ฃผ..๋ค์.. ํ ์ ์์์ง๋.
โ๏ธ Base
- override์ ๊ฐ๋
์์ง๊ฐ ํ์ํ๋, base๋ฅผ ๋๋ ์ ํด๋์ค ์์ฑํ๊ธฐ. ๋ถ๋ชจ ํด๋์ค๋ฅผ ๊ทธ๋๋ก ํ์ฉํด์ ์ข์๋ ์ ์ view.background = .white๋ฅผ ๊ผฌ๋ฐ๊ผฌ๋ฐ ํด์ฃผ์ง ์์๋ ๋์๋จ ๊ฒ๊ณผ ํ๋์ ํ์ผ ๋น ์ฐ์ด๋ ์ฝ๋๊ฐ ์ค์ด๋ค์๋ค๋ ๊ฒ. ๋ค๋ง๊ณ ์น๋ง ๋ ์ฌ๋ฆฌ๋ฉด ๋ด ์ฝ๋๊ธธ์ด์ ๋ฉ๋ฏธ๊ฐ ๋๋๋ฐ, base๋ฅผ ์ฐ๊ณ ๋๋ฉด์๋ถํฐ ๊ธธ์ด์ ์๋ฐ์ด ์ข ์ค์ด๋ค์๋ค.
- ์คํ์์ค๊น์ง ์ํฌํธ ํด์ ์ธ ์ ์๋ค. → ๋จ, ์์๋ฐ๋ ๋ชจ๋ ๋ทฐ๊ฐ ์ฌ์ฉํ๊ณ ์์ด์ผ ํจ. (ex.ํ๋์ ๋ทฐ๋ง alamofire๋ฅผ ์ฌ์ฉํ ๋ base์ ์ํฌํธ ํ๋ ๊ฑด ์ ํฉํ์ง ์๋ค)
- BaseView
let mainView = SearchView()
override func loadView() {
self.view = mainView
}
baseView๋ฅผ ํ์ฉํ ๋ ๊ผญ loadView ํด์ฃผ๋ ๊ฑธ ์์ง ๋ง์. loadView๋ฅผ ํด์ฃผ๋ ์ด์ = ์ ํ์ด ๋ง๋ ๋ทฐ ๋ง๊ณ ์ปค์คํ
๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ธํ
ํด์ฃผ์ด์ผ ํจ.
โ๏ธ ์ญ์ผ๋ก ๊ฐ์ ๋ฌ
- property
- closure
- notification
- delegate pattern
- ๋.. ์ฌ์ค ์์ง๋ notification ํ์ฉ์ ์ ๋ชป ํ๊ฒ ๋ค... ใ
ใ
... ๋ญ๊ฐ ๊ฐ๋
๊ณผ ์ ์๋ฅผ ๋ณด๋ฉด + ๋ธ๋ก๊ทธ ์์๋ฅผ ๋ณด๋ฉด ๋์ถฉ ์๊ฒ ๋๋ฐ ๋ชจ๋ฅด๊ฒ ์ด. ์ด๋ฐ ์ํ. ๋ฐฐ์ด, ๋์
๋๋ฆฌ๋ฅผ ํ์ฉํ ๋๋ง๋ค ์ข ๋ง์ด ํค๋งค๋ ํธ์ธ๋ฐ ๊ฐ์ ๋์
๋๋ฆฌ๋ก ๋ฐ์์ ๊ทธ๋ฐ ๊ฒ ๊ฐ๊ธฐ๋. ์ผ๋จ์ ํด๋ก์ ๋ ๋๋ฆฌ๊ฒ์ดํธ ์์ฃผ๋ก ๊ฐ์ ๋ฌ ํ๊ธฐ๋ก ํ๋ค. ๊ผญ! notification์ ์จ์ผํ๋ค๋ฉด ์ด๋ป๊ฒ๋ ํด๋ณด๊ฒ ์ง๋ง...
โ๏ธ Access Control (์๋ํ)
- ์ฝ๋์ ๋ํ ์ ๊ทผ์ ์ ํํ๊ฑฐ๋ ์กฐ๊ฑด์ ๊ฑธ๊ณ ์ถ์ ๋ ํ์ฉ.
- (๊ฐ์ฅ ์ ํ ์์) open > public > internal > fileprivate > private (๊ฐ์ฅ ์ ํ์ )
- ์ฌ์ฉํ๋ ์ด์ ? ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๊ณ ์์ง๋๋ ๋์์ง.
- ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ์์๋ค๋ผ๋ฆฌ ๋ฌถ๊ธฐ ๋๋ฌธ์ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ค์ ํ๋๋ก ํ์ธ/๊ด๋ฆฌํ ์ ์์. → ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ฉ.
- ๋ชจ๋๊ณผ ํ๊ฒ์ ๊ธฐ์ค์ผ๋ก ์ ๊ทผ์ ์ด์๋ฅผ ๋ค๋ฃฌ๋ค.
- ๋ชจ๋์ ๊ธฐ์ค ์ค์
- import๋ฅผ ํด์ผ๋ง ์ ๊ทผํ ์ ์์.
- ๊ฐ๊ฐ์ ๋ชจ๋์ ๊ฐ๊ฐ์ ํ๊ฒ์ ๊ฐ์ง๊ณ ์์.
- open, public : ๋ชจ๋ ๋ฐ์ ๊ฒ์ ์ ๊ทผํ ๋ ์ฌ์ฉ.
- overriding์ด ๋๋ ์ ๋๋์ ์ฐจ์ด.
- open์ overriding ๊ฐ๋ฅ
- ์์์ด ๊ฐ๋ฅํ๋ค, ํด๋์ค์์๋ง ์คํ ์ฌ์ฉ ๊ฐ๋ฅ → ์์์ ๊ตฌ์กฐ = ํด๋์ค, open ์ ์ด์๋ฅผ ์ธ ์ ์๋ ๊ฑด ๊ฒฐ๊ตญ class๋ฟ.
- public์ ๋ค๋ฅธ ๋ชจ๋์ ์ ๊ทผํ ๋ ์๋ฏธ๊ฐ ์์.
- internal, private, fileprivate : ๋ชจ๋๊ณผ ๋ชจ๋ ์ฌ์ด์์์ ์ ๊ทผ ๋ ๋ฒจ์ด ๋์ง ์์. ์ ๊ทผ์ ์ด๊ฐ ๋ชจ๋์ ๋ฒ์ด๋ ์ ์์.
- open, public → ๋ค๋ฅธ ๋ชจ๋์์ ์ ๊ทผํด์ import๋ฅผ ํตํด ์ฌ์ฉํ ๋. ์ ํ์ด ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด๊ฐ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ด์ . → module๋ก ์ ๊ทผ (๋ด ํ๋ก์ ํธ์์ ์ฐ์ผ ์ผ์ด ์์))
- internal, private, filePrivate → sourcefile๋ก ์ ๊ทผ, internal(ํ๋ก์ ํธ๋ด ๋ชจ๋๋ด ๋ค ์ ๊ทผ ๊ฐ๋ฅํ๋ค!) internal class ์ด ๋ํดํธ ์ค์ ์. ๋ค๋ฅธ ํ์ผ์์ ํธ์ถํ์ง๋ง! = private
- private์ด ๊ฐ์ฅ ๋ง์ด ์ฐ์.
โ๏ธ WKWebView
- ์ ํ์ด ์ ๊ณตํด์ฃผ๋ ์ฝ๋๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
- UINavigationBarAppearance ์ ๋ํด์๋ ๋ฐฐ์ ๋ค. ์คํฌ๋กค ํ ๋ ๋ค๋น๊ฒ์ด์
์์ญ์ด ์ฌ๋ผ์ง ์๋, ํฌ๋ช
ํด์ง ์๋ ์๊ธฐ ๋๋ฌธ.
import UIKit
import WebKit
class WebViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string:"https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
func reloadButtonclicked() {
webView.reload()
}
func goBackButtonClicked() {
if webView.canGoBack {
webView.goBack()
}
}
func goForwardButtonClicked() {
if webView.canGoForward {
webView.goForward()
}
}
}
https://developer.apple.com/documentation/webkit/wkwebview
โ๏ธ UIResponder
- ์ฌ์ฉ์์ ์ก์
์ ๊ฐ์ง
- UIView๊ฐ ์์ ๋ฐ๊ณ ์์.
//์ฐฝ์ ํค์๋ง์ ์์น๋ฐ๊ฐ ์ฌ๋ผ์์ ๊ฒ์ํ ์ ์๊ฒ ํจ.
override func viewDidLoad() {
super.viewDidLoad()
mainView.searchBar.becomeFirstResponder()
}
//์์น๋ฒํผ ๋๋ฅด๋ฉด ๋ด๋ ค๊ฐ
extension SearchViewController: UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
mainView.searchBar.resignFirstResponder()
}
}
โ๏ธ URLSession
URLSession
- ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ํ๊ฑฐ๋ ์ ๋ก๋ ํ๋ ๋ฑ์ API๋ฅผ ์ ๊ณตํด์ฃผ๋ ํด๋์ค๋ก URL์ด ๊ฐ๋ฆฌํค๋ ์๋ํฌ์ธํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- URLSession API๋ฅผ ํตํด ํ์์์, ์บ์ ์ ์ฑ , ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฐ์ดํฐ ์ ์ก ๋ฑ ํ์ฉํ ์ ์์.
- ๊ฐ๋จํ๊ณ ๊ธฐ๋ณธ์ ์ธ ์์ฒญ์ธ ๊ฒฝ์ฐ์๋ Shared Session, ๋ณ๋๋ก ์ปค์คํ
์ ํ๋ ค๋ฉด Session Configuration.
- session Configuration๋ฅผ ํ์ฉํ๋ฉด ๋ชฉ์ ์ ๋ฐ๋ผ Default, Ephemeral, Background Session๋ก ์์ฑ ํ ์ ์์.
URLSessionConfiguration
- ํ๊ฒฝ์ค์ (๋คํธ์ํฌ ํต์ ์ ํ๊ธฐ์ํ ์ค์ )
- ์ํฌ๋ฆฟ๋ชจ๋
- ๋ณด์, ์บ์ฑ, ์ธ์
- sharedSession : ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ์ฑ๋ ํ๊ฒฝ์ธํ
. (ex.alamofire)
- ์ฑ๊ธํด ํจํด ๊ตฌ์กฐ๋ก ๊ธฐ๋ณธ ์ค์
- ๋จ์ํ ๋คํธ์ํธ ์์ฒญ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉ
- ์ปค์คํฐ๋ง์ด์ง X
- DefaultSession : ์งํ๋ฅ ์ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ผ๋ฉด, defaultSession์ ์ฌ์ฉํ๋ค. (shared๋ ๊ฑฐ์ ๋น์ทํจ...)
- URLSessionConfiguration์ ํตํด ์ง์ ์์ฑํ๋ ์ธ์ ์ผ๋ก, Shared Session๊ณผ ๊ธฐ๋ณธ ์ค์ ์ด ์ ์ฌ.
- ์ปค์คํฐ๋ง์ด์ง O
- EphemeralSession (๋ณด์)
- shared Session๊ณผ ๊ธฐ๋ณธ ์ค์ ์ด ๋น์ทํ๊ฒ ๋์ด ์์ง๋ง, ์ฟ ํค, ์บ์, ์ธ์ฆ ์ ๋ณด ๋ฑ์ ๋์คํฌ์ ๊ธฐ๋กํ์ง ์์.
- private ๊ธฐ๋ฅ ๋ฑ์ ๊ตฌํํ ๋ ์ฌ์ฉ (ex. ์ํฌ๋ฆฟ ๋ชจ๋)
- BackgroundSession
- URLSessionConfiguration์ ํตํด ์ง์ ์์ฑํ๋ ์ธ์ ์ผ๋ก ์ฑ์ด ์คํ์ค์ด์ง ์์ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ํ๊ฑฐ๋ ์ ๋ก๋ ํ ์ ์์.
URLSessionTask
- ์ธ์ ์ด ์์ฑ๋ ์ดํ์๋ Task๋ฅผ ์์ฑํ๊ฒ ๋๋๋ฐ, URLSession์ ํตํด ์์ฑ๋๋ ๊ฐ๋ณ ์์ฒญ = Task.
- ์์ฒญ - ์๋ต ๋ฆฌ์์ค : (์ ์ด์จ )๋ฐ์ดํฐ๊ฐ ์ ๊ฒ ๋ฆ. ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์๊ณผ ๊ตฌํํ๋ ค๋ ๋ชฉ์ ์ ๋ฐ๋ผ ํ
์คํฌ ํ์
๊ฒฐ์ .
- task
- Task๋ suspended ์ํ๋ก ์์ํ๊ธฐ ๋๋ฌธ์, Task๋ฅผ ์์ฑํ ์ดํ์๋ resume ๋ฉ์๋๋ฅผ ํตํด task๋ฅผ ์์ํ ์ ์๊ณ , ๋ฐ๋ผ์ resume์ ํธ์ถํด์ผ ๋คํธ์ํฌ ํต์ ์ ์์ํ ์ ์์.
- data : ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ.
- upload
- download : ๋ฐ์ดํฐ์์ด ํฐ ๊ฒ.
- stream : ์์ผ.
- task
URLRequest
- ๋คํธ์ํฌ ์์ฒญ์ ๋ํ ์ ๋ณด๋ฅผ ํํ
- ๋คํธ์ํฌ์ ์์ฒญ์ ํ๊ธฐ ์ํด์ URLSession์ด ํ์.
URLResponse
- ์๋ฒ๋ก๋ถํฐ ์๋ต ๋ฐ์ ํ
์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ completionHandler ๋๋ SessionDelegate.
- completionHandler:
- task ๋ค ๋๋๊ณ ์คํ. ๋จ ํ๋ฒ๋ง ์คํ ๋๋ค. ์ด๋ฏธ์ง ๋ฐ์ดํฐ๊ฐ ํฌ๊ฑฐ๋ ํ๋ฉด ํ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ delegate ์ฌ์ฉ์ ํ๋ค. (shared)
- ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ data์ HTTP Header, ์๋ต์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ๋ฑ์ ์ ๋ณด๊ฐ ๋ค์ด์๋ response, ์์ฒญ์ด ์คํจํ์ ๋์ ๋ํ error ๊ฐ์ ์ ๋ฌ๋ฐ์ ์ ์์ต๋๋ค.
- sessionDelegate :
- Task๊ฐ ์คํ๋๋ ๋์ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ์ํฉ์ ๋ํด์ ์ธ๋ถ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ํ ๋ ์ฌ์ฉ.
- ์๋ฒ๋ก๋ถํฐ ์ต์ด๋ก ์๋ต์ ๋ฐ์์ ๋, ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋๋ง๋ค, ๋ฐ์ดํฐ ์ ์ก์ ๋ค ๋ฐ์ ์์ ๋ฑ์ ๋ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅ.
- ์ต์ด์๋ต / 10%, 20% ์ค๊ฐ๊ณผ์ … ์งํ๋ฅ ์ ๋ํ ๋์์ด ๊ฐ๋ฅํ๋ค. (shared X) ์๋ต ์ค๊ฐ์ค๊ฐ ์ผ๋งํผ ๋ฐ์๋์ง ํ์ธํ๊ณ ์ถ์ (์ด๊ฒ shared๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ด์ .)
- Task๊ฐ ์คํ๋๋ ๋์ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ์ํฉ์ ๋ํด์ ์ธ๋ถ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ํ ๋ ์ฌ์ฉ.
- completionHandler:
? :
- alamofire, kingfisher๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋คํธ์ํฌํต์ ์ ํ ์ ์๋จ ์ ์ด ์ ๋ง ๋งค๋ ฅ์ ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง!..... ๋๋ฌด ์ด๋ ต๋ค. ์ญ์ ๋คํธ์ํฌ ํต์ ^^... ๋ค์ด์ค์๋ง์ ๊ธ๊ฒฉํ ๋จ์ด์ง๋ ์ดํด๋ ฅ์ด๋. ์ฃผ๋ง ๋ด๋ด URLSession ์ผ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ๋ฅผ ํด๋ณด๋ ค๊ณ ์์
์ฝ๋๋ฅผ ๋ดค์ง๋ง, ํ๋กํ ์ฝ + dispatchQueue์ ์ฌ๋ฑ์ฅ + ์๊ณ ์๋ do-try-catch ํ์ฉ ๋ฑ ๋ฐ๋ก ๋ณด๋ฉด ์๊ฒ ๋ ์ฝ๋๊ฐ ์ข
ํฉ์ ๋ฌผ์ธํธ์ฒ๋ผ ํจ๊ป ์์ผ๋ ๊ณ์ ๋ฌผ์ํ ์ํ๋ง ๋์ด์ ๊ทธ๋ฅ ์์
์ฝ๋๋ฅผ ๋ณด๊ณ ๋น์ทํ๊ฒ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ผ์์ผ ๋์์ผ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๋ค. ๊ทธ๋์ ๊ตฌํํ ์ฝ๋๋ searchbar query์ ์๊ณ ์๊ณ ์ฐจ์ด ์ ๋์์ง๋ง.
- ์ผ๋จ ์ดํดํ ๊ฑด, image์ ๊ฐ์ UI์ ์์๋ main thread๊ฐ ํด๊ฒฐํด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ (์ด ๋ถ๋ถ ์ผ๋ถ๋ฌ ๋นผ๋๊ณ ๋น๋ ํด๋ณด๋ ๋ณด๋ผ์ ๊ฒฝ๊ณ ๊ฐ ๋ฌ๋ค. ์๋ง ๋นผ๋จน์ด๋ ์ด๊ฑด ๋ณด๋ผ์ ๊ฒฝ๊ณ ๋ณด๊ณ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ผ๋จ ๋์คํจ์น ํ์ฉ ํ์ด๋ฐ ์ก์๋ ๋์์ง ์์ ๊ฒ ๊ฐ๊ณ ... ).
- ํ๋์์ API Manager ๊ด๋ จ ์ฝ๋๋ ์์
์ฝ๋ ์ฐธ๊ณ ํด์ผํ ๊ฒ ๊ฐ๋ค..ใ
.ใ
ใ
ใ
...
โ๏ธ ARC
* ์ ํ ๊ณต์ ๋ฌธ์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฆฌ
ARC๋ Automatic Reference Counting์ ์ฝ์๋ก, Swift๋ ํ๋ก๊ทธ๋จ ๋ด์์ ์ฌ์ฉ์์ ์ฑ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ด๋ค. ARC๋ ๋์ด์ ํ์ํ์ง ์๋ ์ธ์คํด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ผ๋ก ์์ ์ฃผ๋ ์ญํ ์ ์ํํ๋ค. ARC ๋ฑ์ฅ ์ด์ ์ MRC๋ฅผ ์ฌ์ฉํ๋๋ฐ, MRC๋ ์๋์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ผ ๊ฐ๋ฐ์๊ฐ retain - release (์ถ๊ฐ-์ญ์ )๋ฅผ 1:1๋ก ๋ค ๋์ ํด์ฃผ์ด์ผ ํ๋ค.
- Reference Counting (์ฐธ๊ณ ์นด์ดํ
, RC)๋ only ํด๋์ค ์ธ์คํด์ค์๋ง ์ ์ฉ๋๋ค.
- ์ธ์คํด์ค๊ฐ ๋์ด์ ํ์ํ์ง ์์ ๋, ARC๋ ๊ทธ ์ธ์คํด์ค๊ฐ ์ฌ์ฉํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์๋ฒ๋ฆฌ๋๋ฐ, ์ด๋ ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉํ๊ธฐ ์ํด์์ด๋ค. ๊ทธ๋ฌ๋๊น ํ์ํ์ง ์๋ ํด๋์ค ์ธ์คํด์ค๊ฐ ๋ถํ์ํ๊ฒ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ณ ์์ง ์๋๋ก ๊ทธ ์ธ์คํด์ค์ ๊ด๋ จ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ๋ ์ญํ ์ ์ํํ๋ค.
- ๋จ, ์ด๋ ์๋ก๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์ธ์คํด์ค๋ค์ด ์์ผ๋ฉด ๊ฐํ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์๋ค. ์๋ฌด๋ฆฌ Automatic์ด๋ผ์ง๋ง ์ด๋ฐ ์ํฉ์์ reference count๊ฐ 0์ด ๋์ง ์์์ ๋ ๋์ด ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋จ๊ฒ ๋๊ณ , ์ฆ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์์ด ๋๊ณ ๋ง๋ค.
๊ฐํ ์ํ์ฐธ์กฐ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ์ ๋๊ฐ์ง :
weak vs Unowned
๊ณตํต์
์ฐธ์กฐํ๋ ์ธ์คํด์ค์ RC๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋๋ค.
์ฐจ์ด์
- weak : ์ฐธ์กฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด nil๊ฐ (์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋ฐ๋ผ์ ์ ์ฅ๋์ด์๋ ๊ฐ์ ๋ชจ๋ nil๋ก ๋ฐ๊ฟ), ์ต์
๋ ์ ์ธ ํ์, ์ฐธ์กฐํ๋ ์ธ์คํด์ค๊ฐ ๋ ์งง์ lifetime์ ๊ฐ์ง ๋ ํ์ฉํ ๊ฒ
- unowned : ์ฐธ์กฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ฉด ๋ณ๋ค๋ฅธ ๋์ ์์. (๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ฃผ์๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์, ๋ฉ๋ชจ๋ฆฌ์์ ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ก๋ค๊ณ ํ๋๋ผ๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์ค๋๋ผ๋ ๊ณณ์์ ์ฌ์ ํ ๋ณด์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์ค๋๋ฅผ ํธ์ถํ๋ฉด ์ ์ ๊ฐ์ ๊ฐ์ง๊ณ ์ค๋ ค๊ณ ํจ), ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ lifetime์ด ๊ฐ๊ฑฐ๋ ๋ ๊ธธ ๋ ํ์ฉํ ๊ฒ, ์ด๊ธฐํ ํ์ ์์!
Closure capture
- ๊ฐ์ด ์๋ reference๋ฅผ caputreํ๋ค.
- ์๋ช
์ฃผ๊ธฐ๊ฐ ๋๋๊ณ ๋ ์ด์์๋ ์ธ์คํด์ค๊ฐ ์์ด์ ์บก์ณ ๊ธฐ๋ฅ์ด ํ์ํ๋ค.
..... ์ด๋ถ๋ถ์ ์ข ๋ ์ดํด๋๋ฉด ์ถ๊ฐํ๊ธฐ๋ก. ์์ฆ ์์
์์ ํด๋ก์ ์ฝ๋ ์์ฑ์ด ์ฆ์์ ธ์ ์์ฐ์ค๋ฝ๊ฒ ๋๋ ํด๋ก์ ๋ฅผ ์ฐ๊ฒ ๋์๋๋ฐ, ๋ฑ ์ก๊ธฐ์ค ๋ฐ์ ๋ง ์ดํดํ๊ณ ์ฐ๋ ๊ธฐ๋ถ์ด๋ผ ์บก์ณ ๋ด์ฉ์ ๋ฐฐ์ฐ๋ฉด์ ํด๋ก์ ๋... ์... ๋ค ํด๋ด์ง? ์ถ์ด์ ์กฐ๊ธ ํผ๋์ค๋ฌ์ ๋ค.
'๐ฑ SeSAC iOS 3๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ฑ ์์น ์๋ฑํฌ iOS ์ฑ๊ฐ๋ฐ์ ๋ฐ๋ท๊ณผ์ 3๊ธฐ ํ๊ธฐ (3) | 2024.06.25 |
---|---|
[SeSAC] iOS ๊ฐ์ธ์ฑ <์ง๊ด๋ก๊ทธ> ์ถ์ ํ๊ณ (10) | 2023.10.24 |
๐ฑ 6์ฃผ์ฐจ: NotificationCenter, CLLocationManager, MKMapView, UIPageViewController (1) | 2023.08.27 |
๐ฑ 5์ฃผ์ฐจ: API ํต์ , Codable, DispatchGroup, ๋ณต์ต (1) | 2023.08.20 |
๐ฑ 4์ฃผ์ฐจ: ๋คํธ์ํฌ ํต์ (0) | 2023.08.13 |