Использование асинхронно полученных данных в макетах Motion-Kit

Я переворачиваю геокодирование пары координат, чтобы найти город пользователя, но мне трудно ввести город в макет Motion-Kit. Какой лучший способ вписать город в планировку? Я также буду добавлять в макет другую информацию из API, так что, вероятно, возникнет та же проблема.

Существует базовый макет MK, подобный следующему:

class HomeLayout < MK::Layout

  def initialize(data)
    @city = data[:city]
    super
  end

  def layout
    add UILabel, :location
  end

  def location_style
    text @city
    color :white.uicolor
    font UIFont.fontWithName("Avenir", size: 22)
    size_to_fit
    center ['50%', 80]
  end

end

я получил @city из этого метода в HomeScreen:

def city
  loc = CLLocation.alloc.initWithLatitude App::Persistence['latitude'], longitude: App::Persistence['longitude']
  geo = CLGeocoder.new
  geo.reverseGeocodeLocation loc, completionHandler: lambda { |result, x|
    return result[0].locality
  }
  # This currently returns a CLGeocoder object, but I want it to return the city as a String.
end

я получил App::Persistence['latitude'] из в on_activate в AppDelegate, вот так:

def on_activate
  BW::Location.get_once do |result|
    if result.is_a?(CLLocation)
      App::Persistence['latitude'] = result.coordinate.latitude
      App::Persistence['longitude'] = result.coordinate.longitude
      open HomeScreen.new
    else
      LocationError.handle(result[:error])
    end
  end
end

Любая помощь будет оценена. Спасибо заранее

1 ответ

Решение

Мне бы хотелось увидеть, как вы создаете экземпляр макета, но даже без этого у меня есть предположение: вам следует подумать о поддержке fetching location сообщение, которое отклоняется, когда данные доступны.

Рабочий процесс будет выглядеть примерно так:

  • создать макет без предоставления данных о местоположении. Это начнется в состоянии "ожидания местоположения"
  • получить местоположение города, так же, как вы сейчас
  • предоставить расположение к макету, и он может анимировать изменения вида

class HomeLayout < MK::Layout def location(value) # update view locations. # you might also provide an `animate: true/false` argument, # so that you can update the UI w/out animation if the # location is available at startup end end

После этого вы можете сделать второй проход: предоставить данные о городе при запуске. Если данные доступны, вы должны быть в состоянии передать их инициализатору, как указано выше, и макет должен обходить состояние "загрузки".

Причина, по которой я рекомендую этот подход, заключается в том, что он делает контроллер более "идемпотентным". Независимо от того, предоставлены ли данные о местоположении при запуске или нет, он может обрабатывать оба случая.

Кроме того, вы сможете open HomeScreen.new прежде чем ждать get_once блок до конца.

Другие вопросы по тегам