Использование асинхронно полученных данных в макетах 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
блок до конца.