트러블 슈팅
-
[iOS] Image url 통해 가져와서 view에 띄우거나 갤러리 다운로드하는 방법 2가지 비교
이번에 unsplash의 api를 받아서 json 데이터를 확인해보니 신기한 점이 있었다. image는 따로 url 종류로 주어지고, 해당 url을 다시 받아와서 사용해야 한다는 것! 때문에 image를 다운로드 하여 imageView에 넣어주는 protocol을 하나 만들었다. protocol ImageViewDownloadable { var imageView: UIImageView { get set } } 그리고 extension으로 이 프로토콜을 채택하고 있다면 image를 보여줄 수도 있고, 갤러리에 다운받을 수도 있는 메서드들을 각각 구현하였다. 1. URLSession.shared.dataTask , @escaping closure 그렇게 만든 첫 방법은 dataTask의 @escaping c..
2024.02.14
-
[iOS] UICollectionViewFlowLayout으로 Pinterest Layout 구현하기
처음 과제로 받은 피그마에 Pinterest로 구현된 View를 보고, Compositional로 도전해야지! 라고 호기롭게 생각했다. 그러나 Compositional의 벽은 높았고.. item과 group, section으로 크기를 주는 것에서 item 크기들을 어떻게 다르게 줘야 할지 감이 안 잡히더라. Section별로는 쉬운데!! 다른 라이브러리들을 까보면, Compositional + Combine의 조합으로 pinterest가 구현되어 있었다. 그러나 RxSwift나 Combine을 아직 잘 모르는데, 과제 기간은 매우 짧았기에 차마 이번에 도전할 자신은 없었다. 이미 collectionView, diffable data source, compositional 등 처음 써보는 것이 산더미.....
2024.01.31
-
[iOS] Test 파일을 넣을 Asset 생성시 오류_ Bundle 사용
테스트용 JSON 파일은 이후에는 사용하지 않을 것이기에 test 폴더에 따로 Asset catalog를 만들어서 그곳에서만 넣어두고 사용하고 싶었다. 때문에 폴더를 하나 만들어서 이름을 Json.xcassets 으로 선언하고 그 안에 파일을 넣었다. 그런데 asset catalog의 모양이 기존의 것과는 달랐다. 확인해보니 asset catalog를 만들때는 단순하게 폴더를 만드는 것이 아니라 File → New → File을 타고 들어가 Resource의 Asset Catalog를 선택하여 만들어야 했다. 그 후 test code를 작성하여 돌리는데 이번에는 NSDataAsset을 가져오는 guard문에서 계속 retrun으로 빠지며 종료되었다. guard let json = NSDataAsset(n..
2024.01.28
-
[iOS] TableViewCell에서 layoutMarginsGuide 사용
테이블뷰의 Custom Cell을 설정할 때 처음에 제약조건을 ContentView에만 맞췄다. private func configureCellConstraint() { NSLayoutConstraint.activate([ contentStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), contentStackView.topAnchor.constraint(equalTo: contentView.topAnchor), contentStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), contentStackView.bottomAnchor.constraint(e..
2024.01.06
-
[iOS] CoreData에서 특정 Entity 내부에 있는 Entity의 특정값을 가져오고 싶을 때(NSPredicate)
코어데이터를 사용하는 방법을 연습하다가 생긴 일이다. 먼저 entity로는 UserMO와 JokeMO 두개가 있다. User와 Joke는 Model도 있다. 여기서 보면 알 수 있듯이 User는 Joke 배열을 가지고 있다. 때문에 특정한 User의 특정 카테고리를 갖는 Joke만 선별하고 싶은 과정에서 문제가 있었다. func fetchWithPredicate(currentUser: User, currentCategory: Category) -> [Joke] { var jokes = [Joke]() let fetchRequest: NSFetchRequest = UserMO.fetchRequest() let idPredicate = NSPredicate(format: "id = %@", currentUs..
2023.12.20
궁금증
-
[iOS] ARC_객체 수명, weak와 unowned 차이
Swift에서 struct와 같은 값 타입이 아니라, class와 같은 참조 타입을 사용하면 참조 카운트, Reference Count가 발생하게 됩니다. 이는 애플에서 메모리를 관리하는 방법으로 메모리를 할당하거나, 참조할 때 카운트를 증가시키고 사용을 완료하면 감소시킵니다.Objective -C에서는 이를 개발자가 직접 관리했었고, 그것을 MRC Manual Reference Counting 이라고 부릅니다.그리고 현재 Swift에서는 직접적으로 참조 카운트를 삽입하고 해제하는 코드를 작성할 필요 없습니다. complier가 컴파일 타임에 자동으로 구문 분석을 통해 알아서 관련 코드를 삽입하여 메모리 관리를 해주는데 이를 ARC Automatic Reference Counting이라고 합니다..
2024.03.21
-
[iOS] Swift의 컴파일러 _ LLVM
❤️ Swift Compiler _ LLVM LLVM은 2000년 일리노이 대학에서 Chris Lattner 외 몇 명으로 구성된 연구 팀에서 프로그래밍 언어의 정적 및 동적 컴파일을 모두 지원할 수 있는 현대적인 컴파일 전략을 제공하기 위한 연구 프로젝트로 시작되었다. intermediate / binary 기계 코드를 구성, 최적화, 생성하는 데 사용되는 라이브러리로 프로그래머가 작성한 코드를 컴퓨터가 읽을 수 있는 intermediate, binary 코드로 컴파일 하는데 사용된다. 📒 컴퓨터의 하드웨어는 Binary Code만 읽을 수 있다. 때문에 우리가 작성한 코드들을 하드웨어가 읽을 수 있게 바꿔주는 작업을 거쳐야 하는데 이때 Intermediate Representation, 즉 중간표현을..
2024.03.12
-
[NSCache&URLCache]왜 이미지 파일이 URLCache에서 메모리가 아닌 디스크에 저장될까?
데이터들은 어디에 저장되고 어떻게 사용될까? 먼저 하드 디스크에 우리의 데이터들이 전부 저장된다. 때문에 하드 디스크는 용량이 매우 크고, 기억을 하는 것에 치중되어 있다. RAM, 메모리는 그러한 하드 디스크에서 앱을 실행하는데에 필요한 중요 데이터들을 들고 있다. 그러나 여전히 내용은 방대하고, RAM은 디스크보단 기억할 수 있는 양이 적고, CPU와 가까워서 빠르지만 어찌 되었건 기억을 하는 것에만 능력이 치중되어 있다. CPU는 RAM에서 받은 데이터들을 이용해 앱을 실행한다. 기억보다는 성능이 중요해, 꾸준하게 성능이 업그레이드 되어 왔다. 때문에 RAM과 CPU는 기억과 성능으로 각자의 목적이 다르기에 서로서로 성능차이가 점점 심하게 나게 된다. RAM이 CPU를 쫓아가지 못해 CPU가 RAM..
2024.01.28
-
[UIKit]loadView에 view는 언제 할당될까?
코드베이스로 짠 코드에서 실험해 본 내용이다. 예상으로는, super.loadView()가 실행되기 전까지는 view가 nil이기 때문에 값이 없을 것이라고 생각했다. 때문에 LLDB로 view를 loadView() 함수 내부에서 찍어보았다. 그런데 예상과는 다른 일이 있었다. super.loadView()가 불리기 전에 po view로 찍어보니, loadView와 loadView끝이 찍히더니, 값이 뜨는 것이다! 참고로 옆에 UIViewController의 view는 (id) 0x0으로 할당되어 있지 않았다. 오류인가? 왜 view가 찍히지? 그래서 loadView()를 여러번 찍어보고 하나씩 내려가면서 po view를 찍어보니, 매번 새로운 view가 출력되었다. If you access this p..
2024.01.27
-
[Swift]super.init()이 반드시 필요했던 경우
super.init()에 대해서 이것저것 찾아보다 신기한 경우를 찾았다. class A { init(some: String) { print("a") } } A와 같이 매개변수가 있는 init의 경우에는, 상속을 해서 내부에 변화를 줄 때 class B: A { override init(some: String) { super.init(some: some) print("b") } } 반드시 super.init을 불러야 한다는 에러 메세지가 떴다. 2단계 초기화에서 보면, customize된 초기화는 1. superClass와 subclass가 있을 때 subClass 초기화 2. superClass 초기화 순으로 올라간 후 3. superClass에서부터 값이 할당 되는 과정을 거친다. 이처럼 overrid..
2023.11.08