๋ฉ๋ชจ๋ฆฌ ๋์, ๋ฉ๋ชจ๋ฆฌ ๋ฆญ.. ์กฐ์ฌํด์ผ๋๋ค…. ์ฝํ ์ฐธ์กฐ ํด์ค์ผ๋๋ค … ์ ์ํด์ฃผ๋ฉด ์ฑ ํฐ์ง ์๋ ์๋ค…
๋ผ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฃ๊ธฐ๋ง ํ์ง, ์ง์ ๊ฒช์ด๋ณด๊ธด ์ฒ์์ด์์ต๋๋ค ..
์ต๊ทผ ์์์ ๋ค๋ฃจ๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ์์๋๋ฐ์ฌ
์๋น์ค ๋ด์์ ๋ผ์ด๋ธ ์์๋ ๋ค๋ฃจ๊ณ , ๋ค์๋ณด๊ธฐ ๊ฐ์ ๋ค์ํ ์์์ ์ฒ๋ฆฌํ๋ค๋ณด๋
์์์ ๋๋ฆฌ๋ค๋ณด๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ก ์ธํด์ ์ฑ์ด ํฐ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ํนํ ๋ผ์ด๋ธ ๋ค์๋ณด๊ธฐ ์์๊ฐ์ ๊ฒฝ์ฐ, 3์๊ฐ์ง๋ฆฌ ์์์ ์ ๋ฌ๋ฐ๋ค๋ณด๋
์์์ ํ๋ ์ดํ ๋๋ง๋ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ํํ ์น์๊ณ ,, ์ต๋ 3๋ฒ๊น์ง ํ๋ ์ดํ๋ฉด ์ฑ์ด ํฐ์ง๋๋ผ๊ตฌ์..
์ ํฌ๊ฐ ์ ๋ฌ๋ฐ์ ์ ์๋ ์์์ ์ข ๋ฅ๋ ํฌ๊ธฐ๋ ์ผ๋จ ๋น์ฅ ์ฒ๋ฆฌํ ์ ์๋ ์์ญ์ด ์๋๋ผ ์๊ฐ๋์ด
์ต๋ํ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ก์๋ณด์ ํ๋ ์๊ฐ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
๐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒฝ์ฐ
* RxSwift + MVVM + Clean Architecture๋ฅผ ์ฑํํ ํ๋ก์ ํธ์ ๋๋ค.
1. Closures
1) Subscribe
rxswift๋ฅผ ์ฌ์ฉํด์ ๊ตฌ๋ ํ๋ ๋ชจ๋ ๋ถ๋ถ์ ์ฝํ ์ฐธ์กฐ๋ฅผ ํตํด์ ๋ฉ๋ชจ๋ฆฌ ํด์ ํด์ฃผ์์ต๋๋ค.
onNext๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ withUnretained๋ฅผ ์ฌ์ฉํ๊ณ ,
์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด onError๊น์ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ .subscribe(with:)์ ์ฌ์ฉํด์ ํ๋ฒ์ ์ฝํ ์ฐธ์กฐ๋ฅผ ํ ์ ์๋๋ก ํ์ต๋๋ค.
// ex1
enterButton.rx.tap
.withUnretained(self)
.subscribe { owner, _ in
owner.dismiss(animated: true) {
let userInfo = ["matchId": owner.matchId,
"matchInfo": owner.viewModel.matchInfoModel as Any,
"matchScore": owner.viewModel.matchScoreModel as Any]
owner.postObserverAction(.presentPlayVC,
userInfo: userInfo)
}
}.disposed(by: self.disposeBag)
//ex2
output.hasDuplicatedUser
.withUnretained(self)
.subscribe { owner, hasUser in
if hasUser {
owner.showToast(message: I18N.Play.alreadyPlaying, bottom: 100)
owner.renewPlayerList(reload: true)
}
}.disposed(by: self.disposeBag)
// ex3
matchRepository.getMatchInfo(matchId: matchId)
.subscribe(with: self) { (owner, entity) in
guard let entity = entity else { return }
let model = entity.toDomain()
owner.matchInfo.accept(model)
} onError: { owner, error in
owner.error.accept(error)
}
.disposed(by: disposeBag)
2) UIView.animate
animations๋ @escaping closure์ด๊ธฐ ๋๋ฌธ์ ์ ๋ถ ์ฝํ ์ฐธ์กฐ ํด์ฃผ์์ต๋๋ค.
UIView.animate๋ ์ํ์ฐธ์กฐ๊ฐ ์ผ์ด๋์ง ์๋๋ค๊ณ ํฉ๋๋ค.. ! ์๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค..
์ฐธ๊ณ https://daeun28.github.io/%EC%9D%B4%EB%A1%A0/post29/
3) DiffableDataSource (cellProvider)
UITableViewDiffableDataSource๋ฅผ ์ฌ์ฉํ๋๋ฐ,
์ด๋ cellProvider๋ ๋ง์ฐฌ๊ฐ์ง๋ก @escaping closure์ด๊ธฐ ๋๋ฌธ์ ์ฝํ ์ฐธ์กฐ๋ฅผ ํด์คฌ์ต๋๋ค.
UITableViewDiffableDataSource<TeamType, PlayerModel>(tableView: self.tableView, cellProvider: { [weak self] (tableView, indexPath, _) in
guard let self = self else { return UITableViewCell() }
guard let cell = tableView.dequeueReusableCell(withIdentifier: AddPlayerTVC.className, for: indexPath) as? AddPlayerTVC else { return UITableViewCell() }
switch indexPath.section {
case 0:
let data = self.homePlayerList[indexPath.row]
let isMe: Bool = data.userId == UserDefaults.standard.integer(forKey: Const.UserDefaultsKey.userId)
cell.setData(data: data, isMe: isMe)
if self.duplicatedUserChecked && data.isPlaying {
cell.setDuplicatedUI()
}
...
return cell
})
2. Custom UIView
ํ์ ๋ด์์ ๋ค๋น๋ฐ๋ฅผ CustomNavigationBar์ด๋ผ๋ UIView๋ก ์ปค์คํ ํด์ ์ฌ์ฉํ์ต๋๋ค.
์ผ์ชฝ์ backButton์ ๋๋ ์๋ ๊ฐ ๋ทฐ์ปจ์์ ๋ณ๋ค๋ฅธ ์ง์ ์ ํด์ฃผ์ง ์์๋ ํญ์ pop๋๋๋ก ํ๋ ์ก์ ์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด
CustomNavigationBar ์์ pvc๋ผ๋ UIViewController์ ๊ฐ๊ณ ์ฌ์ฉํ๋๋ก ํ์ต๋๋ค.
class CustomNavigationBar: UIView {
private var pvc: UIViewController?
...
}
// ๋ทฐ์ปจ ๋ด์์ ์๋์ฒ๋ผ self(UIViewController)์ ๋ฃ์ด์ค์ ์ฌ์ฉ
naviBar.setNavibar(self, title: I18N.Play.startPlay, type: .withCloseButton)
๋ทฐ ๋ด์ UIView๊ฐ UIViewController๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ํ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๋ฉด์ ์ฐธ์กฐ ํด์ ๊ฐ ์๋ฉ๋๋ค..
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ UIView ๋ด์์ UIViewController๋ฅผ ์ฝํ ์ฐธ์กฐ๋ก ์ ์ธํด์ฃผ๋ฉด
class CustomNavigationBar: UIView {
private weak var pvc: UIViewController?
...
}
customNavigationBar์ด๋ผ๋ UIView๋ฅผ ๊ฐ๋ ์์ UIViewController๊ฐ deinit๋๋ฉด
ํ์์ UIView๋ deinit๋๊ฒ ๋ฉ๋๋ค..
3. Protocol
delegate pattern์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํ๋กํ ์ฝ์ ์ ์ธํ ๋ weak๋ก ์ ์ธํด์ค์ผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ฉ๋๋ค..!
class AddPlayerFooterView: UITableViewHeaderFooterView {
weak var buttonDelegate: AddPlayerDelegate?
...
}
ํ๋ฆฐ ๋ถ๋ถ์ด๋ ๋ณด์ถฉํ๋ฉด ์ข์ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ธ์ ๋ .. ๋ง์ํด์ฃผ์ญ์ .. ๐โ๏ธ
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxSwift] ์๋ฌ ํธ๋ค๋ง (2) | 2023.02.09 |
---|---|
[Swift] RxSwift์์ Combine์ผ๋ก ๋ฐ๊ฟ๋ณด๊ธฐ (2) | 2022.09.26 |
[Swift] Array ๋ฐฐ์ด (0) | 2022.06.11 |