분류 전체보기

iOS

Fastlane - CI를 해보자

What is Fastlane? 배포를 자동화하기 위한 오픈소스 라이브러리 brew install fastlane fastline init //프로젝트 있는곳에서 해야함 Appfile : 앱의 번들 ID, app ID, team ID 정보가 담겨있음. Fastfile : 배포와 관련된 자동화 명령어들이 담겨있음. Gemfile : gem 목록 Gemfil.lock : 의존성 버전 관리를 위한 정보가 담겨있음. fastlane의 명령어는 fastfile에서 ruby언어를 사용하여 세팅. 앱 배포와 개발을 위한 certificate(개발자가 Apple) & provisioning profile(디바이스가 앱을 신뢰할수 있는지)을 등록하는데 두가지방법으로 도와준다. 1. match : 개인키와 인증서를 git..

Swift

Swift Concurrency - Async, Await

기존 GCD’s queue-based model&completion Handler의 문제점?Thread Explosion : 내가 쓰레들들 만들수 있어서 수많은 쓰레드속에서 switching이 필요하다. 우리가 왜 쓰레드를 만들었지? 프로세스 context swiching 때문에. 그런데 쓰레드가 너무많이생기면 문제CPU는 이전 쓰레드에서 새 스레드로 전환하려면 전체 쓰레드 컨텍스트 스위치 해야함.memory overhead: 블락된 쓰레드는 재실행을 기다리는 동안 메모리, 리소스를 가지고 있다,Priority inversion: Qos는 특정 queue에 높은 우선순위 일을 끝내기 위해 낮은 우선순위의 시스템리소스를 뺏었다.비동기 코드가 실행되면 코드가 control을 포기하기전까지 CPU core를 ..

ARkit

ARFaceTrackingConfiguration()

1. 먼저 기기에서 지원을 확인을 하는지 Appdelgate에서 확인을 한다. if !ARFaceTrackingConfiguration.isSupported { DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) { let alert = UIAlertController(title: "Unsupported Device", message: "This app requires TrueDepth Camera with iOS 11.0+", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Close", style: .default) { action in exit(0) }) self.window?.ro..

Swift

Combine3-Cancellable

Combine을 공부하다보면 Cancellable이라는 프로토콜을 자주 만나게 된다. 먼지도 모르고 그냥 쓰는 것은 내가 제일 싫어하는 것이기에 공부 바로 시작Cancellable"A protocol indicating that an activity or action supports cancellation."취소를 지원하는 활동 혹은 액션을 나타내는 프로토콜..? 이거 보고 이해하는 사람 있나여? 일단 나는 아님Combine에선 이벤트 스트림을 action이라하는데 이 것을 취소할수 있는 프로토콜이라고 한다.AnyCanclleablefinal public class AnyCancellable : Cancellable, Hashable비슷한 놈이 Cancellable프로토콜을 채택하고 있다. 이전의 sin..

Swift

Combine(1)-WhatisCombine(publish&subscirbe)

콤바인? 왜 사용하는데? 뭘 해결해줄 수 있는데?비동기처리에 X비동기코드의 선언적 접근 O코드 간소화 O⇒ 이 두가지를 위해 사용한다. 해결할 문제가 없다면 콤바인을 쓰지 마라!! 필요할때만 사용해라~~!!Publisher들은 변경될수있는애를 놓고 Subscriber는 그걸 받는놈.중첩된 클로저같은 번거로운애들을 코드 쉽게 읽고 관리할수 있도록 도와주는 거! 라고 애플에서 만든것. 코드를 쉽게 읽고유지관리할수 있따!!RXswift제대로 아직 공부못햇지만 combine으로 할수 있다. 더 좋음 왜? 퍼스트 파티라서.시간이 지남에 따라 값처리를 위해 통합된 선언적 API. 핵심요소 5가지프로토콜Publisher, Subscriber, Subject, Scheduler, CancellablePublisher ..

iOS

Operation

내부적으로 GCD기반인데 기능이 더 추가됨. 순서, 취소, 일시중지같은 것들 언제 Operation이 필요? ex)당근마켓에서 스크롤을 아래로 엄청내리면 페이지에 이미지가 다운이 안되어 이미지가 안나오는 경우가 있음. 그런데 이미 지나간 영역의 이미지를 표시할 필요가 있을까? => 이미 지나간것을 다운하는것을 취소하고 싶다. 오퍼레이션큐! 이놈도 클래스. 그러면 DispatchQueue하고 다르겟지? 1. 몇개의 쓰레드를 사용할지 구체적으로 세팅이 가능하다. maxConcurrentOperationCount가 몇개의 쓰레드를 사용할지 세팅 디폴트는 -1인데 이것은 iOS가 알아서 2. 서비스 품질 설정도 가능(5개)Qos 오퍼레이션 자체 품질 설정하면 큐자체가 품질이 올라감 queue.underlying..

Swift

lazy var

Lazy var 그게 몬데? 그냥 private var 이나 쓰면 되지 굳이 이런걸 왜써? 이렇게 생각하면 안댐 직독직해 게으른 변수는 매우 swift에서 메모리적으로 효율적이게 도와준다. 처음 사용되기전까지 연산이 되지 않기에!! 그럼 두번째부턴? 뭐가효율적? 이 그림하나로 lazy var를 어떻게 쓰는지는 완벽하게 설명이된다. computed Property랑 뭐가 다를까? 바로 처음 사용될때 메모리에 올리고 그 후부터는 그냥 메모리에 올라온값사용! 연산프로퍼티는 사용할때마다 연산을 한다 장점 - 뷰 로드될때 모든 인스턴스를 올린다면 메모리 과부하를 막을수 있다 와 그렇다면? 그냥 모든 규모 큰 변수들을 lazy 처리하게 된다면 앱의 안정성과 효율성은 짱짱 좋아지는 거 아냐? 당연히 ㄴㄴ~! - 여러..

iOS

Race Condition(경쟁상황)

What is this? 2개이상의 쓰레드에서 공유된 데이터(변수,객체)에 동시적 접근하는 경우 해결방법? Thread-safety : 여러 쓰레드를 사용하여 접근하여도 데이터에 한번에 한개의 쓰레드만 접근가능하도록 처리하여 경쟁상황의 문제없이 사용하겠다~ 그러면 LOCK걸어? ㄴㄴ 이건 low한 해결책임 1. TSan (thread sanitizer tool) 으로 하면 어디서 race condition인지 알수 있다. 이건 단지 확인방법 2. Serial Queue + sync(엄격한 쓰레드 safe) DispatchQueue.global().async { serialqueue.sync { _count } } 여기서 async가 아닌 이유 async로 보내게 되면 제대로 된 값을 얻지못하고 count..

SWIFTUI

life cycle - swiftui

Uikit를 공부한 당신? viewDidLoad, ViewDidAppear, ViewWillAppear....등 다양하게 공부를 하며 라이프 사이클을 공부했을것이다. 물론나도! 하지만 swiftui에서는 이런게 없다. onAppear? onDisappear이런놈들이 있다. 그렇다면 onAppear는 뷰가 제일 먼저뜨면 실행되는건가?라고 생각을 하였다. 그러다 내가 코드를 짜다가 문제가 생겼다. 다음뷰에 넘어갔다가 이전 뷰로 돌아와서 onAppear에서 state변수를 바꿔주는 것인데 함수의 코드가 먼저 실행되고 onAppear에 들어가는 경우가 생겼다.,,, 어? 뭐야 뭔데 그래서 이번기회에!! 라이프사이클을 정확하게 파보려한다. onAppear 뷰가 화면에 나타날때마다 실행된다. init()은 초기한번..

iOS

디스패치 그룹

TASK를 그룹으로 짓고 그룹으로 묶인 작업이 끝나는 시점을 알고 싶다! 그룹1의 작업이 여러쓰레드에서 작업을 해도 묶여있고 마지막 task가 끝나는 시점을 알 수 있다. ex) 런치스크린 후 앱첫화면 나오는데 메인에서 이미지를 다 다운받지 못한다면? 에러처럼 보이게 된다. 그러면 마지막꺼까지 다 받고 앱을 그려주자! let group1 = DispatchGroup() DispatchQueue.global(qos:).async(group: group1){} group1.notify(queue.DispatchQueue.main){[weak self] in self.textLabel.text = "끝"} queue로 보낼때 어떤 그룹으로 보낼지 정해주면 된다. 모든작업이 끝날때까지 현재 대기열 블락하는 동기..

2료일
'분류 전체보기' 카테고리의 글 목록 (6 Page)