반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

[iCloudKit 시리즈 2.1] 나도 백엔드 있다 - iCloud CRUD 해보기 본문

오뚝이 개발자/SwiftUI

[iCloudKit 시리즈 2.1] 나도 백엔드 있다 - iCloud CRUD 해보기

rriver2 2024. 9. 27. 17:26
반응형

 🌷 iCloud 시리즈 목차 

1) iCloud 세팅과 개념 그리고 유저 연결하기

2.1) iCloud CRUD 해보기

2.2) 이미지, 비디오, 오디오 CRUD하기

3) Coredata -> iCloud로 변경하기

3) iCloud Noti 알아보기

4) 여러 에러나 마주했던 문제 상황들 ...

 💕 iCloud  CRUD 단계 

우선 이 부분이 기본적으로 CRUD를 제공하는 타입이다..! 이번 포스팅에서는 얘네들만 다룰 예정이다..! 다음 포스팅 때 이미지나 오디오, 비디오를 저장하는 방법에 대해 알아볼 예정입니당

1️⃣ Read

    private func fetchItems() {
        let predicate = NSPredicate(value: true)
        let query = CKQuery(recordType: "Fruit", predicate: predicate)
        
        var returnedItems: [FruitModel] = []
        
        queryOperation.recordMatchedBlock = { (returnedRecordID, returnedResult) in
            switch returnedResult {
            case .success(let record):
                guard let name = record["name"] as? String else { return }
                returnedItems.append(FruitModel(name: name, record: record))
            case .failure(let error):
                print("Error: \(error)")
            }
        }
        
        queryOperation.queryResultBlock = { [weak self] returnedResult in
            print("RETURNED RESULT: \(returnedResult)")
            DispatchQueue.main.async {
                self?.fruits = returnedItems
            }
        }
        
        addOperation(operation: queryOperation)
    }
    
   private func addOperation(operation: CKDatabaseOperation) {
        CKContainer.default().publicCloudDatabase.add(operation)
    }

2️⃣ Create

따로 iCloud 페이지에서 Record를 추가하지 않아도 새로 추가가 되면 자동으로 생성된다. ( 프로퍼티도 )

+) 추가적으로 optional을 허용하는가, Relation을 설정할 수 있는가는 다음에 추가적으로 공부해서 올리도록 하겠슘둥

    private func addItem(name: String) {
        let newFruit = CKRecord(recordType: "Fruit")
        newFruit["name"] = name
        saveItem(record: newFruit)
    }
    
    private func saveItem(record: CKRecord) {
        CKContainer.default().publicCloudDatabase.save(record) { [weak self] returnedRecord, returnedError in
            print("Record: \(returnedRecord)")
            print("Error: \(returnedError)")
            DispatchQueue.main.async {
            	// 여기서 다시 Fetch해도 되고 
                // 다시 불러오는 게 너무 무거우면 성공시 UI에서 추가되도록 구현하는 것도 한 방법
                self?.fetchItems()
            }
        }
    }

3️⃣ Update

    func updateItem(fruit: FruitModel) {
        let record = fruit.record
        record["name"] = "NEW NAME!"
        saveItem(record: record)
    }

4️⃣ Delete

    func deleteItem(idexSet: IndexSet) {
        guard let index = idexSet.first else { return }
        let fruit = fruits[index]
        let record = fruit.record
        
        CKContainer.default().publicCloudDatabase.delete(withRecordID: record.recordID) { [weak self] returnedRecordID, returnedError in
            DispatchQueue.main.async {
                self?.fruits.remove(at: index)
            }
        }
    }

우선 public Data 경우의 CRUD를 알아봤다.

다음으로는 Coredate -> iCloud로 변경하는 방법도 작성해보겠습니다. ( 구조가 거의 똑같아서 간단할 거 같긴 함 )

 

반응형
Comments