안녕하세요! 클린 아키텍쳐 관련 질문있습니다. API 통신이 아니라 로컬에 저장된 json 파일에서 앱 실행시 한번 FileManager로 파싱하고자 하는데, 클린 아키텍쳐 구조로 진행하려면 어떤 구조로 될까요? Domain > Entity 영역에 City 모델을 만든 상태입니다. 기능은 크게 2가지로 load하고 search하는 기능이 있습니다. load 한 이후에는 변수를 통해 search하면 되서 search는 뷰 모델에 정의하는게 맞는지, load의 경우 UseCaseProtocol 로 해야하는지 어떤 방식이 적합한지 여쭤봅니다. 추가로 API 통신하는 경우에도 로딩한 후 모델로 가공해서 보여주는 기능만 있는데, 그럴 경우에는 어떻게 진행하는걸 추천하시나요? API 로 선택한 항목에 대한 정보를 로딩하고 데이터 가공해서 UI에 보여주는 경우입니다.. 감사합니다.
let coredata = UserCoreData(viewContext: appDelegate.persistentContainer.viewContext) let network = UserNetwork(manager: NetworkManager(session: UserSession())) let userRP = UserRepository(coreData: coredata, network: network) // Domain Layer let userUC = UserListUsecase(respository: userRP) let userVM = UserListViewModel(usecase: userUC) // Presentation Layer let userVC = UserListViewController(viewModel: userVM) 하나의 뷰 컨트롤러를 생성 시 ViewModel, UseCase, Repository, Network, CoreData 등 주입할 요소가 많아지는 것 을 느꼈습니다. 그렇다면 화면전환을 수행할 때마다 뷰 컨트롤러를 생성하게 되는데 매번 해당 컨트롤러에 의존성을 주입 해주어야 하나요? 또한 Network, CoreData 등 동일한 객체를 유지하기 위해서 이전화면의 ViewModel 객체를 다음화면의 ViewModel로 넘겨주면 될까요? 궁극적으로 실무에서 사용하는 방식을 알고 싶습니다.
다름이 아니고 UserListViewController에서 private func bindView() { tableView.rx.prefetchRows .bind { [weak self] indexpath in guard let rows = self?.tableView.numberOfRows(inSection: 0), let itemIndex = indexpath.first?.item else { return } if itemIndex >= rows - 1 { self?.fetchMore.accept(()) } } .disposed(by: disposeBag) } 해당 코드 작성한 것을 확인했는데 이 상황에서 itemIndex >= rows - 1 가 정상적으로 동작하지 않는다고 생각이 들어서요. 정상적으로 동작하는 경우도 있지만 (천천히 스크롤 할 때) 빠르게 스크롤했을때 rows 는 30이라고 할때 itemIndex 는 24가 찍혀 self?.fetchMore.accept(()) 가 실행이 안되더라구요 그렇다면 prefetchRows 를 쓰는게 좋은 방법인가에 대한 생각이 들어서 질문 드립니다!
ViewBuilder를 활용해서 리팩토링하여 중복되는 코드를 줄이는것에 대해서.. 실제로 현업이나 개발할때 강의처럼 일단 뷰를 전체적으로 다 만들어놓고 중복되어보이는 코드를 리팩토링하면서 common으로 분리하나요 ? 아니면 처음부터 중복되는것처럼 보이면 바로 common으로 분리하면서 하나요? 아무래도 후자이려나요 ?
질문 강의 중 스냅킷을 사용하여 이미지 뷰의 제약을 설정하셨는데 make.leading.top.bottom.equalToSuperview().inset(20) make.width.height.equalTo(80). top과 bottom을 상위 뷰에 걸어 상대적 높이를 설정했으나, 절대적 높이 height도 별도로 걸어주신 이유가 있을까요?
안녕하세요. 강사님께 문의드릴 곳이 현재 수강중인 강의의 질문게시판밖에 없는 것 같아서 여기에 올립니다! 양해 부탁드려요 ㅜㅜ 다름이 아니라, iOS Clean Architecture & MVVM: RxSwift 완전 정복 강의 내용이 Swift 6의 새로운 동시성 모델을 반영한 내용인지 궁금합니다. 만약 그렇지 않다면 Swift 5.x 버전의 컴파일러를 기준으로 강의 내용을 따라가면 되는 건가요? 답변 미리 감사드립니다.
grpc.resource_quota=0x600000cab5a0, grpc.server_uri=dns:/// firestore.googleapis.com }}: connect failed (UNKNOWN:(domain:NSPOSIXErrorDomain, code:50, description:The operation couldn’t be completed. Network is down) 위의 오류가 발생하는데 로그인 정보는 제대로 출력되는데 다른 부분에서 데이터를 불러오지 못하는데 어떤 부분을 수정해보면 좋을까요?
FeedView만들기 전 단계, 리팩토링하기 전단계까지 모두 동일하게 코드를 작성하고, 틀린부분 있는지 빠트린 부분 있는지 확인을 다했는데요. 프로필 편집 사진과 네임, 유저네임, 소개 모두 다 시뮬레이터 홈버튼 더블클릭 후 밀어내기해서 끄고, cmd + R이나 시뮬레잍터 상의 앱을 클릭해서 키면 모든게 리셋되네요. 그런데 로그아웃 후 재로그인하면 또 사진과 네임, 유저네임, 소개가 제대로 뜹니다. 어디 부분이 문제가 있는걸까요??
2024년 9월 20일경 업데이트 있어서 했더니 이상하게 새 프로젝트부터는 네비게이션창의 파일들이 드래그 엔 드롭이 안됩니다.ㅠㅠ 파일이 폴더를 오고가긴해도 기존버전처럼 파일 순서를 의지대로 변경 못하고, 알파벳 순으로 고정되네요. 찾아서 자동정렬 같은걸 비활성화 하는걸 해보려고해도 찾질 못해서 질문드려요.
안녕하세요. 먼저, macOS를 Sequoia로 업데이트 하면서 Xcode도 15에서 16으로 업데이트 했습니다. 강의 6분 50초 정도부터 navigationTitle 관련된 코드 작성을 해주시는데 이전 OS나 Xcode15에서는 강의 내용대로 작성하면 제대로 되었던게 업데이트를 하고나니 안되더라구요. 찾아보니 Xcode 16에서는 내비게이션 타이틀과 툴바의 상호작용이 일부 변경되었다고 합니다. 하단에 .navigationBarTitleDisplayMode(.inline) 을 추가하니 강의 내용과 동일하게 나타났습니다. 코드는 아래에 첨부하겠습니다. .navigationTitle("프로필 편집") .navigationBarTitleDisplayMode(.inline) .navigationBarBackButtonHidden() .toolbar { ToolbarItem(placement: .topBarLeading) { Button { dismiss() } label: { Image(systemName: "arrow.backward") .tint(.black) } } } 게시판 내용과 어긋나거나 잘못된 정보면 말씀해 주세요. 감사합니다.
질문 있습니다 Maui 프로그램 개발 후 테스트를 하려고 안드로이드폰 두군데다 설치해서 테스트를 했는데 결과가 다르게 나와서요 두 폰 다 ui는 최신으로 바꼈는데 한 폰에서는 결과가 마치 이전 버전의 로직이 돌아가는 듯한데... Vs2022에서 로컬디바이스에서 테스트하는 방식으로 앱을 설치 했는데 로직이나 이런게 예전 로직이 업데이트 안 되고 남아 있을수 있을까요? 혹시 테스트 등을 위해 앱을 크린 설치하는 방법이 있을까요?
안녕하세요. 궁금한게 있어 글 남깁니다. Model과 View에는 struct를 사용해주셨고 ViewModel에는 class를 사용해주셨는데 이렇게 사용하는 것이 일반적이라고 생각하면 좋을까요? 강의를 보고 궁금하여 좀 찾아보니 참조 타입이나 값 타입에 대해 좀 알게 되었는데 크게 와닿지 않아서 일단은 외우고 진행해야하나 싶더라구요
잘 알고 넘어가야 할 것 같아서 질문해요. ProfileView에는 @State var viewModel = ProfileViewModel() ProfileEditingView에는 @Bindable var viewModel : ProfileViewModel 클래스 연결할땐 @Bindable이라 하셨는데 첫번째에도 연결할때 클래스 연결하는거니 @Bindable 써야하는거 아닌가여? 같은 클래스를 적용하는데 다르게 하는 이유가 궁금하고, @State var viewModel = ProfileViewModel() @Bindable var viewModel : ProfileViewModel 하나는 변수에 담는 식이고, 하나는 타입식으로 한건지 궁금해요. 제가 초보라 질문이 엉뚱할 수 있는데 궁금해요~