hot observable 따로 Subscribe(구독)를 기다리지 않고, 요소들을 배출함 cold observable Observer가 Subscribe 하기 전까지 아무것도 배출하지 않는다.
Observable 은 Observer (이해를 돕기위해 소비자 개념으로 보자) 에게 소비할 수 있는 값을 발행한다. 순차적으로 접근해 보면 다음과 같다. 1. Observer가 Observable을 Subscribe(구독) 한다. 2. Observable이 아이템들을 내보낸다. 3. Observer가 Observable의 아이템들을 소비한다. Observable 의 주요 함수 onNext : 모든 아이템들이 하나씩 들어온다. onComplete : 모든 아이템들이 onNext를 거치고 나면 Observable이 onComplete를 호출한다. onError : Observable이 에러가 발생하면 onError가 호출되며, onError가 호출 되면 onComplete 는 호출되지 않는다.
간단하게 Observable 을 테스트 해보자. var list:List = listOf("Alpha", "Beta", "Gamma", "Delta", "Epsilon") var observable : Observable = list.toObservable() @Test fun simpleObservable() { observable.subscribeBy( onNext = { println("it = $it") }, onError = { it.printStackTrace() }, onComplete = { print("Complete ! ") } ) } 결과 코드를 순서대로 설명하자면, 1. 리스트 생성 2. 생성한 리스트로 observable 인스턴스 생성 3. observable 인스턴스 구독 일단 ..
- 데이터 스트림, 변경사항을 중심으로 하는 비동기 프로그래밍 패러다임. 장점 1. 콜백 지옥의 제거 2. 간결한 스레드 사용 3. 간단한 비동기 연산 4. 모든 작업에 동일한 API 5. 함수형 접근 6. 오류처리에 대한 표준 메커니즘 7. 유지보수 및 테스트 편리
기존 Google Analytics 가 훨씬 다양한 기능과 세부적인 필터링이 가능하지만 지원 중단 대상이 되었습니다. 따라서 Firebase Analytics 로 포스트 작성 하였습니다. https://support.google.com/analytics/answer/9167112?hl=ko&ref_topic=2587085 Google 웹로그 분석 서비스 SDK 지원 중단 - 애널리틱스 고객센터 도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요 support.google.com App을 배포 하고 나서 사용자의 앱 반응이나, 각 기능별 활용도, 화면 별 사용률을 알수 있으면, 앱을 사용자의 편의성에 맞게 업데이트 하는데 유용한 정보가 될 것이다. 따라서 앱을 Tracking 하여 사용자의 앱 활..
요즘 어플리케이션은 대부분 수시로 추가되고 변하는 컨텐츠를 보여주는 방식이기 때문에 서버와의 통신이 불가피 하다. 따라서 오늘은 서버와 API 통신을 할수있게끔 도와주는 Alamofire 라이브러리를 적용해 보겠다. 1. 설치 Podfile에 pod 'Alamofire' 를 추가하고 터미널에서 해당 프로젝트 디렉토리 (Pod파일이 위치한 곳 )Pod install 을 입력해준다 2. 통신전 준비 - Model import Foundation struct BoardList: Codable { let idx: Int let title: String let content:String } - API Url 및 Param Code enum Result { case success(T) case error(Error..
1. Podfile에 pod 'RealmSwift' 2. 추가후 터미널에서 해당 프로젝트로 이동후 Pod Install 입력 3. Object 생성 예시) import RealmSwift class Person: Object { @objc dynamic var name = "" @objc dynamic var age = 0 } 4. 데이터 추가 (Create) let realm = try! Realm() let person = Person() person.name = "RealmTest" person.age = 10 try? realm.write { realm.add(person) } 5. 데이터 조회 (Read) - Realm에 저장된 모든 데이터 확인 let realm = try! Realm() le..
1. JIT Compiler 는 Just-In-Time 의 약자로 런타임시 바이트 코드를 기계어로 번역한다는 의미로 해석을 할수 있다. JIT Comiler 는 JRE(Java RunTime Environment) 안에 속해 있으며, 실행할때마다 매번 기계어로 번역하는것이 아니라, 처음 코드를 실행시에는 기계어로 번역하여 캐시에 저장해두고, 두번째 실행부터는 캐시에서 불러와 사용하므로, 반복되는 코드는 실행속도가 빠르다. 반대로의 경우는 오히려 성능이 떨어질수 있다. 2. AOT Compiler JIT이 동적 컴파일러 라면 AOT(ahead-of-time)는 정적 컴파일러 이다. JIT이 런타임에서 실행될때 추가 메모리및 CPU 싸이클이 필요하기때문에 이를 보완하는게 AOT 이다. 실행시간 전에 컴파일을..
String, , Stringbuffer , Stringbuilder 의 성능 차이에 대해서 알아보자 1. String 먼저 String 같은 경우는 immutable 하다. 이는 변하지 않는다는 뜻인데, 예를 들어 우리가 + 연산자를 이용해서 문자열을 더할때 String str1 = "Hello" ; String str2 = "World"; str 1 = str1 + str2; 를 할경우 실질적으로 str1 의 값이 str1 + str2 로 합쳐진 값이 바로 저장되는 것이 아니라. new String(str1 + str2 ) 의 형태로 새롭게 인스턴스가 생성되어 저장된다. 따라서 반복문 안에서 String의 값을 변경할때 위처럼 사용하면, 성능이 떨어지게 된다. 2. Stringbuffer, Strin..
Crashlytics custom error 를 만들어 보겠습니다. 먼저 같이 사용하면 좋은 유용한 Crashlytics Method를 정리해 보겠습니다. 1. User Info Crashlytics.sharedInstance().setUserIdentifier("123456789") Crashlytics.sharedInstance().setUserEmail("person@domain.com") Crashlytics.sharedInstance().setUserName("Awesome AppUser") User Info 를 설정하는 Method 입니다. 위 처럼 설정하면 에러 이벤트 발생시 User Info 가 포함되어 보여집니다. Crashlytics 에 그림 1과 같이 User의 정보가 노출 됩니다. ..