결합 및 CoreLocation, 2부 - 이벤트 수신 및 처리
ObservableObject에서 이벤트 수신 및 처리
우리
ObservableObject
는 CoreLocation 게시자의 말을 듣는 동안 SwiftUI를 업데이트하기 위해 몇 가지 작업을 수행해야 합니다. 우선 다음을 수행해야 합니다.이를 염두에 두고 보면 다음과 같습니다.
class CoreLocationObject: ObservableObject {
@Published var authorizationStatus = CLAuthorizationStatus.notDetermined
@Published var location: CLLocation?
let manager: CLLocationManager
let publicist: CLLocationManagerCombineDelegate
var cancellables = [AnyCancellable]()
init() {
let manager = CLLocationManager()
let publicist = CLLocationManagerPublicist()
manager.delegate = publicist
self.manager = manager
self.publicist = publicist
let authorizationPublisher = publicist.authorizationPublisher()
let locationPublisher = publicist.locationPublisher()
...
다음으로 게시자로부터 이벤트를 수신하고 처리하는 작업을 실제로 처리할 수 있습니다. 먼저
CLAuthorizationStatus
를 다루겠습니다.Sink 및 Assign으로 이벤트 수신 및 처리
CLAuthorizationStatus까지 인증 상태가 변경될 때 수행해야 하는 두 가지 작업이 있습니다.
CLAuthorizationStatus
가 유효한 경우 트리거 위치 업데이트CLAuthorizationStatus
을 @Published CLAuthorizationStatus
속성authorizationStatus
에 할당메서드 호출에 싱크 사용
먼저 해당 업데이트를 시작하는 메서드를 만들어 위치 업데이트 트리거를 처리해 보겠습니다.
class CoreLocationObject: ObservableObject {
@Published var authorizationStatus = CLAuthorizationStatus.notDetermined
@Published var location: CLLocation?
let manager: CLLocationManager
...
func beginUpdates(_ authorizationStatus: CLAuthorizationStatus) {
if authorizationStatus == .authorizedAlways || authorizationStatus == .authorizedWhenInUse {
manager.startUpdatingLocation()
}
}
}
우리의
beginUpdate
메서드는 CLAuthorizedStatus
에서 오는 대로 Publisher
를 받아들입니다. 결과적으로 상태가 위치 업데이트를 허용하는 경우 startUpdatingLocation
에서 CLLocationManager
를 호출합니다.이를 염두에 두고
authorizationPublisher
를 beginUpdates
메서드에 연결해 보겠습니다.class CoreLocationObject: ObservableObject {
...
var cancellables = [AnyCancellable]()
init() {
let publicist = CLLocationManagerPublicist()
...
let authorizationPublisher = publicist.authorizationPublisher()
// trigger an update when authorization changes
authorizationPublisher
.sink(receiveValue: beginUpdates)
.store(in: &cancellables)
...
이 경우
sink
를 사용하고 새 메서드에 대한 참조를 전달합니다. sink
는 Cancellable
를 반환하며 제대로 처리되었는지 확인해야 합니다. 따라서 .store
를 사용하여 Cancellable
가 cancelables\
Array
에 올바르게 저장되었는지 확인합니다.이제 권한이 부여되면 위치 업데이트를 올바르게 시작해야 합니다. 다음으로
CLAuthorizationStatus
속성에 @Published
를 저장하여 SwiftUI 보기에 표시할 수 있도록 합니다.Assign으로 이벤트 수신 및 처리(iOS 13 및 iOS 14)
UIKit을 사용하는 iOS 개발자로서 가장 먼저 배우는 것 중 하나는 메인 디스패치 큐에서 UI 업데이트를 만드는 것의 중요성입니다. 즉, 이 작업을 수행하지 않으면 잘못된 UI 업데이트가 발생하거나 앱이 충돌할 수도 있습니다. 마찬가지로 SwiftUI에서는 메인 디스패치 큐에서 UI 업데이트를 지정해야 합니다. 따라서
receive
를 사용하여 업데이트가 기본DispatchQueue
에 있는지 확인할 수 있습니다....
authorizationPublisher
// since this is used in the UI,
// it needs to be on the main DispatchQueue
.receive(on: DispatchQueue.main)
...
할당하는 한 몇 가지 옵션이 있습니다.
sink
를 사용하여 게시된 속성에 값을 할당할 수 있습니다....
authorizationPublisher
// since this is used in the UI,
// it needs to be on the main DispatchQueue
.receive(on: DispatchQueue.main)
.sink(receiveValue: {
self.authorizationStatus = $0
})
...
그러나
assign
를 사용하여 이를 단순화할 수 있습니다....
authorizationPublisher
// since this is used in the UI,
// it needs to be on the main DispatchQueue
.receive(on: DispatchQueue.main)
// store the value in the authorizationStatus property
.assign(to: &$authorizationStatus)
...
This new assign available in all the new 2020 OSes (iOS 14, macOS 11, watchOS 7, etc…)을 사용하면 &(in-out 매개변수용) 및 $(게시자용)를 사용하여 게시자에게 직접 값을 할당할 수 있습니다.
또한 no
Cancellable
가 반환되므로 저장할 필요가 없습니다.이벤트 수신 및 처리 시 싱크 대 할당
올바른 방법을 선택하는 것은 어려울 수 있지만 다음은 몇 가지 지침입니다.
sink
를 사용하십시오.assign
를 사용하십시오..receive(on: DispatchQueue.main)
을 사용합니다.sink
또는 2019 version of assign
(즉, assign(to:on:)
)를 사용할 때 결과 Cancellable
를 using .store
으로 저장하십시오.AnyCancellable
속성이 있는 경우 Set
or Array
for storing the Cancellables
사용을 고려하십시오.다음 블로그 게시물에서는
CLLocation
를 더 유용한 것으로 변환할 때 Combine의 고급 함수형 프로그래밍 기술을 다룰 것입니다.
Reference
이 문제에 관하여(결합 및 CoreLocation, 2부 - 이벤트 수신 및 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/leogdion/combine-corelocation-part-2-receiving-handling-events-3jgb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)