WedX - журнал о программировании и компьютерных науках

Кэшированные плитки не отображаются — Mapbox IOS SDK

Я новичок в программировании для iOS и создаю свое приложение на Swift для iOS8, а также внедряю Mapbox-ios-sdk, поскольку хочу, чтобы мой пользователь мог загружать автономные области карты.

Мне удалось загрузить автономные области карты в кеш, однако кажется, что к кешу нет доступа, когда я отключаю Wi-Fi и сотовые данные. Тайлы карты не появляются. Отображаются только фрагменты карты, которые были автоматически кэшированы.

Вижу, что тайлы загружаются (RMTileCache.db растет, вызываются методы RMTileCacheBackgroundDelegate didBeginBackgroundCacheWithCount, didBackgroundCacheTile и tileCacheDidFinishBackgroundCache) и при просмотре непосредственно в файле db также вижу, что загружены правильные тайлы.

Но когда я отключаю данные Wi-Fi и сотовой связи, фрагменты карты не загружаются на экран. Я пробовал несколько вариантов с добавлением дополнительных кэшей RMDatabase и т. д., но ничего не работает. Я надеюсь, что кто-то там столкнулся с той же проблемой и может помочь мне.

Мой код примерно основан на этом фрагменте здесь: https://mapbox.com/mapbox-ios-sdk/#tile_caching__class

Соответствующие переменные уровня класса:

var tileSource: RMMapboxSource = RMMapboxSource()
@IBOutlet var mapView: RMMapView!

viewDidLoad:

    override func viewDidLoad() {
    super.viewDidLoad()

    let fullPath: String = NSBundle.mainBundle().pathForResource("mapbox", ofType: "json")!
    var errorInFullPath:NSErrorPointer? = NSErrorPointer()
    let tileJSON: String? = String(contentsOfFile: fullPath, encoding:NSUTF8StringEncoding, error: errorInFullPath!)
    tileSource = RMMapboxSource(tileJSON: tileJSON)

    initializeMap()

}

Инициализация карты:

func initializeMap() {
    mapView = RMMapView(frame: self.view.bounds)
    mapView.tileSource = tileSource
    tileSource.cacheable = true
    mapView.adjustTilesForRetinaDisplay = true
    mapView.userInteractionEnabled = true
    mapView.zoom = 9
    self.view.addSubview(mapView)
    mapView.delegate = self
}

Операция загрузки:

func startDownload() {
    mapView.tileCache.backgroundCacheDelegate = self
    mapView.tileCache.beginBackgroundCacheForTileSource(tileSource, southWest: sw, northEast: ne, minZoom: 1, maxZoom: zoomLevel)
}

sw, ne и zoomLevel были определены в другом месте кода, и их значения хороши, когда я распечатываю их непосредственно перед командой beginBackgroundCacheForTileSource.

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

Заранее спасибо!

06.11.2014

Ответы:


1

Итак, у меня все заработало благодаря подсказке incanus. Оказывается, это были две проблемы, которые затрудняли анализ и поиск основной причины.

1-я проблема заключалась в том, что у меня в viewDidLoad происходили некоторые макеты, которые каким-то образом препятствовали загрузке кэшированных фрагментов карты.

Вторая проблема заключалась в том, что область, которую я загружал, немного отличалась от области, которую я загружал. Так что мне просто нужно настроить метод pixelToCoordinate RMMapView, который я использую, чтобы сделать это правильно.

Для тех из вас, кто заинтересован. Я создал отдельный чистый файл Swift без какой-либо разметки, просто чтобы проследить за комментарием Инкануса. Это сработало для меня!

Спасибо Инканусу. Надеюсь, что кто-то еще найдет это полезным.

import UIKit

class ViewOfflineMapAreaViewController: UIViewController, RMMapViewDelegate {

var tileSource: RMMapboxSource = RMMapboxSource()
@IBOutlet var mapView: RMMapView!

override func viewDidLoad() {
    super.viewDidLoad()

    let fullPath: String = NSBundle.mainBundle().pathForResource("mapbox", ofType: "json")!
    var errorInFullPath:NSErrorPointer? = NSErrorPointer()
    let tileJSON: String? = String(contentsOfFile: fullPath, encoding:NSUTF8StringEncoding, error: errorInFullPath!)
    tileSource = RMMapboxSource(tileJSON: tileJSON)
    tileSource.retryCount = 3
    initializeMap()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func initializeMap() {
    mapView = RMMapView(frame: self.view.bounds)
    mapView.tileSource = tileSource
    tileSource.cacheable = true
    mapView.adjustTilesForRetinaDisplay = true
    mapView.userInteractionEnabled = true
    mapView.zoom = 9
    mapView.delegate = self


    //These two lines are just to resize the mapView upon device rotation   
    mapView.setTranslatesAutoresizingMaskIntoConstraints(true)
    mapView.autoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth
}

override func viewDidAppear(animated: Bool) {
    self.view.addSubview(mapView)
}

}
07.11.2014

2

Вы сохраняете TileJSON локально и используете его для создания экземпляров, что необходимо, когда вы работаете в автономном режиме. Но я думаю, что ваша проблема может быть в том, чтобы сделать макет во время -viewDidLoad. Попробуйте это в -viewWillAppear: или более поздней версии, и я думаю, вы увидите другие результаты.

06.11.2014
  • Я попытался, как вы предложили, однако не повезло. На самом деле это очень странно, когда я использую код для просмотраWillAppear, я получаю те же результаты (автономные плитки не загружаются из кеша). Когда я перемещаю его в viewDidAppear (и я в сети), я внезапно получаю не свои собственные стилизованные фрагменты карты, а стандартные фрагменты Mapbox с примером водяного знака. Кажется мне несвязанным, но вы никогда не знаете. Просто чтобы быть уверенным ... когда я не в сети, я вижу, что тайлы пытаются загрузить из кеша, потому что карта заменяется стандартной сеткой с серыми линиями, когда я увеличиваю масштаб. 07.11.2014
  • Извините... Я неправильно вас понял. Я перемещал код tileJSON в viewWillAppear и viewDidAppear. Затем я понял, что вы имели в виду перемещение всего материала макета из viewDidLoad в viewWill/DidAppear. Я пробовал это также. Я даже закомментировал все элементы макета, кроме самого mapView, но все равно. 07.11.2014
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]