일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- combine
- HIG
- UITextView
- MVVM
- uiscrollview
- clean architecture
- swift documentation
- tableView
- Xcode
- 클린 코드
- 스위프트
- Protocol
- UICollectionView
- Observable
- 리펙토링
- uitableview
- swiftUI
- SWIFT
- 애니메이션
- ribs
- rxswift
- ios
- RxCocoa
- 리펙터링
- Human interface guide
- 리팩토링
- Refactoring
- Clean Code
- collectionview
- map
- Today
- Total
목록ios (1095)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bNPfzM/btssqoyxoM4/lOhGUBnKhBhIIrSKIcVqzK/img.png)
swift-benchmark 오픈소스 git repo 특정 기능에 대해서 속도 최적화해보고 싶은 경우, 어떤 것이 더욱 최적화 되는 작업인지 확인해야하는데 이 때 벤치마크를 통해 의사결정이 가능 benchmark 사용하기 위해서 아래 URL을 사용하여 SPM으로 추가 https://github.com/google/swift-benchmark 사용하는 것은 매우 간단하게, benchmark 함수의 클로저로 전달하면 완료 import Benchmark benchmark("add string no capacity") { var x1: String = "" for _ in 1...1000 { x1 += "hi" } } benchmark("add string reserved capacity") { var x2: ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bSJxkt/btssaShMDZ9/qh1weEfXOom1Ld2KkD7ba0/img.png)
1. 인코딩 개념 - JSONSerialization와 JSONEncoder() 차이 2. 인코딩 개념 - JSONSerialization 사용 시 주의 사항 (크래시 - JSON write) JSONSerialization 개념 (복습) JSONSerialization은 jsonData 타입을 [String: Any]으로 변경하는 것 혹은 그 반대로 변환 ([String: Any] => jsonData) JSONEncoder와 차이 및 구체적인 개념은 이전 포스팅 글 참고 만약 struct을 jsonData로 변환하려면 JSONEncoder를 사용해야함 cf) jsonData를 struct로 변환할 경우 JSONDecoder 사용 JSONSerialization 주의 사항1) struct 변환 json..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/mVT6p/btssfSgJiny/vdpsFt7zMlrhOk1pffX9G1/img.png)
1. 인코딩 개념 - JSONSerialization와 JSONEncoder() 차이 2. 인코딩 개념 - JSONSerialization 사용 시 주의 사항 사전지식) Data 형태란? Data는 메모리에 있는 byte형태를 의미 byte형태라는 의미는, 일종의 바이너리 형태의 데이터 바이너리 형태로 변환하면 좋은 이유 바이너리 형태로 변환하는 이유는 파일 입출력, 서버 통신, DB와 주고받을 때 통일된 방식으로 전환이 가능하며 효율적 만약 문자열로 데이터를 전송하면 텍스트를 유니코드 형태로 인코딩하고 디코딩해야 하므로 복잡성이 증가 JSONSerialization 개념 jsonData를 [String: Any] 형태로 변환 or [String: Any]를 jsonData 형태로 변환 ex) JSONS..
RxSwift의 스트림 처리 RxSwift를 사용할 때 보통 Observable 인스턴스를 .subscribe하여 onNext, onError, onCompleted로 처리가 가능 RxSwift는 위에서 아래로 stream 형태로 비동기 처리를 코드상으로는 순서대로 눈에보기 쉽게 처리가 가능 API.download(file: "http://www...") .subscribe(onNext: { data in // Append data to temporary file }, onError: { error in // Display error to user }, onCompleted: { // Use downloaded file }) 이번 포스팅 글에서 RxSwift의 Observable과 Observer 구현부..
1. SDWebImage 오픈소스 까보기 - 캐싱 처리 로직 2. SDWebImage 오픈소스 까보기 - 메모리 캐싱, 디스크 캐싱 SDWebImage 메모리 캐시 SDMemoryCache.m 코드를 보면 SDMemoryCache를 선언해 놓았으며 이것은 NSCache 타입이므로 일반적으로 swift에서 메모리 캐싱을 사용하는 방법과 유사 (NSCache를 통해 메모리 캐싱하는 방법은 이전 포스팅 글 참고) @interface SDMemoryCache () { #if SD_UIKIT SD_LOCK_DECLARE(_weakCacheLock); // a lock to keep the access to `weakCache` thread-safe #endif } ... @interface SDMemoryCach..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cvm3ay/btsrEq5ah36/OqCrxPK8km1dq7nhDaN7X1/img.png)
1. SDWebImage 오픈소스 까보기 - 캐싱 처리 로직 2. SDWebImage 오픈소스 까보기 - 메모리 캐싱, 디스크 캐싱 SDWebImage 오픈소스 SDWebImage Github 포스팅 글 작성 시점 기준으로 24.7k 스타를 가지고 있고, 또 다른 유명한 이미지처리 오픈소스 Kingfisher (21.5k)보다 많은 스타 수를 가지고 있는 오픈소스 UIImageView의 extension으로 sd_setImageWithURL 메소드로 확장되어 쉽게 사용할 수 있도록 구현되어 있는 상태 import SDWebImage imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg"), placeholderIm..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bblNpR/btsrNlCpefy/oN5cmg8SKzz8aQqdSNJxkK/img.png)
NSMapTable 개념 key-value쌍으로 구송하는 컬렉션 타입 중 하나인 Dictionary와 유사하지만 memory 관리를 더욱 디테일하게 처리가 가능한 클래스 딕셔너리는 value type이지만 NSMapTable은 class타입이므로 reference type 딕셔너리는 key-value쌍으로 value에 object를 넣으면 strong reference로 잡히지만, NSMapTable은 통해 weak 설정이 가능 NSMapTable은 멀티 스레드 환경에서도 안전하게 사용할 수 있는 thread safe 속성도 가지고 있는 장점이 존재 NSMapTable로 메모리 캐싱 구현 NSMapTable의 Value 타입에 사용할 class 타입 CachedObject 정의 하나와 NSMapTable..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b1Zhf3/btsrClwKNnN/1DqyLuOjkHnXRNDrL2kmrk/img.png)
@inlinable 키워드 함수를 호출할 때, 호출하는 오버헤드를 줄이기 위해서 호출하는것이 아닌 이 키워드가 사용된 곳에 함수의 구현부를 그대로 복사해와서 오버헤드를 줄이는 기법 ex) 애플의 AttributedString 구현부에서 @inlinable 사용 예시 @available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *) extension UnsafeMutableBufferPointer : ContiguousBytes where Element == UInt8 { @inlinable public func withUnsafeBytes(_ body: (UnsafeRawBufferPointer) throws -> R) rethrows -> R { return tr..