왜 아키텍쳐를 고려해야만 할까? 아키텍쳐를 고려하지 않는 다면 매우 비대해진 클래스를 마주하게 됩니다. 그리고 이를 디버깅하는 동료 뿐만 아니라 본인 조차 이해하고 수정하는 데 너무나도 많이 시간을 허비해야만 합니다. 결국 수정을 포기하게 되죠(?) 서비스 규모가 커짐에 따라 코드 또한 빠른 속도로 방대해 집니다. 그래서 우리는 이러한 상황에 대비하기 위하여 좋은 설계가 필요합니다. 좋은 아키텍처란 ? 각 객체들이 구체적이고 명확한 역할을 가지며, 그 역할이 적절하게 분배되어 있다. 데이터의 흐름이 단순하다. Testability 하다. 코드의 위치가 명확하다. 이 기준들을 가지고 하나씩 장단점을 따져봅시당 MVC Pros 개발자에게 너무나도 익숙한 구조. Cons Controller가 View Life..
iOS 환경에서 백그라운 작업의 결과, 비동기 작업의 결과 등 현재 작업의 흐름과 다른 흐름의 작업으로부터 이벤트를 받으려고 할 때 Notification을 많이 사용합니다. 예를 들면, 대용량 파일을 다운로드하는 스레드를 생성하고 다른 페이지에서 다른 작업으로 넘어가도 다운로드 완료 알림 팝업을 띄울 수 있는 것이 있습니다. 물론 다른 방법도 존재하지만... 예를 들자며는... 그렇다는 겁니당 Notification Notification Center를 통해 정보를 전달하기 위한 구조체입니다. // 알림을 식별하는 태그 var name: Notification.Name // 발송자가 옵저버에게 보내려고 하는 객체. 주로 발송자 객체를 전달하는 데 쓰임 var object: Any? // Notifica..
상당히 메모리 제약이 큰 모바일 어플리케이션 환경에서 멀티 프로세싱은 필수적입니다. 하지만 그에 대한 관리를 하는 것은 정말 어려운데요... 그래서 GCD 애플에서 개발한 멀티코어, 멀티 프로세싱 환경에 최적화된 기술입니다. 기본적으로 스레드 풀의 관리를 프로그래머가 아닌 운영체제에서 관리하기 때문에 프로그래머가 태스크(작업)을 비동기적으로 쉽게 사용할 수 있습니다. 프로그래머가 실행할 태스크(작업)을 생성하고 Dispatch Queue에 추가하면 GCD는 태스크(작업)에 맞는 스레드를 자동으로 생성해서 실행하고 작업이 종료되면 해당 스레드를 제거합니다. Dispatch Queue DispatchQueue는 작업항목의 실행을 관리하는 클래스입니다. 대기열(Queue)에 추가된 작업항목은 시스템이 관리하는..
ATS 애플리케이션과 웹 서비스 사이에 통신 시 보안 향상을 위한 기능으로 iOS 9.0, macOS 10.11부터 적용 가능합니다. 모든 인터넷 통신 시 안전한 프로토콜을 사용하도록 보장하는 것으로 사용자의 민감한 정보가 유출되는 것을 방지합니다. URLSession, CFURL 그리고 NSURLConnection API를 이용해 데이터를 주고받을 때 ATS 기능을 기본적으로 사용하게 됩니다. ATS가 활성화되어있을 때는 HTTP 통신을 할 수 없으며 애플에서 권장하는 아래 요구 사항을 충족하지 않은 네트워크는 연결에 실패할 수 있습니다. 예외사항 애플리케이션이 ATS가 요구하는 사항을 충족하기 힘든 경우, ATS 기능을 비활성화할 수 있습니다. 아래는 ATS 기능을 사용하지 않을 수 있는 예외사항입니..
iOS 내에서 HTTP/HTTPS 를 통해 데이터를 주고받기 위해 API를 제공하는 URLSession과 이 작업을 나타내는 URLSessionDataTask에 대해서 톺아보겠습니다. URLSession URLSession은 HTTP/HTTPS를 통해 콘텐츠(데이터)를 주고받는 API를 제공하는 클래스입니다. 이 API는 인증 지원을 위한 많은 델리게이트 메서드를 제공하며, 애플리케이션이 실행 중이지 않거나 일시 중단된 동안 백그라운드 작업을 통해 콘텐츠를 다운로드하는 것을 수행하기도 합니다. URLSession API를 사용하기 위해 애플리케이션은 세션을 생성합니다. 해당 세션은 관련된 데이터 전송작업 그룹을 조정합니다. 예를 들면 웹 브라우저를 사용 중인 경우 탭 당 하나의 세션을 만들 수 있습니다...
요즘 앱들을 보면 iOS 뿐만 아니라 AOS 까지 거의 다 하단에 탭이 있는 Tabbar로 페이지를 구분하는 형태가 많습니다. 폰이 길어져서 그런다~ 사용자 UX가 좋다 등 결국 사용자가 편하다 라는 이유로 점점 더 대중화되고 있습니다. iPhone 기본앱들도 거의 다 사용하는 이 Tabbar 를 톺아보도록 하겠습니다. 탭바 컨트롤러가 존재하고 UIViewController를 탭바 컨트롤러에 연결함으로써 페이지를 추가할 수 있습니다. 바로 구현으로 들어가 볼게요 :) UIViewController에 Tab bar Controller를 임베디드 시켜 줍니다. 요렇게 선택한 UIViewController가 하나의 tab으로 설정된 Tab bar Controller가 생성됩니다. storyboard 에 UIV..
모바일 앱을 사용하다 보면 현재와 다른 흐름 또는 알림, 경고 등을 위해서 팝업 형태의 창을 자주 띄우는 데요 iOS 에서 대표적으로 Alert, ActionSheet가 있습니다. Alert 와 ActionSheet는 화면에 보여지는 것만 다를뿐, 구성요소는 같습니다. Alert 중요한 액션을 하기 전 경고가 필요한 경우 액션을 취소할 기회를 제공해야 하는 경우 사용자의 작업을 한 번 더 확인하거나 삭제 등의 작업을 수행하거나 문제 사항을 알릴 때 결정이 필요한 중요 정보를 표시할 경우 Action 사용자가 고를 수 있는 액션 목록이 여러 개일 경우 새 작업 창을 열거나, 종료 여부 확인 시 사용자의 결정을 되돌리거나 그 동작이 중요하지 않을 경우 스타일 지정을 통해서 Alert 형태로 구현할 것인지, ..
드디어 예제를 가지고 왔습니다 !! Example) 포켓몬 도감 2 !! 설명이 길 수 있어서 세세한 부분은 좀 생략을 했습니다 잘 따라와주세요 ! 먼저 스토리보드에 UICollectionView를 뷰 전체 사이즈로 추가해 주시구요. ViewController에 레퍼런스를 따옵니다. (IBOutlet weak var ...) //ViewController.swift private var pokemons: [UIImage] { var pokemons:[UIImage] = [] for i in 0...50 { let index = i % 16 let image = UIImage(named: "pokemon\(index)")! pokemons.append(image) } return pokemons } 미리 ..
이전 시간에 UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate에 대해서 알아보았구 이번 포스팅에서는 컬렉션뷰의 셀을 원하는 형태로 정렬하고 간격을 지정하는 등의 기능을 하는 UICollectionViewFlowLayout에 대해서 알아보겠습니다. 예제는 다음..에 있어요 ㅎㅎ UICollectionViewFlowLayout UICollectionViewFlowLayout 클래스를 사용하면 컬렉션뷰의 셀을 원하는 형태로 정렬할 수 있습니다. 플로우 레이아웃은 레이아웃 객체가 셀을 선형 경로에 배치하고 최대한 이 행을 따라 많은 셀을 채우는것을 의미합니다. 현재 행에서 레이아웃 객체의 공간이 부족하면 새로운 행을 생성하고 거..
이전에서 UICollectionView의 구성요소와 레이아웃, 구현을 위한 클래스, 프로토콜을 톺아보았습니다 ;) 이번에는 UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate에 대해서 알아보겠숩니다. 예제는 다음다음시간에... UICollectionViewCell 컬렉션뷰 셀의 구성요소 관련 프로퍼티 //셀의 콘텐츠를 표시하는 뷰입니다. var contentView: UIView /*셀의 배경을 나타내는 뷰입니다. 이 프로퍼티는 셀이 처음 로드되었을 경우와 셀이 강조 표시되지 않거나 선택되지 않을 때 항상 기본 배경의 역할을 합니다.*/ var backgroundView: UIView? /*셀이 선택되었을 때 배경뷰 위에 ..