본문 바로가기
카테고리 없음

스위프트Swift에서 UserDefaults 처리하는 방법

by 부동산절대원칙 2022. 6. 18.
반응형

스위프트Swift에서 UserDefaults 처리하는 방법

 

대규모 프로젝트에서 UserDefaults를 사용하는 모범 사례

Unsplash의 Firmbee.com 사진

앱이나 프로젝트에 영구적인 정보를 저장하는 것은 오늘날 매우 일반적입니다. Apple 운영 체제는 이 작업을 수행할 수 있는 몇 가지 옵션을 제공하며 의심의 여지 없이 UserDefaults 가장 쉽습니다. 한 줄의 코드와 데이터가 저장됩니다. 한 줄의 코드와 데이터가 검색됩니다. 이 기술은 훌륭하지만 더 큰 앱에서는 제어를 잃기 쉽고 결국 UserDefaults 여기저기 구했습니다. 그러면 앱 어딘가에 이미 무언가를 사용하거나 저장했는지 잊어버릴 것입니다.

내 프로젝트에서 접근 방식을 변경하고 manager 수업. 에게 당신을 소개 할게요 Persistence.

아이디어는 매우 간단합니다. 나는 영구적으로 저장하는 데 필요한 모든 정보를 보관할 클래스를 만들 것입니다. 클래스는 다음에서 로드됩니다. UserDefaults 앱 시작 시 변수가 업데이트될 때마다 전체 클래스가 저장됩니다. 기본적으로 모든 영구 변수에 대한 래퍼입니다.

이 작업을 수행하는 것은 Swift 덕분에 매우 간단해졌습니다.Codable 규약.

몇 가지 코드를 살펴보겠습니다.

  • 5행: 개인 init 설계된 기능에서 강제로 로드하는 데 필요합니다.
  • 13행: key 항목을 저장/검색하기 위해 함수에 부여됩니다. UserDafaults. 많은 앱에서 로그인한 사용자 또는 환경(예: 개발, 테스트, 프로덕션 등)에 따라 다양한 기본 설정 집합을 저장해야 했기 때문에 전달하는 것을 선호합니다.
  • 16행: 항목이 nil이면 private 이니셜라이저를 사용하여 새로운 항목이 생성됩니다. 처음 액세스할 때 필요합니다.
  • 22행: 개인 확장은 개체를 저장하고 로드하기 위해 일부 상용구 코드를 추가합니다. 개체 자체가 Codable 프로토콜을 유지하기 위해 변환합니다. Data , 그리고 저장합니다. 반면에로드하기 위해 검색합니다. Data그리고 그것을 디코딩 JSONDecoder.

클래스는 현재 매우 멍청하고 키만 저장합니다... 저장할 필요가 없는 유일한 변수입니다! 또한 save() 기능은 절대 사용되지 않습니다.

저장할 항목을 추가할 시간입니다!

다음과 같이 클래스를 수정해 봅시다.

이제 상황이 흥미로워지기 시작합니다.

  • 5행과 6행: 두 개의 변수가 추가되었습니다. 그만큼 didSet 관찰자가 발사하다 save() 값이 업데이트되고 전체 지속성이 UserDefaults.
  • 8행: CodingKeys 원하는 변수만 저장하기 위해 필요합니다. 그만큼 key 변수가 저장되지 않습니다. 저장하려는 모든 새 변수에는 해당 변수가 필요합니다. CodingKey. 추가하는 것을 잊지 마십시오!

나머지 extensions 바뀌지 않는다.

실제 결과는 다음과 같습니다.

보시다시피, 일부 값을 지정하여 개체를 만든 다음 동일한 키를 사용하여 다른 개체를 만들고 실제 값을 인쇄했습니다.

점에 유의하시기 바랍니다 jsonRepresentation 의 확장입니다 Encodable 내가 어떤 것을 인쇄하기 위해 쓴 Encodable 읽기 쉬운 JSON 형식의 객체.

더 큰 앱에서는 개체 목록을 저장하는 것이 일반적입니다. 예를 들어 사용자가 이미 확인한 모든 "더 이상 표시하지 않음" 팝업 목록이 필요할 수 있습니다.

이 상황을 처리하기 위해 클래스를 업데이트합시다. 나는 목록을 사용할 것이다 enum 여기서 모든 경우는 "더 이상 표시하지 않음" 유형입니다.

참고하세요 enum 에 부합 Codable 규약.

이제 기본 클래스를 업데이트해 보겠습니다.

보시다시피 새 변수를 추가했습니다. dontShowAnymores 7행에서 나는 또한 새로운 CodingKey 10행에서.

새로운 변수가 private (set). 값을 업데이트하려면 함수가 필요하다는 의미입니다. 나는 확장에서 그것을 할 것입니다 :

보시다시피 코드는 이제 매우 깨끗합니다. 목록이 비어 있는 경우 목록을 생성하는 5행의 검사도 있습니다. 이제 변수를 읽을 수 있지만 지정된 기능을 사용하여 항목을 추가하거나 제거해야 합니다.

작동 방식은 다음과 같습니다.

꽤 멋지죠?

이런 종류의 지속성에서는 일반적으로 간단한 정보를 저장하지만 때로는 복잡한 개체를 저장해야 할 수도 있기 때문에 이것은 일반적이지 않습니다. 해보자

먼저 다음 코드를 사용하여 객체를 생성해 보겠습니다.

enum이 포함된 단순한 클래스입니다. 이 클래스는 평소와 같이 다음을 준수합니다. Codable 규약.

새 속성을 추가해 보겠습니다. Persistence 수업. 당신은 드릴을 알고 있습니다:

자, 주목합시다.

내부의 값을 업데이트해야 하는 경우 Starcraft 개체, save() 함수는 자동으로 호출되지 않습니다:

persistence.starcraft.id = "SD777-DV 전체를 저장하지 않습니다 Persistence.

다음 세 가지 방법으로 해결할 수 있습니다.

  1. 많은 코드를 작성하고 기억하기 save() 중첩된 객체의 모든 변수에서
  2. 를 사용하여struct 대신 class 내부 개체로
  3. 객체를 검색하고 수정하고 전체 객체를 업데이트합니다. Persistence 수업
  4. 만들다 save() public 함수, 내부 객체 업데이트, 전체 저장 Persistence 수업

개인적으로 나는 옵션 2 또는 3을 선호하지만 때로는 옵션 2를 사용할 수 없습니다. 아마도 개체가 다른 곳에서 주어졌기 때문일 수 있습니다. 예를 들어 타사 라이브러리에서 가져온 것입니다.

여기에서 이 이야기의 모든 코드를 찾을 수 있습니다.

보시다시피, 비교적 간단한 방법으로 앱에 많은 항목을 저장하는 한 가지 방법을 제시했습니다. 가장 좋은 방법입니까? 잘 모르겠지만 그게 내 방식이야.

많은 인스턴스를 유지하는 경우 Persistence 클래스가 살아 있으면 모두 동기화되지 않습니다. 이 문제를 해결하기 위해 세 가지 옵션을 제안할 수 있습니다.

  1. 같은 순간에 살고 있는 여러 인스턴스를 생성합니다.
  2. 변환 Persistence 수업을 듣다 Singleton.
  3. 사용 Dependency Injection 컨테이너를 사용하여 필요한 클래스의 단일 인스턴스를 갖게 됩니다.

나는 보통 세 번째 길을 택한다!

반응형