⭐️ 개발

    [GCD] 섹션 1~3 요약정리

    [GCD] 섹션 1~3 요약정리

    섹션0. GCD/Operation에 앞서 대기행렬(큐) GCD(=DispatchQueue)와 Operation Queue 2가지 종류가 있다. GCD는 간단한 일을 하고, 함수를 사용하는 메소드 위주의 작업을, Operation은 복잡한 일을 위주로 한다. GCD를 기반으로 해서 여러가지 기능이 추가되어 Operation이 나온 것이다. 그러면 스레드는 뭘까? 스레드는 일하는 녀석이다. 그동안 우리는 스레드가 여러개인데도 프로그래밍을 잘못해서 하나의 스레드만 사용한 것이다. 그치만 우리가 짠 앱 수준에서는 충분히 스레드 하나로 처리가 가능한 정도였다. 그러면 어떻게 다른 스레드로 작업을 분산시켜서 동시에 일을 하게 할 수 있을까? 답은, 대기행렬(큐)에 보내기만 하면 된다. 보내면 알아서 대기행렬을 사용..

    [iOS] CodeBase로 가보자고

    [iOS] CodeBase로 가보자고

    Frame Base Layout : 예전에는 아이폰 사이즈가 다채롭지 않았거든... frame은 버전에 따라서 자동으로 생각하지 않고 잡아준 것임. 그래서 절대적인 수치의 경우는 safearea는 무시하고 잡아주는 것이고, 한계를 느끼게 된다. 그리고 한쪽으로 쏠리기 때문에 어떤 디바이스에서는 정중앙이지 않을 수 있다. Frame + AutoResizing -> AutoLayout - NSLayoutConstraints -> NSLayoutAnchor 까지 쭉 발전되어 진행되었다. 그리고 아이폰X가 등장하면서 top, bottom의 영역이 디바이스마다 다르게 되면서 safeAreaLayoutGuide가 나오게 되었다. 노치영역을 위해 분기처리를 해줄 수는 없잖아.. 번거로우니까! 수치가 또 달라질 수 있..

    [iOS/Swift] Custom Framework를 만들면서 배우는 접근제한자

    [iOS/Swift] Custom Framework를 만들면서 배우는 접근제한자

    순서 이 글에는 2가지 내용이 들어있다. 모듈에 대한 내용과 접근제한자에 대한 내용 1. 모듈화와 프레임워크 2. 접근제한자 3. open과 public의 차이 4. fileprivate과 private의 차이 5. Custom Framework 생성하기 6. Custom Framework 프로젝트에 추가하기 7. Custom Framework를 통해 접근제한자 알아보기 모듈화, 그리고 프레임워크 모듈화 : 앱에서 공통적으로 사용하는 UI 또는 기능이 있을텐데, 각각 수행하는 일에 따라 모아서 기능별로 하나로 모아놓은 것을 말하고, 앱을 모듈화할 시에 빌드 속도를 줄이고, 협업 시에 좋은 환경, 각 기능 별 의존성을 명확하게 지정할 수 있고, 기능 간 결합도를 낮춰서 유연한 서비스를 제작할 수 있다고 한..

    [iOS] UIPageViewController

    [iOS] UIPageViewController

    UIPageViewController 페이지 뷰 컨트롤러는 제스처를 사용하여 직접 제어할 수 있고, 페이지 간에 이동할 때 사용자가 지정한 전환을 사용하여 변경사항을 애니메이션화할 수 있다. UIPageViewController를 만들기 위해서 스보에 총 4개의 뷰컨을 올려줬다. 첫 뷰컨은 UIPageViewController를 상속시켜주고, 나머지 3개는 UIViewController 클래스로 만들어준다. 1. 페이지뷰컨은 여러개의 뷰컨을 담고 있기 때문에 뷰컨트롤러 배열 타입의 프로퍼티를 하나 선언해준다. var pageViewControllerList: [UIViewController] = [] 2. 뷰컨 배열에 뷰컨을 담아준다. private func createPageViewController(..

    [Refactor] Enum을 사용해서 화면 분기처리하기

    [Refactor] Enum을 사용해서 화면 분기처리하기

    enum ViewType { case start case change var menuTitle: String { switch self { case .start: return "시작하기" case .change: return "변경하기" } } var navigationTitle: String { switch self { case .start: return "다마고치 선택하기" case .change: return "다마고치 변경하기" } } } var viewType: ViewType = .start override func viewDidLoad() { super.viewDidLoad() setupNavigation() setupCollectionView() } // MARK: - Custom Metho..

    [iOS] pngData(), jpegData(compressionQuality:)

    [iOS] pngData(), jpegData(compressionQuality:)

    Content-Type은 내가 보낼 데이터의 타입에 대한 정보를 담고 있다. multipart/form-data는 서버에 이미지 파일을 업로드할 때 Content-Type에 명시하는 것이다. 우리는 이미지, 파일, PDF를 그 자체로 서버한테 전송할 수 없다. 서버가 이해할 수 있는 텍스트 파일 또는 바이너리(0101010001....) 형태로 바꿔서 전송해야 한다. Alamofire 리드미를 보면 Multipart Form Data를 업로드하는 과정에서 append 하는 데이터의 타입이 Data인 것을 확인할 수 있다. 따라서, 우리는 해당 이미지 파일을 타입에 맞게 변환하는 과정이 필요하다. 이미지 파일을 변환해주는 메소드는 pngData() Returns a data object that conta..

    [iOS] cell에 delegate, datasource 코드를 작성하지 않는 이유... 어쩌구...저쩌구...

    [iOS] cell에 delegate, datasource 코드를 작성하지 않는 이유... 어쩌구...저쩌구...

    왜 MainTableViewCell에 있는 contentCollectionView의 UICollectionViewDelegate, UICollectionViewDataSource 프로토콜을 왜 cell에서 작성해주지 않고 ViewController의 cell에서 불러와서 작성해주는 걸까? 라는 김태끼의 질문에 나도 같이 얹혀서 ... ㅋㅋ 또한, MVC 관점에서 로직이 처리되어야 하고 모델과 뷰 사이에서 중개하는 게 컨트롤러의 역할인데, tableview datasource, delegate는 컨트롤러의 영역이다. Cell은 UI를 그리는 영역으로 View에 속하기 때문에 해당 코드가 ViewController에 있어야 하는 것도 맞는 부분이다.

    [iOS] UIImagePickerController

    [iOS] UIImagePickerController

    UIImagePickerController (Class) A view controller that manages the system interfaces for taking pictures, recording movies, and choosing items from the user's media library. 사용자의 미디어 라이브러리에서 사진 촬영, 동영상 녹화 및 항목 선택을 위한 시스템 인터페이스를 관리하는 보기 컨트롤러입니다. 즉, 사진 촬영, 동영상 녹화, 갤러리 선택과 관련된 걸 관리하는 컨트롤러이다. 여기보면 UIImagePickerController는 UINavigatoinController를 상속하고 있다. 또한, UIImagePickerController는 AVFoundation에 속하..

    [iOS] 간만에 코드 자랑하기

    [iOS] 간만에 코드 자랑하기

    응 구라였음... 그렇다. 콜백지옥이다. 이것은.. 컴플리션 핸들러,,,, 그러니까 비동기 처리를 위해서 @escaping closure를 썼더니 발생한 문제점이다. 내 손으로 직접 이 코드를 작성해보다니, 감격스러워서 기록으로 남겨본다. 아마 분명 조만간 이 코드를 개선하는 수업을 듣겠지? 너무 기대된다. 어서 빨리 async, await을 배워서 적용해보고 싶다... 귀여운 내 뷰...

    [iOS] xib 사용해서 재사용 가능한 Custom View 만들기

    [iOS] xib 사용해서 재사용 가능한 Custom View 만들기

    View를 선택해 xib 파일을 만들어준다. 그 다음 두 번째로 Cocoa Touch Class를 선택해 해당 파일의 실제 UIView 클래스 파일을 만들어 준다. 나는 PosterView라고 이름을 지어줬다. 다음으로, xib 파일과 클래스 파일을 연결시켜주는 단계다. 두 가지 방법이 있다. Custom Class를 바꿀 건지, File's Owner를 바꿀 건지. 후자를 선택할 거다. 이유는 활용도가 더 높기 때문! 인스펙터 영역에서 5번째 부분을 보면 File's Owner가 있다. 해당 영역에서 PosterView를 찾아서 입력해준다. 아래 사진처럼 왼쪽 부분 Placeholders -> File's Owner를 먼저 선택하면 보일 거다. 근데 이조차도 보이지 않는다면,, Document outl..

    [Swift] required init?(coder: NSCoder)

    [Swift] required init?(coder: NSCoder)

    required init?(coder: NSCoder) xib에서는 xml 형태로 인터페이스 빌더 구성 정보를 가지고 있다. Xcode의 인터페이스 빌더에서 구성한 값들은 모두 .xib 파일로 저장이 되는데 .xib는 컴파일러가 이해할 수 없기 때문에 스토리보드나 xib 파일을 읽기 위해서 컴파일 시에 이해할 수 있는 형식인 nib으로 변환이 되는 것이다. (+ 그래서 UINib(nibName: "name", bundle: nil)을 통해 파일의 컨텐츠를 메모리에 캐시하고 있다가 초기화 시점에 Unarchiving을 하고 사용자의 씬에 보여주는 것이다. 여기서 Unarchiving은 xib 모델 객체를 저장하기 위해서, 객체의 프로퍼티를 기록하고 파일 시스템에 저장하는 작업을 archiving이라고 하는..

    [iOS] Swift Attribute 중 @IBInspectable과 @IBDesignable

    [iOS] Swift Attribute 중 @IBInspectable과 @IBDesignable

    @IBInspectable는 인터페이스 빌더의 인스펙터 영역에 보여주는 역할을 함 @IBInspectable var cornerRadius: CGFloat { get { return layer.cornerRadius } set { layer.cornerRadius = newValue } } 타입을 무한정으로 제공해주는 것은 아님. CGColor를 제공하지 않음 그리고 해당 코드는 컴파일 시에 바로 반영이 되지 않는다. @IBInspectable이 담당하는 것이 아니라 @IBDesignable이 담당하는 것이기 때문에 컴파일 시점에 확인하려면 이걸 사용하면 된다. @IBDesignable class SeSACButton: UIButton { // 스토리보드 상에서 인스펙터 영역에서 사용할 수 있음 @IBI..

    [iOS] 동기, 비동기 시작하기 앞서 그냥 오늘 배운 거...

    [iOS] 동기, 비동기 시작하기 앞서 그냥 오늘 배운 거...

    어떤 용량이 대빵 큰 이미지를 다운 받는 실험을 해보자.. 그러면 다운을 받아오기까지 그 외의 작업은 아예 못하는 것을 볼 수 있다. 토글 버튼을 움직이는 거나 등등 아무 것도 할 수 없다. 그러면 global 큐에 넣어서 비동기로 동시에 작업을 해줬을 경우에 어떤지 한 번 확인해보자! 사진을 받아오는 동안에 다른 작업이 가능하다! 그러나 사진을 받아오는 도중에 코드 상에서 보라색으로 경고창이 하나 뜬다. UIImageView.image must be used from main thread only 이미지는 메인스레드에서 사용되어야 한다. 그래서 이 말을 따라서 이미지뷰를 넣어주는 작업을 메인 스레드에서 처리해줬다. 그랬더니 오류가 생기지 않았다. 애플에서는 자체적으로 UI 작업은 메인스레드에서 처리를 ..

    [Swift] 강순참이 존재하게 된 이유...

    내부함수를 반환하는 외부함수를 만들 수 있다. 그 경우에 외부함수의 생명주기가 끝나도 내부함수의 생명주기는 끝나지 않는다. 그 이유는 은닉성 때문인데 그래서 내부 함수는 살아남아 내부 함수 주변의 지역 변수나 상수도 함께 살아남아 있다. 그래서 외부함수는 메모리에서 내려왔지만 내부함수의 그 아이들은 메모리에서 내려오지 않고 떠돌아다니며 자리를 차지해 잡아먹는다. 그놈들을 값이 캡처되었다고 말하고 캡처리스트라고 하는데. 클로저에 의해 그렇게 발생하는 것이고, 그런 이유에서 순환참조가 발생하는 것이었다. 충격! 신기해서 기록한다...

    [Swift] 일급 객체, Closure (1)

    [Swift] 일급 객체, Closure (1)

    *스위프트의 특징 1. 객체지향, 2. 프로토콜 지향 3. 함수형 프로그래밍 First Class Object를 함수가 가지고 있기 때문 스위프트에서 함수는 일급 객체의 특성을 가지고 있음 왜 일급 객체일까? 그 유래를 보면, 영국 크리스토퍼 컴퓨터 과학자가 낸 개념인데. 영국에는 일급 시민이라는 계급이 있었다. 함수가 어느 정도의 기능까지 할 수 있냐에 따라서 일급, 이급, 삼급으로 나눈 것이고 일급 객체만이 지금까지 남은 것이고 일급 객체 함수는 역할을 많이 하고 특이한 아이라는 점에서 그 특징이 크게 3가지가 있다. 일급 객체의 특징 1. 변수나 상수에 함수를 넣을 수 있다. func checkBankInformation(bank: String) -> Bool { let bankArray = ["우..