- iOS에서 제공하는 데이터 저장소인 UserDefaults를 App Group을 통해 공유하기 위한 메서드입니다.
UserDefaults.standard.set(value, forKey: "key")
객체의 값 구성
- UserDefaults에 저장된 키값에 따라 값을 반환합니다. - 반환된 값은 Any? 타입으로, 성공적으로 값을 가져오지 못했을 경우 nil을 반환합니다. value(forKey:) 메서드를 호출하기 전에 UserDefaults.standard 객체에 값을 저장하고 있어야 합니다.
UserDefaults.value(forKey:"key")
객체의 값 조회
- 앱의 설정 정보를 저장하는 데 사용되며, 앱에서 사용자의 기본 설정을 유지하려는 경우 유용합니다. - addObserver() 메서드를 사용하여 UserDefaults의 변경 사항을 감지하고 이에 대한 알림을 받을 수 있습니다.
- 파일 생성, 수정, 삭제 등 파일 관리에서 발생하는 이벤트를 감시하는 데 사용되며 관찰 대상 객체와 이를 감시하는 옵저버 객체로 구성됩니다.
- 관찰 대상 객체는 변경 사항이 있을 때마다 옵저버 객체들에게 이를 알리며, 각각의 옵저버 객체는 이벤트에 따라 특정 작업을 수행합니다. - 예를 들어 파일이 생성될 때마다 자동 백업 기능을 구현하거나, 파일이 수정될 때마다 특정 프로그램으로 열 수 있는 기능을 구현할 수도 있습니다.
💡 UIViewController는 KVO(Key-Value Observing)를 지원하는데, 이는 객체의 특정 프로퍼티가 변경될 때 알림을 받을 수 있는 기능입니다.
- 이 기능을 이용하면 다른 객체에서 해당 뷰 컨트롤러의 프로퍼티 변경을 감지하고, 이에 따라 적절한 처리를 할 수 있습니다. - UIViewController의 observeValue 메소드는 KVO를 사용하여 프로퍼티의 변경을 감지하는 메소드입니다. 이 메소드는 다음과 같은 형태를 갖습니다.
💡 BroadCast Extenstion으로 부터 구성한 데이터를 UserDefalts에 저장을 합니다.
1. 화면 공유를 수행하면 SampleBuffer 데이터가 반복적으로 출력이 됩니다. 2. handleVideoFrameImage() 를 호출하면 SampleBuffer를 이미지 형태의 Data 타입으로 변경합니다. 3. 변경된 Data 타입을 UserDefaults 공간에 “sampleBufferData”키 값으로 저장합니다.
/**
* 방송 시작이 되고 실시간으로 화면공유 데이터를 전송합니다.
*/
override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
switch sampleBufferType{
// [CASE1] 비디오 처리case RPSampleBufferType.video:
// SampleBuffer 데이터를 이미지용 Data로 변환합니다.
self.handleVideoFrameImage(sampleBuffer: sampleBuffer)
// [CASE2] 오디오 앱 처리case RPSampleBufferType.audioApp:
break// [CASE3] 오디오 마이크 처리case RPSampleBufferType.audioMic:
break@unknowndefault:
fatalError("")
}
}
/**
* CMSampleBuffer 데이터를 이미지로 변환하여 실시간 UserDefaults 저장소에 저장하는 함수
*/
func handleVideoFrameImage(sampleBuffer: CMSampleBuffer) {
letimageBuffer= CMSampleBufferGetImageBuffer(sampleBuffer)!
letciimage= CIImage(cvPixelBuffer: imageBuffer)
letcontext= CIContext(options: nil)
letcgImage= context.createCGImage(ciimage, from: ciimage.extent)!
letimage= UIImage(cgImage: cgImage)
letimageData= UIImage.pngData(image)()
DispatchQueue.global().async {
self.sharedUserDefaults.set(imageData, forKey: "sampleBufferData") // data 타입 형태로 UserDefaults에 저장합니다.
self.sharedUserDefaults.synchronize()
}
}
💡 옵저버에 등록한 키 값을 기반으로 변경이 발생하면 observeValue() 메서드가 수행이 됩니다. - 해당 메서드는 키의 값이 변경되는 경우 수행되도록 구성하였습니다. - 그리고 전달 받은 값은 object 형태로 전달을 받는데 이를 Data 타입으로 변형하고 다시 이미지로 변경하여 최종 전달받은 값에 대해서 이미지에 출력을 합니다.
/**
* [Lifecycle] 옵저버에서 처리한 값을 반환합니다.
*/
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
guard letkeyPath= keyPath, letchange= change else { return }
// [CASE1] UserDefaults의 키 값이 "sampleBufferData" 인 경우if keyPath == "sampleBufferData" {
// [STEP1] 해당 키의 값이 변경된 경우 수행됩니다.ifletnewValue= change[.newKey] {
// [STEP2] 반환되는 값을 데이터 타입으로 파싱합니다.
let data: Data = newValue as! Data
print("New value: \\(data)")// [STEP3] 데이터를 이미지 타입의 데이터로 변경합니다.letimage= UIImage(data: data)
// [STEP4] view에 이미지를 출력합니다.
imageView.image = image
}
}
// [CASE2] 이외의 경우else {
return;
}
}