어제 배운 UserDefaluts와 URLSession을 기존에 작업한 메모앱에 적용을 해보려고 한다.
Memo 구조체
import Foundation
struct Memo: Codable {
var content: String // 메모 타이틀
var isCompleted: Bool // 완료여부
var insertDate: Date // 작성일
var targetDate: Date? // 목표일자
var priority: String? // 중요도(우선순위)
var category: String? // 카테고리
var progress: Int? // 진행율
}
MemoManager 클래스
class MemoManager {
static let shared = MemoManager() // 싱글톤 패턴
private var userDefaults = UserDefaults.standard // 접근 제어
var memoList: [Memo] = []
// (접근 제어) 초기화 : UserDefaults를 통해 메모 불러오기 - (1)
private init() {
if let data = userDefaults.data(forKey: "MemoList"),
let saveMemoList = try? JSONDecoder().decode([Memo].self, from: data) {
memoList = saveMemoList
}
}
// 메모 추가
func addMemo(content: String, isCompleted: Bool, priority: String?, category: String?, progress: Int?) {
...
// 기존 코드
saveMemoListToUserDefaults()
}
// 메모 수정
func updateMemo(at index: Int, newContent: String, isCompleted: Bool, insertDate: Date, targetDate: Date?, priority: String?, category: String?, progress: Int?) {
...
// 기존 코드
saveMemoListToUserDefaults()
}
// 메모 삭제
func deleteMemo(at index: Int) {
...
// 기존 코드
saveMemoListToUserDefaults()
}
// 모든 메모 삭제 - (3)
func deleteAllCompletedMemos() {
var indexesToRemove: [Int] = []
for (index, memo) in memoList.enumerated() {
if !memo.isCompleted {
indexesToRemove.append(index)
}
}
// 인덱스를 역순으로 정렬한 후 삭제(정확한 삭제를 위해)
let reversedIndexes = indexesToRemove.sorted(by: >)
for index in reversedIndexes {
deleteMemo(at: index)
}
}
// 접근 제어 - (2)
private func saveMemoListToUserDefaults() {
if let data = try? JSONEncoder().encode(memoList) {
userDefaults.set(data, forKey: "MemoList")
}
}
}
🤳🏻 적용화면
URLManager
class URLManager {
static let shared = URLManager()
private init() {
}
let mainImageUrl = URL(string: "https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgdOoN%2Fbtsr4LBjZmp%2FPgZjUykhxAOcuTxiMIlDKk%2Fimg.png")!
func getJsonData(completion: @escaping (Result<Data, Error>) -> Void) {
let task = URLSession.shared.dataTask(with: mainImageUrl) { data, response, error in
if let error {
print("Error: Network Error")
completion(.failure(NetworkError.emptyResponse))
return
}
guard let data = data else {
completion(.failure(NetworkError.emptyResponse))
return
}
completion(.success(data))
}
task.resume()
}
}
enum NetworkError: Error {
case emptyResponse
}
🤳🏻 적용화면
let checkAlert = UIAlertController(title: "수정되었습니다.", message: "", preferredStyle: .alert)
self.present(checkAlert, animated: false)
dismiss(animated: true)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.navigationController?.popViewController(animated: true)
}
🤳🏻 적용화면