[Swift] GCD와 swift concurrency가 나오게된 배경과, concurrency 기본개념
·
앱/Swift
Swift Concurrency 이전의 DispatchQueue (GCD)가 나오게 된 배경이전의 Grand Central Dispatch(GCD)는 정확히 당신이 생각한 대로 thread pool을 시스템 레벨에서 관리하여 thread explosion을 방지하기 위해 만들어졌음GCD 이전의 문제점들Thread 직접 관리의 어려움:개발자가 직접 Thread를 생성하고 관리해야 했음Thread 생성 비용이 높고(스택 메모리 할당, 커널 데이터 구조 등), 각 Thread마다 최소 512KB의 메모리 필요Thread explosion: 동시성 작업이 많아지면 무분별하게 Thread가 생성되어 시스템 리소스 고갈Apple 문서의 표현:"In the past, introducing concurrency to ..
[iOS] ReactorKit을 Combine으로 구현하는 법
·
앱/Swift
회사서비스 특성상, 서드파티 라이브러리를 사용할수 없기 때문에 아키텍쳐가 조금 난잡한 경향이 있어서, 리액터킷을 도입하기 위해서combine으로 리액터킷 프레임워크 만들어봤습니다. pulse 구현 state로 구현을 하고 싶었으나, 구현에 시간이 조금 부족해서 그냥 바로 publisher를 방출하는 pulse로 구현하였습니다.@propertyWrapperfinal class Pulse { private let subject: CurrentValueSubject var wrappedValue: Value { get { subject.value } set { subject.send(newValue) } } /// 외부에서 Combine 구독 할수..
[iOS] moya를 combine을 이용해서 구현해보자
·
앱/Swift
https://medium.com/@islammoussa.eg/building-a-network-layer-using-combine-ios-with-a-structure-similar-to-moya-3abd9d23b16참고해서 combine형태의 moya스타일로 처리할수 있다.TargetTypeprotocol TargetType { var baseURL: String { get } var path: String { get } var method: ShopLiveHTTPMethod { get } var parameters: [String: Any]? { get } var headers: [String: String] { get } var timeoutInterval: Dou..
Compositional Layout를 통해 리팩토링 하기
·
카테고리 없음
Compostional LayoutCompositional Layout은 iOS 13버전부터 지원되는 UICollectionViewLayout 의 한 유형입니다. 유연하고 빠르게 설계되어, 작은 구성 요소를 결합하는 방법으로 레이아웃을 구성하고 이를 통해 시각적 배열을 원하는 형태로 구성할수 있습니다. 대표적으로는 앱스토어 앱이나, 유튜브 뮤직 앱과 같은 레이아웃 구성을 쉽게 할수 있도록 해주는것이 바로 Compositional Layout입니다. Compositional Layout 구성Compostional Layout은 크게 3가지로 구성됩니다.Item : 단일 CellGroup : 아이템 또는 그룹 으로 구성된 하나의 단위Section : 그룹들로 이루어진 하나의 단위레이아웃은 데이터소스와 상관..
Reactorkit의 Pulse 구현부에 대해서
·
앱/Swift
@Pluse 란?Pulse has diff only when mutated To explain in code, the results are as follows.'Pulse는 수정된 값이 동일할지라도 이벤트를 받을수 있음 즉, 이벤트가 false, false, false 이렇게 와도 개별적 이벤트를 받을수 있다.어떻게 이게 가능한지 내부 로직을 한번까보자Pulse 내부 동작@propertyWrapperpublic struct Pulse { public var value: Value { didSet { self.riseValueUpdatedCount() } } public internal(set) var valueUpdatedCount = UInt.min public init(wrappedValue..
TCA에서 watchConnectivity활용하기(feat. dependency)
·
앱/SwiftUI
swiftUI를 통해서 Watch앱을 구성해야하는데, 이때 TCA를 도입하였습니다.하지만, watch는 watchConnectivity를 사용해야하는데, 이때 watchConnectivity는 Delegate로 다 구현되어있습니다.하지만 TCA에서는 이러한 외부 의존성에 대해서는 Dependency를 사용하고 있기 때문에 기존의 delegate를 래핑할 필요가 있었습니다.따라서 해당 코드를 짜기 이전에 swift concurrency를 간단하게 이해하고, 래핑하는 코드까지 살펴보도록 하였습니다.Swift concurrency내부적으로 어떻게 많이 돌아가고 하는 내용은 조금 제외하고, 간략하게 설명하면서 swift concurrency와 asnycStream과 같은 내용을 정리해봅시다.async funcf..
Moya Mock Data 사용하기(feat. test Double)
·
앱/Swift
회사 작업을 하다보면 api의 목데이터나, 혹은 배포가 되기 이전에 목api를 사용하고 싶을때가 존재한다.이때 moya를 이용하고 있다면 목데이터를 직접 설정하여 사용할수 있다.   Moya 기초moya는 alamofire를 래핑하고 있는 라이브러리로, TargetType이라는 프로토콜을 사용해서 상당히 간단하게 api를 작성하고 사용할수 있다.moya에서 사용하는 중요한 개념들Provider: Moya의 MoyaProvider는 모든 네트워크 서비스와 상호작용할때 사용할 객체Target: Moya target은 일반적으로 전체 API 서비스를 설명합니다. 타겟은 서비스, 그 자체의 가능한 끝점, 요청을 이행하는 각 끝점에 요구되는 정보를 설명합니다. TargetType 프로토콜을 체택하는 것으로 tar..
reactorkit에서 testcode 작성 하는법(feat. nimble)
·
앱/Swift
먼저 테스트 코드의 장점과 단점 이런글보다는이번글은 좀더 리액터킷의 테스트 코드를 짜기 위한 방법론에 가까운 글이다.무작정 한번 알아보자~  테스트 코드 작성하는 방법테스트 케이스 이름 작성법test_유닛이름(구조체, 클래스 등)_유닛내부(프로퍼티, 메서드 등)_예상동작맨 앞에 test는 꼭 붙여줘야 테스트를 실행할 수 있다. 테스트 케이스 구조는 다음과 같다. 1. Given(주어진 상황)테스트 케이스에서 테스트할 상황을 설정하는 부분테스트에 필요한 초기 조건을 설정하고 입력값을 준비테스트 환경 설정 or 객체를 생성하는 등의 작업을 수행함 2. When(동작)테스트할 동작이나 메서드를 호출하는 부분테스트 대상이 되는 메서드나 특정 동작을 수행하고 그 결과를 확인 3. Then(결과 확인)테스트의 예상..
CustomView) Two Button Slider 구현하기 UIkit
·
앱/Swift
Two button slider를 구한현 예제가 많지 않고, 거기에 이번에 회사 스팩중에 하나가 슬라이더 안에 밑에 격자가 들어가거나, 위에 점이 들어가거나 하는 커스텀이 많이 들어갔다.그래서 나처럼 구현할 사람이 있을것 같아서 블로그에 남겨본다.먼저 편의성을 위해서 snapkit과 then을 사용한 코드 임을 감안! 해주세요!슬라이더 예시   //// SliderView.swift// twoHandledSlider//// Created by 최진용 on 10/12/24.//import UIKitimport Thenimport SnapKitprotocol SliderViewDelegate: AnyObject { func sliderView(_ sender: SliderView, changedV..