My app working with Geojson
file. I use MapBox SDK to add MGLPolyline
to map. But the problem is my file too large, so that the app crash and got the e
I had some problems to test your project with pods, so I've directly remove pods and use Mapbox framework directly from here.
I've no problems for the first launches both in simulator and real iPad (my iPad 4 gen.) but after a while I've your same error, so I've correct this code with:
DispatchQueue.main.async {
// weaked reference to self to prevent retain cycle
[weak self] in
guard let strongSelf = self else { return }
strongSelf.mapboxView.addAnnotation(line)
}
because unowned
it's not enough to prevent retain cycle.
Now seems it works well.
Hope it helps.
P.S. (I've used the latest available Mapbox v3.3.6)
Update (after comments):
So, first of all I make all my test with Mapbox framework inserted as "embedded framework".
I've make some corrections to your github project only to ViewController.swift
to avoid retain cycles.
P.S. I remove comments lines to make easy reading:
func drawPolyline() {
DispatchQueue.global(qos: .background).async {
[weak self] in
guard let strongSelf = self else { return }
let jsonPath = Bundle.main.path(forResource: "KMLMAPNew", ofType: "json")
let jsonData = NSData(contentsOfFile: jsonPath!)
do {
guard let jsonDict = try JSONSerialization.jsonObject(with: jsonData! as Data, options: []) as? Dictionary, let features = jsonDict["features"] as? Array else{return}
for feature in features {
guard let feature = feature as? Dictionary, let geometry = feature["geometry"] as? Dictionary else{ continue }
if geometry["type"] as? String == "LineString" {
var coordinates: [CLLocationCoordinate2D] = []
if let locations = geometry["coordinates"] as? Array {
for location in locations {
if let location = location as? Array{
let coordinate = CLLocationCoordinate2DMake(location[1].doubleValue, location[0].doubleValue)
coordinates.append(coordinate)
}
}
}
let line = MGLPolyline(coordinates: &coordinates, count: UInt(coordinates.count))
line.title = "Crema to Council Crest"
print(feature) // Added this line just for debug to see the flow..
DispatchQueue.main.async {
strongSelf.mapboxView.addAnnotation(line)
}
}
}
}
catch
{
print("GeoJSON parsing failed")
}
}
}
func newWay(){
DispatchQueue.global(qos: .background).async {
[weak self] in
guard let strongSelf = self else { return }
let jsonPath = Bundle.main.path(forResource: "KMLMAPNew", ofType: "json")
let jsonData = NSData(contentsOfFile: jsonPath!)
do {
if let jsonDict = try JSONSerialization.jsonObject(with: jsonData! as Data, options: []) as? Dictionary {
if let features = jsonDict["features"] as? Array {
let chunks = stride(from: 0, to: features.count, by: 2).map {
Array(features[$0..])
}
}
}
}
catch
{
print("GeoJSON parsing failed")
}
}
}
func drawSmallListObj(list: [Dictionary]){
for obj in list{
if let feature = obj as? Dictionary {
if let geometry = feature["geometry"] as? Dictionary {
if geometry["type"] as? String == "LineString" {
var coordinates: [CLLocationCoordinate2D] = []
if let locations = geometry["coordinates"] as? Array {
for location in locations {
if let location = location as? Array{
let coordinate = CLLocationCoordinate2DMake(location[1].doubleValue, location[0].doubleValue)
coordinates.append(coordinate)
}
}
}
let line = MGLPolyline(coordinates: &coordinates, count: UInt(coordinates.count))
line.title = "Crema to Council Crest"
DispatchQueue.main.async {
[weak self] in
guard let strongSelf = self else { return }
strongSelf.mapboxView.addAnnotation(line)
}
}
}
}
}
}