func addViews() {
//여기에서 그릴 View(KakaoMap, Roadview)들을 추가한다.
let defaultPosition: MapPoint = MapPoint(longitude: 126.9137, latitude: 37.5491)
//지도(KakaoMap)를 그리기 위한 viewInfo를 생성
let mapviewInfo: MapviewInfo = MapviewInfo(viewName: "mapview", viewInfoName: "map", defaultPosition: defaultPosition, defaultLevel: 17)
mapContainer = mapView?.mapView
print("1.맵 컨테이너 생성 성공")
mapController = KMController(viewContainer: mapContainer!)
mapController!.delegate = self
print("2.mapController 초기화 성공")
mapController?.prepareEngine()
print("3.prepareEngine 성공")
⭐️DispatchQueue.main.async {
self.mapController?.addView(mapviewInfo)
}
print("4단계 뷰 로드 완료")
// ❗️
}
DispatchQueue를 쓰기 전, 아예 맵 뷰가 로드되지 않아서 이에 대해 알아봄 > 메인스레드에서 처리하게 하라 > DispatchQueue를 쓰라는 말인가?
디스패치큐를 사용하자 최초로 맵이 로드 되었다.
그러나 이것 저것 기능을 추가하고 어디서부터 잘못됐는지 모르겠고 프린트를 찍어보았다. 당연한 얘기지만 비동기처리된 관계로 순서대로 불러오지 않고 초기화와 뷰 로드와 호출 순서를 지키지않고 이상하게 처리되기 시작
그래서 5번 실행하면 3번은 맵이 로드되고 한두번은 안보이는 복잡한 상황이되었다.
카카오맵의 소스코드를 이해하지 못한 관계로 다른 쪽에서 addViews메서드를 반복하고 있고 이로인해 맵과 관련된 것들이 다시 초기화하고 있지않았나 추측하고 있다.
해결 방법은 플래그를 세워서 addViews를 한 번만 실행되도록 확실한 처리를 하는 것이다.
private var isMapInit = false
초기값이 false인 변수를 하나 만들어서 맵 초기화 여부를 추적하게 한다.
func addViews() {
guard !isMapInit else { return }
isMapInit = true
}
가드문의 inMapInit이 false일 때만 아래 코드로 넘어가게한다.
초기화 코드가 실행된 후에는 true로 설정되게해서 다시 초기화 코드를 실행되지 않도록 한다.
하지만 이것이 addview를 비순수함수로 만들어서 별로 좋은 방법이라고 할 수 없을 것 같다. 시간에 쫓겨서 일단 기워놓았는데 내일 더 알아봐야겠다.
private var isMapInit = false
func addViews() {
guard !isMapInit else { return }
//여기에서 그릴 View(KakaoMap, Roadview)들을 추가한다.
let defaultPosition: MapPoint = MapPoint(longitude: 126.9137, latitude: 37.5491)
//지도(KakaoMap)를 그리기 위한 viewInfo를 생성
let mapviewInfo: MapviewInfo = MapviewInfo(viewName: "mapview", viewInfoName: "map", defaultPosition: defaultPosition, defaultLevel: 17)
mapContainer = mapView?.mapView
print("1.맵 컨테이너 생성 성공")
mapController = KMController(viewContainer: mapContainer!)
mapController!.delegate = self
print("2.mapController 초기화 성공")
mapController?.prepareEngine()
print("3.prepareEngine 성공")
⭐️DispatchQueue.main.async {
self.mapController?.addView(mapviewInfo)
}
print("4단계 뷰 로드 완료")
// ❗️
isMapInit = true
}