dispatch_async(self._queue, {
// Remove old stops
for (var i = 0; i < self.activeStops.count; i++) {
if (!MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(self.activeStops[i].coordinate))) {
self.mapView.removeAnnotation(self.activeStops[i])
self.activeStops.removeAtIndex(i)
}
}
// Add new stops
for (var i = 0; i < self.busStops.count; i++) {
if (MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(self.busStops[i].position))) {
let stop: StopAnnotation! = StopAnnotation()
stop.setCoordinate(self.busStops[i].position)
stop.bearing = self.busStops[i].bearing
stop.name = self.busStops[i].name
stop.lines = self.busStops[i].lines
stop.atcocode = self.busStops[i].atcocode
self.activeStops.append(stop)
}
}
// Add new stops to map
dispatch_async(self._queue, {
self.mapView.addAnnotations(self.activeStops)
self.isUpdatingMap = false
})
})
self.nearestStopsTable.reloadData()
我想做的以及我在上面的代码中尝试做的是删除在屏幕上不再可见的公交车站,然后继续添加新的公交车站。
问题出在我当前的方法上,我在枚举数据时它正在变异,因此它会引发错误。
我假设这是因为我正在循环访问activeStops
数组时从{{1}}数组中删除。
如何更改我的代码,以便它不会产生此错误?
答案 0 :(得分:1)
你的问题在这里:
for (var i = 0; i < self.activeStops.count; i++) {
if (!MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(self.activeStops[i].coordinate))) {
self.mapView.removeAnnotation(self.activeStops[i])
self.activeStops.removeAtIndex(i)
}
}
您在迭代过程中突变了activateStops
您可以执行以下操作,而不是在迭代时删除对象:
var indicesToRemove : NSMutableIndexSet = NSMutableIndexSet()
for (var i = 0; i < self.activeStops.count; i++) {
if (!MKMapRectContainsPoint(mapView.visibleMapRect, MKMapPointForCoordinate(self.activeStops[i].coordinate))) {
self.mapView.removeAnnotation(self.activeStops[i])
indicesToRemove.addIndex(i);
}
}
self.activeStops.removeObjectsAtIndexes(indicesToRemove)