GCD(Grand Central Dispatch) 작업을 동시에 처리하기위해 스레드를 여러개 활용하는것은 불가피하다. 그렇다면 어떻게 스레드를 관리해주어야 할까?? 일일이 개발자가 스레드를 관리하는것은 매우 번거롭고 힘든일이다. 애플에서는 코드를 동기 혹은 비동기로 처리해준다면 시스템이 알아서 스레드를 관리해주는 방식을 제공하며 그것이 GCD 이다. GCD는 멀티 코어 환경과 멀티 스레드 환경에서 최적화된 프로그래밍을 할수 있도록 애플이 개발한 기술이다. GCD 를 사용하기 위해 Dispatch 라는 프레임워크를 사용해야하며 Dispatch Queue 라는 클래스를 사용해 대기열에서 작업의 순서를 동기, 비동기 처리만 해주면된다! Dispatch Queue Dispatch Queue 가 무엇이냐? GCD..
동시성 프로그래밍 에 필요한 개념들 멀티 스레드 환경에서 여러가지 작업을 동시에 처리하는 기술을 말한다. 동시성 프로그래밍이란 영어로 Concurrency Programming 라고 한다. 지금껏 나는 코드는 한줄, 한줄 순서대로 실행되는것으로 알고 코드를 작성해왔다. 동시성 프로그래밍을 이용해 동시에 여러가지작업을 하는것처럼 보이게 할수있다. 예를 들면 자주사용하는 음악재생 어플을 예시로 들어보자. 노래를 재생시켜두고 음악재생 어플에서 다른 뷰를 띄워주거나 동시에 다른 작업들을 하기도한다. 동시성 프로그래밍은 이를 가능하게 하는것이다. 코어 코어는 CPU 의 핵심으로 CPU 에서 실제로 일을 처리하는 녀석이다. 코어는 한번에 한가지 일만 할수있으며 코어가 여러개라면 여러개의 일을 동시에 처리할수 있다...
Swift Lint 란? 커뮤니티 혹은 팀에서 정한 스타일 규칙을 따르지 않는 코드부분을 식별하고 표시하는것을 도와준다. 개발자 마다 코딩 스타일이 다르기때문에, 코드를 작성할 때 추천하는 코딩 스타일, 괜찮은 사례등을 모아 놓은 가이드 라인이다. 이러한 코딩 컨벤션들을 Rule로 정함으로써 모든 Swift 코드가 일관성을 유지하도록 해준다. 이렇게 하면 새로운 개발자가 합류하거나 예전 코드를 읽을 때 도움이 된다. Rule Swift Lint Rule Swift Lint 에는 75개가 넘는 룰들이 있다. Rule에는 Default로 적용되는 Rule도 있지만 사용자에 의해 적용되는 Rule들도 존재한다. Rule들을 세부적으로 적용 시키기 위해서는 .swiftlint.yml파일을 추가해주어야 한다. R..
Static Dispatch, Dynamic Dispatch Static Dispatch(컴파일 타임), Dynamic Dispatch(런 타임) 여기서 Dispatch 는 직역하면 보내다 라는 뜻인데, 어떤 함수를 호출할것인지 결정 해주는것같다. swift 에서는 Static Dispatch, Dynamic Dispatch 두가지 방식이 있다. Static Dispatch(컴파일 타임) 요 방식은 컴파일 타임에 호출될 함수를 결정하고 런타임때에 그대로 실행시킨다. Dynamic Dispatch(런 타임) 요 방식은 런타임에 호출될 함수를 결정한다. 그렇기때문에 swift 에서 클래스마다 함수 주소값의 배열인 vTable(Virtual Dispatch Table) 을 유지하게된다. 하위 클래스가 메서드를..
MetaType, self 와 Self MetaType 공식문에서는 Metatype 은 타입의 타입이라고 정의 되어있다. 이게 대체 무슨소리일까.. 아래 예시를 보자 struct Person { static let name = "malrang" var age = 29 } let malrang = Person() 지금껏 나는 Person 이라는 타입을 정의한후 Person 타입의 malrang 이라는 상수를 정의해주었다. malrang 은 Person 타입의 인스턴스다. 하지만 여기서 Person 은 타입의 타입인 메타타입이라 한다. malrang 인스턴스의 타입의 타입 그러니까 즉 타입 자체?본체?를 메타타입이라고한다. type(of:) 요 메서드는 파라미터에 인스턴스를 넣게되면 인스턴스의 메타타입을 반..
Json 제이슨..!누구냐 넌? Json(JavaScript Object Notation) 메모리에서 살고있는 객체를 디스크에 저장했다가 다음에 다시 사용한다던지, 다른 컴퓨터 다른 시스템으로 전달을 하고 싶을때 사용할수있다. 메모리에서 살고있는 객체는 0,1 로 이루어져 있다. 읽고 쓰는 방식이 컴퓨터 마다 다르다. 그렇기에 0,1 그대로를 usb 등 매개체에 담아 다른곳에 보내게 되면 제대로 읽고 쓸수 없게될 확률이 높다. 이때 Json 형식으로 저장하여 옮기게되면 다른 컴퓨터 혹은 시스템에서 내가 만들어둔 객체를 다른곳에서도 동일하게 해석하여 내가 만들어둔 객체와 동일하게 작동하도록 해준다. 쉽게 얘기하면 컴퓨터와 컴퓨터가 0,1 을 동일하게 해석할수있게끔 하는 약속이 필요했다. Json 의 규칙들..
Assets 에서 Json 파일 읽기 프로젝트에서 Assets 에 포함된 Json 파일에 접근하기 위해서는 NSDataAsset 을 사용할수 있다. NSDataAsset 공식 문서의 선언 부를 보자! class NSDataAsset: NSObject 요녀석을 사용하려면 UIKit 을 import 해줘야 한다! 이녀석을 사용하면 JSON 파일을 NSData 타입으로 변환 해준다. 사용 방법 static func parse( name: String) -> Self? { guard let asset = NSDataAsset(name: name) else { return nil } let jsonData = try? JSONDecoder().decode(Self.self, from: asset.data) ret..
CaseIterable When using a CaseIterable type, you can access a collection of all of the type’s cases by using the type’s allCases property. enum(열거형) 에서 caseIterable 프로토콜을 채택 할경우 allCases 타입 프로퍼티를 사용할수 있게 해준다. 예시 enum Something: CaseIterable { case a, b, c } let someCharacter = Something.allCases.randomElement() 위의 예시 처럼 enum 을 컬렉션 타입처럼 활용할수 있게 된다. 작동 방식은 프로토콜을 채택하였기 때문에 CaseIterable 의 해당 구현부를 en..