분류 전체보기 89

UIKit) TIL # 48 넷플릭스 클론 강의

https://github.com/bryjna07/SpartaNetflixClone GitHub - bryjna07/SpartaNetflixCloneContribute to bryjna07/SpartaNetflixClone development by creating an account on GitHub.github.com NetFlix 클론 코딩UICollectionView 로 복잡한 레이아웃을 그립니다.비동기 프로그래밍 으로 효율적인 네트워크 통신을 합니다.옵저버 패턴 을 활용해서 MVVM 아키텍처를 구현합니다.RxSwift 를 활용해서 효율적으로 MVVM , 비동기 프로그래밍 을 구현합니다.AVFoundation 을 활용해서 동영상 재생 개념을 배웁니다.

iOS,Swift) TIL # 47 - 동기, 비동기, 동시성(Concurrency), GCD

쓰레드 (Thread)프로세스 내에서 작업을 수행하는 단위.한 개의 프로세스 내에서 여러개의 쓰레드가 동시에 작업을 수행할 수 있다.즉, 실행중인 iOS 앱을 프로세스 라고 표현하므로 iOS 앱이 실행중일때 여러가지 쓰레드가 동시에 일을 한다.크게 메인 쓰레드와 백그라운드 쓰레드로 구분할 수 있다.여러 개의 쓰레드를 가지고 동시에 작업을 하는 것을 멀티 쓰레딩이라고 한다.동기 (sync)어떤 스레드에서 작업 A 를 처리하다가 새로운 작업 B 가 들어오면, 그 작업 B 을 수행하고 완료될때까지 기다렸다가 다시 작업 A 를 수행하는 작업 처리 방식.→   직렬적으로 작업을 수행 비동기 (async) 어떤 스레드에서 작업 A 를 처리하다 새로운 작업 B 가 들어오면, 다른 스레드에 작업 B 를 넘기고, 수행하..

iOS,Swift) TIL # 46 앱 개발 심화 강의 - 의존성 주입, MVVM

심화주차 강의가 시작되었다.1-1Xcode Instruments1-2동기, 비동기1-3디자인 패턴, 아키텍처1-4RxSwift 1-5Netflix 클론 코딩1-6앱스토어 배포  전체적으로 막바지를 달리고 있다는 것이 실감이 나면서도난이도가 급상승 하는 느낌이 든다.짧은 시간 안에 이것들을 완벽하게 알 순 없겠지만한번이라도 사용해본다는 것이 좋은 경험이 될 것 같다.  의존성 주입의존성을 외부에서 주입하는 방식으로 바꾸는 것Unit Test가 용이해진다.코드의 재활용성을 높여준다.객체 간의 의존성(종속성)을 줄이거나 없엘 수 있다.객체 간의 결합도이 낮추면서 유연한 코드를 작성할 수 있다.의존 관계 역전의 법칙객체지향 프로그램 설계의 다섯가지 기본원칙(SOLID) 중 하나추상화 된 것은 구체적인 것에 의존..

UIKit) TIL # 45 팀 프로젝트 - 영화상영정보 발표

발표 회고  https://github.com/jwl-98/ios5-movie GitHub - jwl-98/ios5-movieContribute to jwl-98/ios5-movie development by creating an account on GitHub.github.com  팀프로젝트를 자주 해서 벌써 몇번째인지 잘 모르겠지만하면 할수록 점점 더 수월하게 진행이 되어가는 것 같다.나 뿐만 아니라 모두들 경험이 쌓이다 보니조금 더 진행 방향에 대해 익숙해져 그런 것 같다. 특히 이번 팀 프로젝트는 스크럼을 꾸준히 하여서로간의 진행사항을 공유하고 어떤 부분이 더 필요한지 팀적으로 논의를 많이 했던 것 같다.

UIKit) TIL # 44 팀 프로젝트 - 영화상영정보 마무리

기존 UIView 로 구현한 영화 상세정보 뷰에서  API 에서 받아오는 영화소개의 길이에 따라영화소개 레이블의 길이가 길어질 수 있기 때문에이에 대한 대처가 필요했다. 두 가지 방법을 생각해 보았다.1. 영화 소개 레이블을 텍스트 뷰로 만든다 2. 전체 화면을 스크롤 뷰로 감싼다.두가지 방법 다 괜찮을 것 같았지만대부분 영화소개의 길이가 길진 않기 때문에텍스트 뷰로 높이를 고정시키는 것 보단스크롤 뷰로 전체를 감싸는 것을 선택했다. final class DetailView: UIScrollView { private let contentView = UIView() 기존 UIView 를 상속한 뷰에서 스크롤 뷰로 변경 후 화면을 담을 뷰를 하나 생성하여 그 안에 담아주었다.  /// 스크..

UIKit) TIL # 43 팀 프로젝트 - 영화상영정보 앱, 메인뷰 추가작업

메인뷰 API 연결 및 셀 데이터 관련 구현 메인 컬렉션뷰를 팀원분이 작업해 주시고메인 뷰에서 API를 통해 받아온 데이터를컬렉션뷰의 셀 클릭시 내 담당뷰인 디테일 뷰로 전달받기 위한 과정을 메인뷰 담당 팀원과 함께 진행하였다. 메인뷰 API 데이터 받아오기미리 만들어둔 NetworkManager를 통해 API 통신을 하여 데이터를 받아왔다. private func fetchNowPlayingMovies() { networkManager.fetchDataByAlamofire(path: .nowPlaying) { [weak self] (result: Result) in guard let self else { return } switch result { ..

UIKit) TIL # 42 팀 프로젝트 - 영화상영정보 앱, 영화상세정보 페이지 구현

팀 프로젝트에서 맡은 영화상세정보 페이지를 구현하려고 한다. 예시) 위와 같이 메인 페이지에서 셀을 클릭하면 영화의 상세 정보를 볼 수 있는 페이지 이다. 필요한 것들 이미지뷰, 레이블, 레이블, 레이블, 버튼 우선 추가해둔 더미데이터를 활용하여 UI 구성을 해보았다. 기본적인 UI 설정이기에 코드는 생략 이후 영화소개 레이블 부분에서 예시 사진 처럼 긴 텍스트가 API 를 통해 전달된다면화면의 텍스트 레이블의 길이가 너무 길어져 화면이 짤릴 수 도 있다는 문제점을 발견하였다. 레이블의 텍스트가 긴 경우 두 가지 방법이 있다.1. 텍스트 뷰로 구현하기2. 화면 전체를 스크롤 뷰로 감싸기 두 가지 방법을 다 시도해 보았는데 텍스트 뷰의 경우 높이가 제한적이라 스크롤 하기 힘들 것 같아 보여서전체를 스크롤 ..

UIKit) TIL # 41 팀 프로젝트 - 영화상영정보 앱, API 분석

팀 프로젝트에서 역할분담을 하여API 호출 역할을 맡게 되었다. 1. API 분석하기API https://developer.themoviedb.org/reference/movie-upcoming-list UpcomingGet a list of movies that are being released soon.developer.themoviedb.org위의 사이트를 통해 API 를 받아와야 한다.우선 회원가입을 하고 Key를 부여받아야 사용할 수 있다. 키값을 예시 주소 뒤에 붙이고 지역언어 등을 붙여 API 를 분석하기 위해 포스트맨으로 테스트 해보았다. POSTMAN 활용 - 포스트맨으로 API가 잘 받아져 오는 것을 확인.- 어떤 데이터들이 주어지는 지 체크- 필요한 데이터를 뽑아 구조체로 변환 quc..

UIKit) TIL # 40 팀 프로젝트 발제 - 영화상영정보 앱

새로운 팀프로젝트 발제가 끝나고팀원들과 모여 스크럼을 진행했다. 영화 예매 앱 프로젝트예시) API를 활용하여 위와 같은 영화정보 앱을 만드는 프로젝트이다. 필수 구현 기능 가이드 로그인 화면/회원가입 화면상단 TapBar의 첫번째 화면UserDefaults를 활용하여 아이디와 비밀번호, 기타 정보 저장영화 목록 페이지UICollectionView를 활용하여 영화 포스터를 표시영화 세부 페이지영화 셀 클릭시 영화 소개와 예매하기 버튼이 있는 페이지영화 예매 입력 페이지영화 세부 페이지에서 입력하기 버튼 클릭시 해당 페이지로 이동결제하기 버튼을 누르면 결제 내역이 마이페이지에서 보이도록영화 검색 페이지상단 TapBar의 두번째 화면UICollectionView를 활용마이 페이지상단 TapBar의 세번째 ..

UIKit) TIL # 39 포켓몬 연락처 앱 과제 - URLSession 으로 수정해보기

과제 제출을 하고 추가적으로 URLSession을 사용해보고 싶어서 공부해보았다.  typealias NetworkCompletion = (Result) -> Void // 네트워킹 요청하는 함수 func fetchRandomPoketmonData(completion: @escaping NetworkCompletion) { let randomNum = Int.random(in: 1...1000) let urlString = "\(requestUrl)\(randomNum)" performRequest(with: urlString) { result in completion(result) } } ..