[ swift ] Lv.6 이름순 정렬과 싱글톤

sonny·2024년 12월 10일
1

TIL

목록 보기
67/140

이름순으로 정렬하는건 sorted로 알고 있다.

하지만 코어데이터상에선 사용하는게 달랐는데,

[CoreData] 기초개념 (2): Query & Sorting 이 블로그에서 NSSortDescriptor로 정렬조건을 추가하는 걸 발견했다.

그리고 좀 더 알아보니 Core Data가 이미 정렬을 지원하기 때문에 sorted는 특별한 경우가 아니면 사용하지 않는 것이 좋다고 한다.

NSSortDescriptor?

NSSortDescriptor는 데이터의 정렬 순서를 정의하는 객체인데,

Core Data나 다른 컬렉션을 정렬할 때 사용한다고 한다.

주로 NSFetchRequest에서 데이터를 정렬할 때 활용이 되는 것인데

배웠다시피 NSFetchRequest는 CoreData에서 데이터를 조회할 때 사용하는 요청 객체다.

NSSortDescriptorNSFetchRequest에 추가해서 데이터의 정렬 순서를 지정해주는 역할을 한다는 뜻.

그렇기에 NSSortDescriptor는 데이터를 어떻게 정렬할지 정의할 수 있고

Core Data뿐만 아니라 배열, 딕셔너리 등에서도 사용될 수 있다고 한다.

keyascending 값을 통해 정렬 기준과 순서를 지정하고 또한 여러 정렬 기준을 결합할 수도 있다.

  • key : 정렬 기준이 되는 속성의 이름을 지정한다. 예를 들면 name, age와 같은 속성을 지정한다.
  • ascending : 상승 이라는 뜻인데, 이게 정렬 순서를 결정할 수 있고 값이 true이면 오름차순, false이면 내림차순으로 정렬이 된다.

그래서 fetchContacts 함수에

let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
        repuest.sortDescriptors = [sortDescriptor]

블로그에서 본대로 이름순으로 설정하여 해당 코드를 추가 했더니 잘 되었다.

귀여운 포켓몬들....


Lv.7 수정모드 만들기

isEditing ?

isEditingUIViewController나 그 하위 클래스에서 주로 사용되는 속성인데,

해당 뷰 컨트롤러의 상태가 "편집 모드"인지 여부를 나타내준다.

이 속성은 true로 설정하면 사용자가 데이터를 수정하거나,

아이템을 추가/삭제하는 등의 편집 작업을 할 수 있게 되는 모드로 전환된다.

true로 설정하면 편집 모드가 활성화돼서 셀을 삭제하거나 순서를 바꾸는 등의 편집 기능이 가능하고,

false로 설정하면 편집 모드가 비활성화되어, 사용자 인터페이스에서 편집 관련 기능이 사라진다.

에러) has no member error

"Value of type 'PhoneBookViewController' has no member 'contact'"

PhoneBookViewController에 contact가 정의되지 않아서 발생한 오류다.

구글링으로 검색을 겨우겨우 하다가 어느 분이 올리신 걸 봤는데 아 블로그는

오류해결 블로그 <- 여기서 봤다.

생각보다 해결법이 간단해서 어이없었다.

그냥 PhoneBookViewController 클래스에 contact변수만 지정하면 되는 것이었다.

contact 변수를 다시 지정하는 이유

PhoneBookViewController에서는 contact라는 변수를 가지고 있기 때문에,

ContactListViewController에서 선택된 연락처 객체를 그 변수에 전달해 주어야 한다.

그렇지 않으면 PhoneBookViewController에서는 어떤 연락처를 수정해야 하는지 알 수 없기 때문이다.

그러므로 phoneBookVC.contact = contactContactListViewController에서 선택된 연락처 객체를 PhoneBookViewController에 전달해주고

그 화면에서 해당 연락처를 수정할 수 있게 만들어주는 것이다.

다음은 이 문제를 해결하기 위한 방법입니다.

해결 방법

PhoneBookViewController에 contact 변수를 추가했다.

결과는 좋았다. 더이상 피가 나지 않는다.

수정이 안됨..

"가"를 "가가" 로 수정했는데 심지어 사진도 새로 눌러야했고 수정이 아니라 그냥 추가가 됐다.

내가 뭘 놓쳤지. 생각하다가.. 아 맞다. 난 바보였다.

수정 모드로 들어가면 데이터도 그대로 있어야하는데 데이터를 반영하는 작업도 안하고..

업데이트 추가도 안했으니 당연히 안됐던 것이지.ㅜ

.
.
.
.
그래서 수정 부분을 손보다가 급 잡힌 튜터님과의 면담을 통해 몇가지 개선사항을 먼저 하면서 수정까지 가능하도록 하려한다.

아, 프로젝트 새로 만들었다.

.. 초반에 엔티티 설정을 잘못한 것 같아서 어트리뷰 값을 binary data로 건들였더니 뭐 값을 바꾸면 마이그레이션을 해야한다며 빌드를 할 때 이상한 에러들이 났다.

검색을 1시간 가량 해보다가 시간이 아까워서 그냥 새로 다시 만들어버렸다.. 에휴
.
.
.
.

CoreDataManager 싱글톤 패턴

찾아보니 싱글톤 패턴을 사용하면 전체에서 하나의 인스턴스를 통해 Core Data 작업을 관리하는 방식이라 편하고 좋다고 한다.

앱에서 Core Data에 접근하는 것이 좀 더 간편해지고 일관되게 처리할 수 있기 때문이다.

개발자 소들이- 싱글톤 패턴 블로그를 보면서 해봤는데,

CoreDataManager.shared로 언제든지 CoreDataManager의 인스턴스를 호출할 수 있어서

각 파일들에 있던 import coreData들도 지우고 private var context: NSManagedObjectContext도 다 지웠다.

CoreDataManager 클래스는 하나의 인스턴스를 애플리케이션 전역에서 공유할 수 있어서

다른 클래스나 파일에서 불러올 때 CoreDataManager.shared를 사용하면 CoreDataManager에 접근할 수 있게 된다고 한다.

그렇게 되면 매번 새로운 인스턴스를 만들 필요 없이 항상 동일한 인스턴스를 사용할 수 있게 된다.

이 패턴의 주요 목적은 특정 클래스의 인스턴스가 애플리케이션 전체에서 단 하나만 존재하도록 보장하는 것이라는 것만 외우면 될 것 같다.

싱글톤은 일반적으로 애플리케이션 내에서 한 번만 생성되고, 어디서든 같은 인스턴스를 재사용할 수 있도록 설계된다.

그리고private init() {}는 외부에서 직접 인스턴스를 생성할 수 없도록 생성자를 private으로 설정해준 것이다.

이제 클래스의 인스턴스는 오직 shared를 통해서만 생성되고 접근이 가능하다.


그러면 static의 붙으면 싱글톤일까?

static의 역할이 뭐였을까.

static는 클래스의 인스턴스를 생성하지 않고도 접근 가능한 멤버를 만들 때 사용이 되는 키워드다.

static은 싱글톤 패턴의 한 부분으로 사용되지만, 그 자체만으로 싱글톤이 되지는 않는다.

싱글톤을 만들기 위해서는 추가적은 규칙이 있는데,

static을 사용해 단 하나의 인스턴스를 생성하고,

private init()으로 외부에서 인스턴스를 만들지 못하게 제한하는 것이 필요하기 때문이다.


private var context: NSManagedObjectContext {
        return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    }

그리고 코어데이터 사용하는 파일마다 위에 이 코드를 넣어줘야 코어데이터가 사용이 가능했는데 싱글톤으로 구현했으니 여기에다만 넣어주면 되니까 이 부분도 꽤나 좋았다.

이제 다른 파일에 있던 연락처 추가, 연락처 불러오기, 코어데이터 저장 등 코어데이터를 이용하는 코드를 가져오면 된다고 한다.

이미지에 관련된 코드는 제외했는데,

Core Data Manager는 데이터베이스 관리에 집중하게 하고,

이미지 처리를 위한 파일 입출력 처리의 경우는 별도로 분리해야 코드가 더 명확하다.

이미지는 일반적으로 크기가 크기 때문에 Core Data에 직접 저장하면 데이터베이스의 성능면에서도 안좋을 수 있고,

애초에 이미지를 디스크에 저장하거나 불러오는 작업의 경우는 파일 입출력과 관련 있기 때문에,

Core Data는 데이터베이스 관리에 힘을 쏟는다면,

이미지 처리 작업은 파일 시스템이 관리하는 작업으로 분리를 해놓는게 좋다고 한다.


음...

오늘은 에러를 해결하고 중간에 새로운 프로젝트를 만들면서 시간이 걸리고 정신없이 보낸 하루였다.

하지만 그 과정에서 싱글톤 패턴의 개념을 익히고, Core Data의 정렬 방법도 알게 되었다.

프로젝트를 만들면서 기초를 다지고 싶은 마음이 더 커졌다.

이번 작업 중 가장 크게 느낀 점은 반복 학습의 중요성이었다.

검색을 통해 필요한 정보를 찾아가며 작업했지만, 새로운 용어나 개념이 꼬리에 꼬리를 물어 공부를 이어가야 하는 일이 많았다.

그 순간에는 이해했더라도 하루 이틀이 지나면 다시 까먹는 경우가 많아 반복적인 학습이 필수라는 생각이 들었다.
물론, 모든 공부가 그렇겠지만 코딩은 특히 반복적인 사용을 통해 익숙해지는 과정이 중요하다는 것을 다시금 느꼈다.

이번 경험은 나중에 다른 프로젝트를 진행할 때도 분명히 큰 도움이 될 것이라 믿는다.

앞으로는 단순히 코드나 개념을 그냥 읽어보는 것 보단 맥락 위주로 코드를 파악하며 요점을 잡는 연습을 해야겠다고 생각했다.

이런 노력들이 더 나은 나로 성장하는데 좋은 발판이 되어줄 것이라고 믿어본다.

profile
iOS 좋아. swift 좋아.

4개의 댓글

comment-user-thumbnail
2024년 12월 10일

아 그리고 Singleton Instance가 너무 많은 일을 하게 되면, 다른 클래스의 Instance들 간 결합도가 높아져 "개방=폐쇄" 원칙을 위배한다고 한다. (객체 지향 설계 원칙 어긋남)

답글 달기
comment-user-thumbnail
2024년 12월 12일

CRUD 구현하면서 난 수정을 했는데 왜 수정이 반영이 안되지 하고 막히는 건 다 똑같나봅니다. 저도 어젯밤에 크러드하다가 그냥 미완성으로 제출해버릴까 싶은 생각이 머리를 스쳤었는데 ㅋㅋㅋㅋㅋ 프로젝트 다시 만드느라 엄청 고생하셨겠네요
CoreData에 정렬기능이 있었다는 걸 알고 갑니다. 이걸 제일 마지막에 구현해서 찾아볼 힘도 없이 그냥 sorted 때려박았는데.. 다음엔 나도 저거 써야지

1개의 답글

관련 채용 정보