목록전체 글 (64)
GGURUPiOS
MVC ( Model - View - Controller ) MVC는 디자인 패턴 중 하나로, 앱의 구조를 나누어 관리하고 개발하는 방법론 중 하나 임 MVC 패턴은 앱의 구성 요소를 세 가지 주요 부분으로 나누어 관리 함 Model: 데이터 관리 View: UI를 담당함 (UIview, UILabel 등) Controller: 모델과 뷰의 중재자역할, 모델의 데이터 갱신, 뷰 업데이트, 상호작용 처리 (UIViewController) Model 데이터 관리 비지니스 로직 처리 데이터 상태 관리 독립성 유지 View 데이터의 시각적 표시 사용자 입력 처리 UI 이벤트 처리 업데이트된 모델 처리 (변경 감지) UIKit의 UILabel, UIButton 등 Controller 위의 말한 Model과 Vie..
Actor 등장배경 동시성 프로그래밍을 작성할 때 어려운 문제 중 하나는 Data races를 피하는 것임 Data Races? → 두 개의 개별 스레드가 동시에 동일한 데이터에 액세스하고 액세스 중 하나 이상이 쓰기인 경우 발생 Data Races 는 디버깅하기 매우 어려움 예를 들어보자 Counter 라는 클래스를 생성하고, 클래스 내부의 value 값을 증가시키는 increment 함수를 생성함 기대하는 출력 값은 1,2 혹은 2,1 이지만 두 Task 모두 0을 읽고 1을 증가 시키면 1,1 혹은 2,2 가 출력될 수 있음 race를 유발하는 액세스가 다른 부분에 있을 수 있기 때문에 추론이 필요함 → 디버깅이 어려움 data race는 공유 가변 상태(shared mutable state)에 의..
Strucuted Concurrency 배경 스위프트에서 structured concurrency 는 structured programming 에 기반을 둔 개념임 간단히 말해서 구조화된 프로그래밍은 위에서 아래로 읽히기 때문에 제어 흐름과 변수의 수명을 이해하기 쉽게 함 그러나 오늘날의 프로그램은 비동기, 동기를 같이 사용하기 때문에 구조화된 프로그래밍을 사용하기 어려웠다. ( 예를들어, 네트워킹이 필요한 작업에서 콜백함수를 호출 한다던가 하는 ) 그러나 async/await 는 구조화된 프로그래밍 기반으로 만들어 졌기 때문에, async/await 로 구조화된 프로그래밍이 가능해 짐 그러나, 만약 위와 같은 코드에서 수천 개의 이미지에 대해 썸네일을 생성한다고 했을 때 → 각 섬네일을 한 번에 하나씩..
Concurrency Concurrency는 Swift 공식문서 정리할 때도 한 번 봤었는데 그 때 헷갈렸던 내용을 이번에 제대로 정리하고자 함 Concurrency 는 Swift 5.5에서 구현된 새로운 기능으로, 비동기적인 코드 작성을 보다 쉽게 만들어 줌 이를 위해 몇 가지 새로운 기능과 개념이 도입됨 공식문서에 있는 내용들 크게 세부분으로 나눌 수 있음 async/await structured concurrency actors Async/await 등장 배경 (그동안의 문제점? 정도) 자세한 건 하나하나 알아보겠습니다. 명시적 콜백(completion, completionHandler)를 사용하는 비동기 프로그래밍 에는 많은 문제가 크게 5가지가 있음 1. Pyramid of doom 간단한 비동..
Operation GCD를 객체지향적으로 새롭게 추가된 API임 GCD와의 차이점은 GCD에서의 코드블럭들(Task)을 캡슐화, 객체화 해낸 것임 객체화의 장점 재사용 용이 타입 간 관계 형성 다양한 프로퍼티 활용 스케쥴링에 용이 Operation Operation은 추상클래스이기 때문에 이를 상속 받는 타입을 사용해야함 2가지 방법 BlockOperation 사용 커스텀 클래스 사용 만들기 BlockOperation은 Operation의 하위 클래스임 let operation = BlockOperation { } // addExecutionBlock은 BlcokOperation 메서드임 // 이 메서드는 Operation 동작이 끝난 후 원하는 코드를 실행 해줄 수 있음 operation.addExec..
GCD (2) 활용 DispatchQueue를 main, global() 말고 커스텀해서 사용할 수 있음 DispatchQueue의 초기화 convenience init(label: String, qos: DispatchQoS = .unspecified, attributes: DispatchQueue.Attributes = [], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, target: DispatchQueue? = nil) label let dispatchQueue = DispatchQueue(label: "ggurup") DispatchQueue의 label을 설정해주는 파라미터 DispatchQueue의 이름은 변수나 ..