WWDC 2015 Performance on iOS and watchOS Introduction 앱의 성능에 대한 범주는 너무 광범위하다. 그렇기 때문에 몇가지 범주로 나누어 해당 영역에서 앱의 성능을 개선하기 위한 구체적인 전략을 제공하려 한다. 1. Why should i think about performance? 성능에 대해 생각해야 하는 이유는 무엇 일까? 성능을 다른말로 요약하자면 하나의 기능이다. 성능은 사용자에게 앱에서 뛰어난 경험을 제공하기 위한 핵심 요소이며, 앱의 코드를 작성하는동안 항상 염두에 두어야한다. 앱의 반응성이 좋아 유저의 입력에 기다리지 않고 즉시 반응 하고 이를통해 유저가 정보에 액세스 하거나 상호 작용을 한다면 유저와 긍정적 신뢰 관계를 구축 할수 있게 된다. (음....
Concurrent Programming With GCD in Swift 3 모든 코드를 main thread에서 실행한다면 새로운 프로젝트를 만들때 해당 응용 프로그램은 기본으로 메인 스레드를 갖게된다. 메인 스레드는 UI에 표시될 모든 코드를 실행하는 역할을 한다. 메인 스레드에 데이터 변환이나 이미지 처리와 같은 큰 작업을 하게된다면 UI에 문제가 생기게된다. UI가 느려지거나 멈추는 상황이 발생할 수 있다. 이러한 문제를 방지하기 위해서는 애플리케이션에 동시성 개념을 도입해야한다. 동시성을 사용하면 애플리케이션의 여러 작업을 동시에 할수 있게 된다. 동시성을 사용하기 위해서 새로운 스레드를 생성하고 새로운 스레드에 작업을 시키게된다. Concurrency 하지만 동시성을 도입할 경우 스레드 안정성..
Apple Watch, URLConnection 관련내용은 정리하지 않은 글입니다! WWDC Networking with NSURLSession 📌 배경지식 URLSession 주로 웹에서 HTTP 콘텐츠를 다운로드 하는데 사용되는 네트워킹 API이다. 인증 및 기타 중요한 이벤트 처리에 사용할 수 있는 delegate methods가 있다. 가장 큰 특징은 앱이 백그라운드 다운로드 API를 통해 실행되지 않는 동안에도 네트워킹을 할수 있다는 것 이다. HTTP는 서버에 요청하고 응답하여 데이터를 가져오는 것이 핵심인데, HTTP 자체는 clear text로 전송되기 때문에 불안정하다. (clear text는 암호화되지 않은 상태로 텍스트를 전송하거나 저장한다. 따라서 clear text를 표시하기 위한..
Reactive programming란 🔑 핵심 키워드: 비동기적 데이터 흐름과 변화의 전파에 중점을둔 프로그래밍 반응형 앱을 만들기 위한 비동기적 데이터 흐름과 변화의 전파에 중점을둔 프로그래밍 페러다임입니다. Reactive programming을 위해서 Swift는 Combine이라는 framework를 제공하고 있으며, Third party framework로 Rx등이 있습니다. 꼬리질문 비동기 프로그래밍이란 무엇인가요? 🔑 핵심 키워드: 여러 작업을 동시에 작업하는 것, Rx또는 Combine등 프레임워크는 비동기 작업의 콜백처리를 쉽게 할 수 있게 해준다. 비동기 프로그래밍이랑 여러 작업을 동시에 작업하는 것입니다. 동시에 작업을 처리할 수 있도록 쓰레드를 나눠 작업합니다. Swift는 비동기..
Underline SegmanetControl 포폴용으로 마켓 앱을 만들고 있는데 오늘의집의 앱의 상단에 위치한 누르면 underline이 움직이는 요거 만들고 싶었습니다. 먼저 SegmentControl을 상속받는 CustomSegmentControl 을 만들어줍니다! private enum SegmentType: String, CaseIterable { case latelyProduct = "최근 상품" case popularProduct = "인기 상품" static var value: [String] { return Self.allCases.map { $0.rawValue } } } final class UnderlineSegmentControl: UISegmentedControl { init()..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cY4T8u/btrJu5D0zp7/0DtsF97sCwUdpYpvzGPKZ0/img.png)
문제설명 위의 문제를 보고 아래와 같은 형태로 만들어 풀수 있겠다 생각했고 접근했다. ["classic": [[0, 500], [2, 150], [3, 800]], "pop": [[1, 600], [4, 2500]]]1번째 풀이 import Foundation func solution(_ genres:[String], _ plays:[Int]) -> [Int] { var bestAlbum: [Int] = [] var musicDictionary: [String: [[Int]]] = [:] for i in 0.. second.value.map { $0[1] }.reduce(0, +) } for i in 0.. $1[1] } bestAlbum.append(music[0][0]) bestAlbum.append..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/HJFXn/btrJpenKLCl/sYh84kcFfKksKkZJbvTpLk/img.png)
조합의 갯수를 계산하는 문제. 스파이가 가진 의상들이 담긴 2차원 배열 clothes는 [의상의 이름, 의상의 종류] 형태로 되어있다. 여기서 의상의 이름은 중복되지 않고, 의상의 종류는 중복될 수 있다. 조합의 가짓수 를 계산하는 공식은 의상의 종류 A, B, C가 있을때 A, B, C 각각 +1 해준뒤 곱하기를 해주면된다. 하지만 아무것도 입지 않는것은 제외이므로 최종 공식은 (A+1) * (B+1) * (C+1) -1 이된다. 문제 func solution(_ clothes:[[String]]) -> Int { return 0 } 인자값으로 String값을 갖는 2차원 배열을 받는다. 인자값의 예시는 다음과 같다. let clothes = [["yellow_hat", "headgear"], ["bl..
Generic 에 대해 설명하시오 타입 혹은 함수를 정의할때 추상적인 타입을 표기하여 중복코드를 방지하고 재사용 가능한 유연한 타입과 함수를 만들수 있게 하는 것입니다. where 절이나 protocol 명시로 추상 타입에 제약을 줄 수 있습니다. 제약을 준수하지 않으면 copmile error 가 발생합니다. 꼬리질문 제네릭의 타입 파라미터는 언제 실제 타입으로 변환되나요? 타입 파라미터는 사용할때 실제 존재하는 타입으로 치환 되며 이과정을 구체화(specialization) 라고합니다. 함수의 경우 실제 호출되었을때 타입 파라미터가 존재하는 타입으로 치환되며 타입의 경우 초기화 되어 메모리에 올라갈때 치환된다. 성능에 이점이 있나요? Struct와 Protocol을 사용해 다형성을 구현하게되면 cla..