Save data

บันทึกให้ด้วยสิ

ถ้าเราไม่ทำให้บันทึกค่าเก็บไว้ปกติ ถ้าเรา kill แอปทิ้งแล้วรันใหม่ข้อมูลเราจะหายไป

ขั้นแรกเราต้องทำให้สามารถ encode และ decode คลาส Todo ของเราให้ได้ก่อน เพราะเราจะได้แปลงเป็น data ที่จะบันทึกได้ต่อไป

วิธีการก็แสนจะง่าย ให้เราเพิ่ม conform Codable ที่ Todo และ TodoItem เป็นอันเสร็จ

Todo.swift
import Foundation

class Todo: Codable {
    private var items = [TodoItem]()

    var totalItems: Int {
        return items.count
    }

    func item(at index: Int) -> TodoItem {
        return items[index]
    }

    func add(item: TodoItem) {
        items.insert(item, at: 0)
    }

    func remove(at index: Int) {
        items.remove(at: index)
    }

    func index(of item: TodoItem) -> Int? {
        return items.firstIndex(where: { (todoItem) -> Bool in
            return todoItem === item
        })
    }

    func move(from sourceIndex: Int, to destinationIndex: Int) {
        let item = items.remove(at: sourceIndex)
        items.insert(item, at: destinationIndex)
    }
}

บันทึกลงไฟล์

เราใช้ FileManager ในการสร้าง url ไปยังไฟล์ที่เรากำหนด ใช้ PropertyListEncoder ในการ encode ข้อมูลของเรา

เสร็จแล้วให้เพิ่มเรียก saveTodo() ที่ delegate, dataSource method ที่ใช้ในการ Add, Edit และ Delete TodoItem และ todoItemTableViewCellDidTapCheckboxButton รวมทั้งตอน dropItem

โดย default PropertyListEncoder จะ encode เป็น binary แต่เราจะใช้ xml (บรรทัดที่ 4) ก่อนเพื่อที่จะได้อ่านได้

เราสามารถ print(destinationURL.path) ออกมาดูได้ว่าไฟล์อยู่ที่ไหนและลองเปิดดูได้

อ่านจากไฟล์

เหมือนบันทึกลงไฟล์ แต่คราวนี้ใช้ PropertyListDecoder ในการ decode และถ้าไม่มีไฟล์ให้อ่านเราจะข้ามไป

เพิ่มโค้ดให้อ่านไฟล์ตอนโหลด

จากนั้นลองรันแอป เพิ่มรายการ kill แอป แล้วเปิดดูใหม่

รายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่ Archives and Serialization

Refactor Code หน่อยยย

จะเห็นว่าโค้ดที่ใช้หา Path ของไฟล์ที่กำหนดมันใช้ซ้ำกัน เราก็สร้างฟังก์ชั่นใหม่มาครอบดีกว่า

Last updated