[SwiftData] CloudKit 로드 이벤트 처리

반응형

eventChangedNotification

 

최근에 스위프트 UI 프로젝트를 진행하고 있습니다. 또한 새롭게 나온 SwiftData 를 적용하면서 여러가지 문제를 해결해 가고 있던 중 CloudKit 동기화까지 진행하게 되었습니다. SwiftData 가 효율적이고 좋은 것은 맞는 것 같지만 너무 자료가 없고 사용자체가 너무 추상화 되어 있기 때문에 세세한 컨트롤이 좀 어렵다고 생각합니다. 물론 제가 그걸 몰라서 그렇긴 하겠지만요. 첫 번째 난관이 Cloud 킷의 로드 완료 이벤트를 알고 싶었는데 해결이 되서 블로그에 남깁니다.

 

 

 

 

 우선 이벤트 수신을 위해서 @State 로 다음 변수를 선언합니다. eventChangedNotification 는 이벤트가 변경될 때 마다 수신하게 됩니다.


@State private var publisher = NotificationCenter.default.publisher(for: NSPersistentCloudKitContainer.eventChangedNotification)


 

 

 

 

 

 

 이제 onReceive 로 이벤트를 처리해줍니다. event 타입은 다음과 같습니다. 또한 이벤트 처리시 (on: DispatchQueue.main) 의 메인 스레드 처리를 해줘야 합니다. 

  • setup
  • import
  • export

.onReceive(publisher.receive(on: DispatchQueue.main)) { notification in
      if let userInfo = notification.userInfo {
        if let event = userInfo["event"] as? NSPersistentCloudKitContainer.Event {
          if event.type == .import {
            importing = true
            run()
          } else {
            importing = false
          }
        }
      }
    }

 

 

 

 

 

 

 

 로딩 처리를 해주기 위해서 다음과 같은 @State 변수를 하나 선언합니다.


@State private var importing = false


 

 

 

 

 

 

 데이터가 로드되는 것을 눈으로 확인하기 위해서 뷰 아래에 간단한 ProgressView() 를 importing 상태에 따라 보여주도록 렌더링합니다.


HStack(spacing: 10) {
  if importing {
    ProgressView()
  }

  Text(getDateString(date: appData.selectedDate))
}


 

 

 

 

위의 코드는 코어데이터에서 사용하는 코드인데 스위프트데이터에서도 동일하게 동작합니다. 클라우드 킷을 사용하면 정말 레퍼런스가 없어서 힘들었는데 위의 이벤트로 동기화 하는 이벤트는 정확히 잡아낼 수 있습니다. 도움 되시길 바랍니다.

반응형

댓글

Designed by JB FACTORY