-
Notifications
You must be signed in to change notification settings - Fork 1
2024.11.11
Forest Lee edited this page Nov 14, 2024
·
1 revision
- 학습
- CRDT
- CRDT 공유데이터를 관리하는 자료구조
- LinkedList
- Tree
- RBTree
- RGATreeSplit
- 배포 → 목요일 까지 기능 합치는 것을 목표로~!! ✅
- 공유사항에 따른 토의 ✅ (DI 관한 내용 제외)
- 코드 리뷰
- 멘토링 → 멘토링 진행 언제 하실건지 여쭤보기 ✅…… → (목) 일지 작성
- 마스터클래스
- 현재 뷰(루트뷰)의 UI속성을 작업하는 내용만 적고, 각 ui오브젝트는 하위 뷰로 toss할 지
- 현재 뷰(루트뷰)의 UI속성을 작업하는 내용만 적고, 각 ui오브젝트는 즉시실행 클로저로 할 지
- 현재 뷰를 모든 하위뷰까지도 포함하는 뷰로 생각하고, 모든 뷰의 UI속성을 작업하는 내용을 적을 지
→ setupViewAttribute함수에 UI작업 + 재사용 가능한 || 가능할것 같은건 func로 빼고 해당 함수 호출 ✅
setupOOO → 메서드 명
ex)
func setupViewAttributes() {
setupCentralCircleView()
setupGrayCircleViews()
setupUserContainerView()
}
func setupCentralCircleView() {
//...
}
func setupGrayCircleViews() {
//...
}
func setupUserContainerView() {
//...
}
- Input, Output 구체 타입으로 만든 콘크리트 뷰와 매칭되는 프로토콜을 만들고, 그걸 주입받게 하는건 어떨까?
- Input, Output 프로토콜로 두고, 이를 컴포짓하게 채택한 프로토콜을 주입받고, 구현하게 만들 지
- 보류됨, 석영님 있을 때 다시 논의
- 뷰모델 폴더에 둘지 ← ✅
- 뷰컨트롤러와 같은 뎁스에 둘지
- 영화정보에는 컬렉션뷰가 사용돼있음 + 디퍼블 적용해보겠음
- 셀 재사용을 사용할 정도의 규모일 때 테이블||컬렉션 뷰로 간다.
- 당장은 필요 없다. 하지만 테이블뷰나 스크롤뷰중에 고르라고 하면 스크롤뷰(무적권)
//
// GroupInfoViewModel.swift
// Feature
//
// Created by Yune gim on 11/6/24.
//
import Combine
public class GroupInfoViewModel: ViewModelProtocol {
typealias Input = GroupInfoViewInput
typealias Output = GroupInfoViewOutput
private var users = [InvitedUser]()
private var title: String = ""
var output = PassthroughSubject<GroupInfoViewOutput, Never>()
var cancellables: Set<AnyCancellable> = []
func transform(input: AnyPublisher<GroupInfoViewInput, Never>) -> AnyPublisher<GroupInfoViewOutput, Never> {
input.sink { [weak self] inputResult in
switch inputResult {
case .viewDidLoad:
self?.output.send(.titleDidChanged(title: self?.title ?? ""))
case .exitGroupButtonDidTab:
self?.exitGroupButtonDidTab()
}
}
.store(in: &cancellables)
return output.eraseToAnyPublisher()
}
}
private extension GroupInfoViewModel {
func userStateDidChanged(user: InvitedUser) {
for index in users.indices {
guard users[index].id == user.id else { continue }
users[index] = user
}
output.send(.userStateDidChanged(user: user))
}
func userDidInvited(user: InvitedUser) {
users.append(user)
output.send(.userDidInvited(user: user))
output.send(.groupCountDidChanged(count: users.count))
}
func exitGroupButtonDidTab() { }
}
enum GroupInfoViewInput {
case viewDidLoad
case exitGroupButtonDidTab
}
enum GroupInfoViewOutput {
case userStateDidChanged(user: InvitedUser)
case userDidInvited(user: InvitedUser)
case groupCountDidChanged(count: Int)
case titleDidChanged(title: String)
}
protocol ViewModelProtocol {
associatedtype Input
associatedtype Output
var output: PassthroughSubject<Output, Never> { get set }
var cancellables: Set<AnyCancellable> { get set }
func transform(input: AnyPublisher<Input, Never>) -> AnyPublisher<Output, Never>
}
func setupBind() {
let output = viewModel.transform(input: input.eraseToAnyPublisher())
output.sink { [weak self] outputResult in
switch outputResult {
case .userStateDidChanged(let user):
self?.updateInvitedUserState(user: user)
case .userDidInvited(user: let user):
self?.addInvitedUser(user: user)
case .groupCountDidChanged(count: let count):
self?.updateGroupCount(to: count)
case .titleDidChanged(title: let title):
self?.updateTitle(to: title)
}
}
.store(in: &cancellables)
}
}
A가 B랑 연결
B가 C랑 연결
→ A와 C가 자동으로 연결됨 / confirmed
최대 동시 연결 가능 피어수 → 8명
피어id는 폰의 이름을 따라감 → 글자수 제한을 따로 걸 수 없음 / 유저의 이름이 길 수 있음
아이디 바꾸는 기능은 별도 테스크로 빼자.
- PR과 회의내용에 따른 코드 수정
- Task에 있는거 구현 시작 → 동영상을 Soket에 전달
- 오늘 회의에 따른 코드 수정
- 다음 task → socket interface
- 오늘 회의에 따라서 코드 수정 + video 화면에 보여주기 구현 및 공부???
- 동시 알고리즘 관련 공부 …
- CRDT(동시편집 알고리즘) 공부해오세요. - S042
- 지난 주 PR 제발 merge 단계까지 가기