2016-09-04 3 views
0

Я получаю BAD_EXC_ACCESS на линии. Причина заключается в том, что «Попытка загрузить представление контроллера представления при его освобождении не допускается и может привести к неопределенному поведению».BAD_EXC_ACCESS для попытки загрузить контроллер просмотра при освобождении

func drawLocations(loc: CLLocation) 
    { 
     let center = CLLocationCoordinate2D(latitude: loc.coordinate.latitude, longitude: loc.coordinate.longitude) 
     let lat: CLLocationDegrees = center.latitude 
     let long: CLLocationDegrees = center.longitude 
     var points = [CLLocationCoordinate2DMake(lat,long),CLLocationCoordinate2DMake(lat,long),CLLocationCoordinate2DMake(lat,long),CLLocationCoordinate2DMake(lat,long)] 
     let polygon = MKPolygon(coordinates: &points, count: points.count) 
     mapView.addOverlay(polygon)//where I get error 
    } 
func loadLocation(completion: (error:NSError?, records:[CKRecord]?) -> Void) 
    { 
     let query = CKQuery(recordType: "Location", predicate: NSPredicate(value: true)) 
     CKContainer.defaultContainer().publicCloudDatabase.performQuery(query, inZoneWithID: nil){ 
      (records, error) in 
      if error != nil { 
       print("error fetching locations: \(error)") 
       completion(error: error, records: nil) 
      } else { 
       print("found locations: \(records)") 
       print("found locations") 
       completion(error: nil, records: records) 
       guard let records = records else { 
        return 
       } 
       for(var i = 0; i<records.count; i += 1) 
       { 
        self.drawLocations(records[i]["location"] as! CLLocation)//where I call function 
       } 
      } 
     } 
    } 
+0

В моей locationManager, что называется в viewDidLoad @LeoDabus – Steve

+0

Там никакой разницы @LeoDabus – Steve

+0

сверху класса вне любой функции @LeoDabus – Steve

ответ

1

Завершение блока performQuery «должен быть способен работать на любом потоке из приложения» (как описано в документации). Вы вызываете addOverlay, который является функцией пользовательского интерфейса, и поэтому вызывается в основной очереди. Вам необходимо отправить этот метод в основную очередь.

Боковая записка, не имеющая отношения к вопросу: for(var i = 0; i<records.count; i += 1) гораздо лучше написана как for record in records. Синтаксис C-стиля устарел.