从多个CloudKit记录

时间:2016-06-11 13:35:36

标签: ios swift asynchronous mapkit cloudkit

我一直在尝试向我的应用添加新的地图视图,该视图显示CloudKit数据库中所有Geofenced区域的叠加层。

目前,我可以使用以下代码从每个位置创建引脚。

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”函数移动到主队列时,它会添加圆形叠加层,但只会将其中一个位置添加到地图中。

感谢您花时间看我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:0)

您进入bubbles功能的界面仅提供一个位置。尝试更改界面,例如更改为阵列,然后查看所获得的内容。您还需要担心如何实际同步一个

答案 1 :(得分:0)

我做了Feldur建议并从CloudKit Data创建了一个数组,然后从后台线程移动了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)

        }

    }

}