Как стать автором
Обновить

Комментарии 6

Так много вопросов к коду:

  1. enum CodingKeys у InitialCoords не нужен;

  2. Метод `init(from decoder) у InitialCoords тоже не нужен;

  3. Зачем var ymkMapView: YMKMapView!, если можно просто var ymkMapView: YMKMapView (без восклицательного знака). И потом в init до вызова super.init присвоить значение ymkMapView

  4. try! плохая практика, что будет, если придет JSON, который не будет соответствовать структуре?

  5. mapView = MapView(): каждый раз при вызове метода view() будет создаваться новый MapView, можно просто объявить let mapView = MapView()

Здравствуйте! Спасибо за замечания, учту! В свифте новичок)

Ещё резанула взгляд конвертация в JSON и обратно. NSDictionary это и есть эквивалент жсного объекта, из него можно по ключам надёргать данные и положить в свою структуру. Тогда даже Decodable не понадобится.

так-с, я скоро немножко исправлю код в статье, но есть некоторые нюансы:

1, 2) действительно, работает и без этого

3) Поменял методы init у MapView:

override init(frame: CGRect) {
  ymkMapView = YMKMapView(frame: CGRect.zero, vulkanPreferred: isSimulator())
  super.init(frame: frame)
    
  clipsToBounds = true
  addSubview(ymkMapView)
}
   
required init?(coder aDecoder: NSCoder) {
  ymkMapView = YMKMapView(frame: CGRect.zero, vulkanPreferred: isSimulator())
  super.init(coder: aDecoder)
    
  clipsToBounds = true
  addSubview(ymkMapView)
}

4) Исправил на вот такую конструкцию:

if let json = try? JSONSerialization.data(withJSONObject: initialRegion, options: []) {
  if let region: InitialCoords = try? JSONDecoder().decode(InitialCoords.self, from: json) {
    let cameraPoint = YMKPoint(latitude: region.lat, longitude: region.lon)
    let cameraPosition = YMKCameraPosition(target: cameraPoint, zoom: region.zoom, azimuth: region.azimuth, tilt: region.tilt)
    
    ymkMapView.mapWindow.map.move(with: cameraPosition, animationType: YMKAnimation(type: YMKAnimationType.smooth, duration: 0), cameraCallback: nil)
  }
}

Если схема объекта неверная, то настройки просто не применятся.

5) Убрал переменную mapView из MapViewManager, но оставил создание MapView при каждом вызове view(), потому что иначе приложение будет крашится (в рн есть основной поток (UI) и побочный поток, в котором по дефолту делаются любые действия нативного модуля). Получилось как-то так:

@objc(MapViewManager)
class MapViewManager: RCTViewManager {
  override static func requiresMainQueueSetup() -> Bool {
    true
  }
  
  override func view() -> UIView! {
    return MapView()
  }
}

Примеры кода для модуля взял тут

@movpushmov@2Grey Привет. У вас есть пример кода с полным объяснением процесса? Я пытался создать такое решение, но оно не запускается из-за различных ошибок.
заранее спасибо

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации