스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프

36. 스파르타 코딩 클럽 - 포켓몬 연락처 앱 만들기 (3)

seongpil Heo 2025. 4. 21. 20:56

 🧑‍💻 오늘까지 진행한 요구사항

 

디스크에 사용자가 입력한 정보를 실제로 저장하기

 

[ Contacts+CoreDataClass]

import Foundation
import CoreData

@objc(Contacts)
public class Contacts: NSManagedObject {
    public static let className = "Contacts"
    public enum Key {
        static let name = "name"
        static let phoneNumber = "phoneNumber"
        static let imageUrl = "imageUrl"
    }
}

 

[ Contacts+CoreDataProperties]

import Foundation
import CoreData


extension Contacts {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Contacts> {
        return NSFetchRequest<Contacts>(entityName: "Contacts")
    }

    @NSManaged public var name: String?
    @NSManaged public var phoneNumber: String?
    @NSManaged public var imageUrl: String?

}

extension Contacts : Identifiable {

}

 

CoreData 클래스 파일과 프로퍼티 파일을 위와 같이 작성하였다.

프로퍼티는 속성 이름과 타입을 명시하고 있다.

 

[ ViewController ]

import CoreData

var imageUrl = ""
var container: NSPersistentContainer!

override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.navigationBar.isHidden = false
        configureUI()
        
        // CoreData
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        self.container = appDelegate.persistentContainer
        
    }
    
    
// CoreData 데이터 저장하기
    func createData(name: String, phoneNumber: String, imageUrl: String) {
        guard let entity = NSEntityDescription.entity(forEntityName: Contacts.className, in: self.container.viewContext) else { return }
        let newContacts = NSManagedObject(entity: entity, insertInto: self.container.viewContext)
        newContacts.setValue(name, forKey: Contacts.Key.name)
        newContacts.setValue(phoneNumber, forKey: Contacts.Key.phoneNumber)
        newContacts.setValue(imageUrl, forKey: Contacts.Key.imageUrl)
        
        do {
            try self.container.viewContext.save()
            print("문맥 저장 성공")
        } catch {
            print("문맥 저장 실패")
        }
    }
    
    @objc private func naviButtonTapped() {
        print("네비게이션 버튼 클릭")
        createData(name: nameTextField.text ?? "", phoneNumber: phoneNumberTextField.text ?? "", imageUrl: "\(self.imageUrl)")
        self.navigationController?.popViewController(animated: true)
        
    }

 

 

var imageUrl = ""
var container: NSPersistentContainer!

 

데이터 통신 후 받은 이미지 Url을 저장 할 변수 imageUrl 선언

CoreData사용을 위해 container 선언

 

// CoreData
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        self.container = appDelegate.persistentContainer

 

이 코드는 Core Data의 저장소(NSPersistentContainer)를 가져와서, 현재 클래스의 container 속성에 저장하는 과정이다.

Core Data를 통해 데이터베이스를 다루기 위한 "문"을 여는 과정이라고 보면 된다.

 

// CoreData 데이터 저장하기
    func createData(name: String, phoneNumber: String, imageUrl: String) {
        guard let entity = NSEntityDescription.entity(forEntityName: Contacts.className, in: self.container.viewContext) else { return }
        let newContacts = NSManagedObject(entity: entity, insertInto: self.container.viewContext)
        newContacts.setValue(name, forKey: Contacts.Key.name)
        newContacts.setValue(phoneNumber, forKey: Contacts.Key.phoneNumber)
        newContacts.setValue(imageUrl, forKey: Contacts.Key.imageUrl)
        
        do {
            try self.container.viewContext.save()
            print("문맥 저장 성공")
        } catch {
            print("문맥 저장 실패")
        }
    }

 

CoreData 저장(등록 / Create)를 위한 함수 작성

 

newContacts.setValue를 이용하여 속성의 이름과 들어갈 키 값을 세팅한다.

do - catch 문을 사용하여 데이터 저장을 시도하고 성공시 save()

실패시 "문맥 저장 실패"를 콘솔에 프린트한다.

 

@objc private func naviButtonTapped() {
        print("네비게이션 버튼 클릭")
        createData(name: nameTextField.text ?? "", phoneNumber: phoneNumberTextField.text ?? "", imageUrl: "\(self.imageUrl)")
        self.navigationController?.popViewController(animated: true)
        
    }

 

createData 함수를 사용하여 실제 데이터 등록하기

 

네비게이션바의 추가 버튼이 눌렸을 때 실행되는 메소드로 createData를 이용해서 각각 속성의 저장될 값을 같이 써준다.

name에는 nameTextField에 사용자가 입력한 text의 값이 들어가고, 그 값이 없다면 기본값으로 빈문자열을 입력한다.

phoneNumber에는 phoneNumberTextField에 사용자가 입력한 text의 값이 들어가고, 마찬가지로 값이 없다면 빈문자열을

기본값으로 입력한다.

imageUrl에는 Alamofire를 통해 받아온 imageUrl을 입력한다.

 

저장이 완료된 후에는 navigationController.popViewController를 이용해서 이전 뷰컨트롤러로 이동한다.


 📱 Simulator