꾸준히 안타치기

userDefault로 데이터 저장하고 가져오기, 내림차순정렬 본문

iOS/문제해결

userDefault로 데이터 저장하고 가져오기, 내림차순정렬

글자줍기 2022. 8. 17. 13:15
반응형

기본사용법

  // userDefault에 저장
   let plist = UserDefaults.standard
   plist.setValue(userID, forKey: "name")//이름이라는 키로 저장
   plist.synchronize()//동기화처리

   //userDefaults에 불러오기
    let plist = UserDefaults.standard
   //지정된 값을 꺼내어 각 컨트롤에 설정한다.
    self.userName.text = plist.string(forKey: "name")
    
    //삭제
    UserDefaults.standard.removeObject(forKey: "key")

https://qussk.github.io/2021/02/27/swift-UserDefault 참고

https://developer.apple.com/documentation/foundation/userdefaults 애플

UserDefaults는 앱 삭제 전까지는 데이터가 유지된다. 앱을 종료했다 다시켜도 데이터가 남아있음

데이터 저장
프로퍼티 리스트  관계형 /목록형 데이터 비정형 객체 데이터
NSUserDefault       Core Data Archiving
Custom Property List SQLite  

값 여러개 저장하기

 var tasks = [Task](){
        didSet{ // 프로퍼티 옵저버, tasks배열에 추가될때마다 userDefault에 저장됨
            self.saveTask()
        }
    }

저장할때 tasks라는 키로 map을 사용해서 title, detail, done값을 저장 

 // 저장하기
    @objc func saveTask() {
        // 저장하기
        let data = self.tasks.map {
            [
                "title": $0.title,
                "detail": $0.detail,
                "done": $0.done
            ]
        }
        let userDefaults = UserDefaults.standard
        userDefaults.set(data, forKey: "tasks")
        userDefaults.synchronize()
    }
let task = Task(title: title, detail: detail,done: false)
self?.tasks.append(task)

저장값 가져오기 할때 다시 불러와서 하나하나 꺼내준다. 

값을 append로 맨뒤에 추가하는 식으로 하니 리스트 하단에 추가가되어서, 역순정렬이 필요했다.

역순정렬은 sorted { $0.title > $1.title } 를 해주면된다.  역순정렬 or 넣을때 맨앞에 넣기

오름차순으로 정렬하려면 이부분을 안쓰면됨

    //저장값 가져오기
    func loadTasks(){
        let userDefaults = UserDefaults.standard
        guard let data = userDefaults.object(forKey: "tasks") as? [[String: Any]] else { return }
        
        self.tasks = data.compactMap{
            guard let title = $0["title"] as? String else { return nil }
            guard let detail = $0["detail"] as? String else { return nil }
            guard let done = $0["done"] as? Bool else { return nil }
//            return Task(title: title,detail: detail, done: done)
            return Task(title: title,detail: detail, done: done)
        }.sorted { $0.title > $1.title } // 역순정렬
        tableView.reloadData()
        
        print("loadTasks" ,tasks)
    }

 

data.compactMap 공부하기 

반응형
Comments