Создание наложения MapKit Circle из нескольких записей CloudKit

Я пытался добавить новое представление карты в свое приложение, которое показывает наложение всех регионов с геозоной в моей базе данных CloudKit.

На данный момент я могу создавать булавки из каждого места с помощью следующего кода.

func fetchData() {

    let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)

    let query = CKQuery(recordType: "Collection", predicate: predicate)

    let operation = CKQueryOperation(query: query)
    operation.desiredKeys = ["Location"]

    operation.recordFetchedBlock = { (record : CKRecord) in

        self.collectionLocation = record.objectForKey("Location") as? CLLocation

        print(self.collectionLocation?.coordinate.latitude)

        self.buildBubbles()

    }

    publicDB!.addOperation(operation)

    operation.queryCompletionBlock = {(cursor, error) in

        dispatch_async(dispatch_get_main_queue()) {

            if error == nil {

            } else {

                print("error description = \(error?.description)")
            }
        }

    }

}

func buildBubbles() {

    if CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion.self) {

        let intrepidLat: CLLocationDegrees =  (self.collectionLocation?.coordinate.latitude)!

        let intrepidLong: CLLocationDegrees = (self.collectionLocation?.coordinate.longitude)!

        let title = "Item"

        let coordinate = CLLocationCoordinate2DMake(intrepidLat, intrepidLong)

        let regionRadius = 300.0

        let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: coordinate.latitude,
    longitude: coordinate.longitude), radius: regionRadius, identifier: title)

        self.locationManager.startMonitoringForRegion(region)

        let restaurantAnnotation = MKPointAnnotation()

        restaurantAnnotation.coordinate = coordinate;

        restaurantAnnotation.title = "\(title)"

        self.mapView.addAnnotation(restaurantAnnotation)

        // Overlay code goes here 

    }

    else {

        print("System can't track regions")

    }

}

Но когда я добавляю наложение:

let circle = MKCircle(centerCoordinate: coordinate, radius: regionRadius)

self.mapView.addOverlay(circle)

Приложение завершается с ошибкой:

«Это приложение модифицирует движок автомакета из фонового потока, что может привести к повреждению движка и странным сбоям. Это вызовет исключение в будущем выпуске».

Я предполагаю, что я слишком много делаю внутри фонового потока, но когда я перемещаю функцию «buildBubbles» в основную очередь, она добавляет наложение круга, но добавляет только одно из местоположений на карту.

Спасибо, что нашли время, чтобы посмотреть, я был бы очень признателен за любую помощь.


person Tom Wicks    schedule 11.06.2016    source источник


Ответы (2)


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

person Feldur    schedule 11.06.2016

Я сделал, как предложил Фелдур, и создал массив из данных CloudKit, а затем переместил настройку MapKit из фонового потока.

func fetchBubble() {

    let query = CKQuery(recordType: "Collection", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))

    publicDB!.performQuery(query, inZoneWithID: nil) { results, error in

        if error == nil {

            for collection in results! {

                let collectionLocation = collection.valueForKey("Location") as? CLLocation

                let collectionName = collection.valueForKey("Name") as! String

                dispatch_async(dispatch_get_main_queue(), { () -> Void in

                    if CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion.self) {

                        let intrepidLat: CLLocationDegrees =  (collectionLocation?.coordinate.latitude)!

                        let intrepidLong: CLLocationDegrees = (collectionLocation?.coordinate.longitude)!

                        let title = collectionName

                        let coordinate = CLLocationCoordinate2DMake(intrepidLat, intrepidLong)

                        let regionRadius = 50.0

                        let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: coordinate.latitude,
                            longitude: coordinate.longitude), radius: regionRadius, identifier: title)

                        self.locationManager.startMonitoringForRegion(region)

                        let restaurantAnnotation = MKPointAnnotation()

                        self.mapView.addAnnotation(restaurantAnnotation)

                        restaurantAnnotation.coordinate = coordinate

                        let circle = MKCircle(centerCoordinate: coordinate, radius: regionRadius)

                        self.mapView.addOverlay(circle)

                        self.numberOfObjectsInMyArray()

                    }

                    else {

                        print("System can't track regions")

                    }


                })

            }

        }

        else {

            print(error)

        }

    }

}
person Tom Wicks    schedule 12.06.2016