Skip to content

2024.11.11

Forest Lee edited this page Nov 14, 2024 · 1 revision

할 일

  1. 학습
    • CRDT
    • CRDT 공유데이터를 관리하는 자료구조
    • LinkedList
    • Tree
    • RBTree
    • RGATreeSplit
  2. 배포 → 목요일 까지 기능 합치는 것을 목표로~!! ✅
  3. 공유사항에 따른 토의 ✅ (DI 관한 내용 제외)
  4. 코드 리뷰
  5. 멘토링 → 멘토링 진행 언제 하실건지 여쭤보기 ✅…… → (목) 일지 작성
  6. 마스터클래스

회의 사항

setupViewAttribute함수에

  • 현재 뷰(루트뷰)의 UI속성을 작업하는 내용만 적고, 각 ui오브젝트는 하위 뷰로 toss할 지
  • 현재 뷰(루트뷰)의 UI속성을 작업하는 내용만 적고, 각 ui오브젝트는 즉시실행 클로저로 할 지
  • 현재 뷰를 모든 하위뷰까지도 포함하는 뷰로 생각하고, 모든 뷰의 UI속성을 작업하는 내용을 적을 지

→ setupViewAttribute함수에 UI작업 + 재사용 가능한 || 가능할것 같은건 func로 빼고 해당 함수 호출 ✅

setupOOO → 메서드 명

ex)
func setupViewAttributes() {
    setupCentralCircleView()
    setupGrayCircleViews()
    setupUserContainerView()
}

func setupCentralCircleView() {
   //...
}

func setupGrayCircleViews() {
   //...
}

func setupUserContainerView() {
   //...
}

뷰모델을 주입받는 뷰컨트롤러와 DI에 관해

  • Input, Output 구체 타입으로 만든 콘크리트 뷰와 매칭되는 프로토콜을 만들고, 그걸 주입받게 하는건 어떨까?
  • Input, Output 프로토콜로 두고, 이를 컴포짓하게 채택한 프로토콜을 주입받고, 구현하게 만들 지
  • 보류됨, 석영님 있을 때 다시 논의

뷰모델을

  • 뷰모델 폴더에 둘지 ← ✅
  • 뷰컨트롤러와 같은 뎁스에 둘지

리뷰어들이 헷갈릴 수도 있는 있는 내용은 //MARK 사용하기

그룹 정보 + 스크롤뷰 || 컬렉션 뷰

  • 영화정보에는 컬렉션뷰가 사용돼있음 + 디퍼블 적용해보겠음
  • 셀 재사용을 사용할 정도의 규모일 때 테이블||컬렉션 뷰로 간다.
  • 당장은 필요 없다. 하지만 테이블뷰나 스크롤뷰중에 고르라고 하면 스크롤뷰(무적권)
//
//  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)
    }
}

멀티피어커넥티비티 PoC 공유

A가 B랑 연결

B가 C랑 연결

→ A와 C가 자동으로 연결됨 / confirmed

최대 동시 연결 가능 피어수 → 8명

피어id는 폰의 이름을 따라감 → 글자수 제한을 따로 걸 수 없음 / 유저의 이름이 길 수 있음

아이디 바꾸는 기능은 별도 테스크로 빼자.

공통 할 일 → 학습 및 공유(공유 안하면 윤회님께 혼남) + 오후 회의?

윤회 할 일

  • PR과 회의내용에 따른 코드 수정
  • Task에 있는거 구현 시작 → 동영상을 Soket에 전달

건우 할 일

  • 오늘 회의에 따른 코드 수정
  • 다음 task → socket interface

지혜

  • 오늘 회의에 따라서 코드 수정 + video 화면에 보여주기 구현 및 공부???
  • 동시 알고리즘 관련 공부 …

금주 목표

  • CRDT(동시편집 알고리즘) 공부해오세요. - S042
  • 지난 주 PR 제발 merge 단계까지 가기

차은우원빈현빈장원영의

개발 스토리

✏️ 기획


✔️ 규칙


📌 1주차 회의록

데일리 스크럼

회의록

회고

📌 2주차 회의록

데일리 스크럼

회의록

회고

📌 3주차 회의록

데일리 스크럼

회의록

회고

📌 4주차 회의록

데일리 스크럼

회의록

회고

📌 5주차 회의록

데일리 스크럼

회의록

회고

📌 6주차 회의록

데일리 스크럼

회의록

회고


🔥 트러블슈팅

Clone this wiki locally